2021-05-24 雑談 VBAが初心者向け言語だと思われている理由考察

17
ほえほえ@スプシマン @hoehoe1234

本来、言語仕様から読み取れない複雑さ、難解さ、評価の曖昧さは排除されるべきであるが、VBAでは逆説的にこれが「初心者にとっての使いやすさ」をもたらしている。cells(i,j)など良い例だろう。

2021-05-24 21:52:03
ほえほえ@スプシマン @hoehoe1234

これは無名のcellsはシートモジュールでなければapplicationに関連付けられて、activeworksheetに関連ずけられ、obj.Rangeでは(1,1)が"A1"になるようにシートを対象とした場合にはcellsは全体を示すので結果的に見えているA1が実際のA1のなり、cellsはセル単位にスライスされているのでデフォルト

2021-05-24 21:54:13
ほえほえ@スプシマン @hoehoe1234

プロパティにより値コンテキストでの評価が要求されてcells.[_default]経由でitem(i,j)がデフォルトプロパティ(これがまた沼)としてよびだされ、結果、cells.item(i,j)が特定の1セルオブジェクトになり、かつ、値コンテキストが要求されているので

2021-05-24 21:55:44
ほえほえ@スプシマン @hoehoe1234

cells.[_default]->item(i,j)->1セルのオブジェクトが指定される->値コンテキストなのでこの1セルレンジの値が[_defalut]()でよびだされ、それは.Valueにディスパッティされるので、結果、cells(i,j)はそのセルの値を取得する。という仕組みが裏に隠れている。

2021-05-24 21:57:33
ほえほえ@スプシマン @hoehoe1234

x = cells(i,j) cells.[_defalut](i,j)->item(i,j)->[_defalut]().value という展開がなされている(と思われる) これを理解するまでには時間がかかったが、初心者でも書籍、サイトにあるように単に x = cells(i,j)で動くし、それで十分。これがまさにMSが設計で狙ったとこだろうなという感がある。

2021-05-24 22:00:07
ほえほえ@スプシマン @hoehoe1234

VBAではこのようなトリックが至るところであり、その中核をなすのがデフォルトプロパティだ。なので中級になるにはデフォルトプロパティとバリアントを(使う使わないは別にして)理解しなければいけない。そしてそれは割と難しい。

2021-05-24 22:01:09
ほえほえ@スプシマン @hoehoe1234

そうなのです。VBAでは難しさが「隠蔽」されているのです。これは言語の実装としては1つの理想と言えるとおもいます。副作用は初級者からの脱却が難しくなることです。なぜなら初級者であってもとりあえず(MSの狙い通り)組めるからです。このあたりは功罪ともどもだと思います。

2021-05-24 22:02:40