VBAはかなりクセがある

オブジェクトの操作


セルやシートの操作は基本的にオブジェクトを直接操作できる。しかし、グラフなど一部のオブジェクトではオブジェクトをActivateもしくはSelectした状態でないと操作できずエラーになる。例えば、ChartObjectのChartAreaオブジェクトはActiveChartでないと操作できない。但し、Chartオブジェクトを仲介すれば一部の操作は可能。


つまり、オブジェクトや操作ごとにActivateすべきかどうかを知らないとコードが書けない。この区別はマクロレコードではもちろん分からないし、書籍にもほとんど書かれていない。実際テストしてみるしかないかもしれない。VBAは使い勝手が良くない気がするが、仕事でもExcelは使えそうなので少し研究してみるつもり。

VBATMTOWTDI


VBAPerlと同じでThere's More Than One Way To Do It.である。研究するにも大変そうな気がする。

変数の宣言


Dim i, j, k As Integer は、iとjは型を省略、kは整数型を指定となる。つまり、i、jはVariant型となる。i、j、kを全て整数にしたいなら、Dim i As Integer, j As Integer, k As Integerと書かなければならない。

ワークシート関数


VBAのコード内で、例えばWorksheetFunction.Sumなどのワークシート関数を使うとかなり高速化されると書いてある。VBAのコードを書くということはExcelを自動化およびカスタマイズするということでカスタマイズの基本としてアプリの機能を最大限利用することがポイントとなる。そのためにはアプリに精通していないといけない訳だが、なぜアプリの機能を使うと早いかと言えば、中身が速いC言語で書かれている、機能として存在するので最適化されている可能性が高いということが挙げられる。

大量のセルに値を入れる


9月7日の自分の日記で大量のセルに値を入れる操作が非常に遅いと書いたが、複数のセルに一括で値を入れるという処理があることが判明。配列を使用するみたいだが、かなり高速らしい。配列でメモリに落とせてVBAで好きに制御できるので応用性もかなり広そう。csvファイルのデータをセルに落とす場合に、新規にワークブックをOpenしてデータをコピーして回避していたのだが、この方法でいけるかも。