- hoehoe1234
- 10166
- 32
- 1
- 114
本来、言語仕様から読み取れない複雑さ、難解さ、評価の曖昧さは排除されるべきであるが、VBAでは逆説的にこれが「初心者にとっての使いやすさ」をもたらしている。cells(i,j)など良い例だろう。
2021-05-24 21:52:03これは無名のcellsはシートモジュールでなければapplicationに関連付けられて、activeworksheetに関連ずけられ、obj.Rangeでは(1,1)が"A1"になるようにシートを対象とした場合にはcellsは全体を示すので結果的に見えているA1が実際のA1のなり、cellsはセル単位にスライスされているのでデフォルト
2021-05-24 21:54:13プロパティにより値コンテキストでの評価が要求されてcells.[_default]経由でitem(i,j)がデフォルトプロパティ(これがまた沼)としてよびだされ、結果、cells.item(i,j)が特定の1セルオブジェクトになり、かつ、値コンテキストが要求されているので
2021-05-24 21:55:44cells.[_default]->item(i,j)->1セルのオブジェクトが指定される->値コンテキストなのでこの1セルレンジの値が[_defalut]()でよびだされ、それは.Valueにディスパッティされるので、結果、cells(i,j)はそのセルの値を取得する。という仕組みが裏に隠れている。
2021-05-24 21:57:33x = cells(i,j) cells.[_defalut](i,j)->item(i,j)->[_defalut]().value という展開がなされている(と思われる) これを理解するまでには時間がかかったが、初心者でも書籍、サイトにあるように単に x = cells(i,j)で動くし、それで十分。これがまさにMSが設計で狙ったとこだろうなという感がある。
2021-05-24 22:00:07VBAではこのようなトリックが至るところであり、その中核をなすのがデフォルトプロパティだ。なので中級になるにはデフォルトプロパティとバリアントを(使う使わないは別にして)理解しなければいけない。そしてそれは割と難しい。
2021-05-24 22:01:09そうなのです。VBAでは難しさが「隠蔽」されているのです。これは言語の実装としては1つの理想と言えるとおもいます。副作用は初級者からの脱却が難しくなることです。なぜなら初級者であってもとりあえず(MSの狙い通り)組めるからです。このあたりは功罪ともどもだと思います。
2021-05-24 22:02:40