いつも半年ごとぐらいに触っていてあまり知識が蓄積しないので(汗)これを機につまづいたところをちょっとメモ。
基本
基本的な変数の代入や条件分岐、ループなどはあまり迷わないのでちょっと省略させていただきます。主にプロシージャ関連について。
ExcelVBAでは基本的にプロシージャという単位で処理を呼び出します。プロシージャの塊がモジュールです。
JavaやPHPでたとえるとプロシージャ=メソッド、モジュール=クラスみたいなものっぽいです。
また変数の定義はDim 変数名 as 型で表記。通常通り、データをいれてあげればOKですが、オブジェクト(よく使いそうだなーと思うのはコレクション)は動きが若干異なり、Set コレクション = new Collectionが必要になります。
ちなみにすべてのプロシージャの上に変数を置くとグローバルな変数(or 定数になります。)
1 2 3 4 5 6 7 8 9 10 11 |
'定数の定義方法 Const AAA as String = '' Sub SamplePro() Dim hoge As String Dim foo As Collection Set foo = new Collection End Sub |
ちなみに外部からプロシージャを呼び出したいときは下記のようにCallをつけて呼び出します。※つけなくても呼べるようですがわかりやすさのためにつけたほうがいいようです。
呼び出される側は変数を定義し、値渡しか参照渡しかを定義できます。
1 2 3 4 5 6 7 8 9 |
Sub SamplePro() Call SamplePro2("aaa"); End Sub Sub SamplePro2(ByVal str As String) 'ByValは値渡し、ByRefは参照渡しのようです End Sub |
ちなみに戻り値がほしい場合はモジュールをFunctionプロシージャにする必要があります。
またメソッドの最後にプロシージャの名前 = 対象の変数としなければいけません。またオブジェクトの場合は戻り値を取得するときもSet ~というメソッドが必要になります。
オブジェクトでなければSetという文字は必要ありません。
1 2 3 4 5 6 7 8 |
Sub SamplePro Set str2 = Call Func1("aaaa") End Sub Function Func1(ByVal str As String) As Collection Func1 = 代入したいデータ End Function |
メモ
- 開発画面でモジュールの部分でカーソルが当たっているときに実行を押すとその部分のモジュールのテストが始まる。モジュールごとにテストができる点はかなりありがたいですね。
- まだあまり使っていませんが、ブレークポイントを使ったステップ実行やウォッチウィンドウ(特定の変数を監視して値を出力してくれる)はデバッグにかなり使えそうです。
- オブジェクトの使い方にかなり癖があり、ここが結構ハマりました。ここは最初、ちょっと難所かと思います。
- ちなみにデバッグは直接Cellに出してあげてもいいですが、Debug.Printを使ってイミディエイトウィンドウを使っても観ることができます。
参考リンク
昨日までJavaJavaしてた人がいきなりExcelのVBAを実装する羽目になったときのためのメモ
タイトルからはわかりにくいですが、まとめてきな記事で必要なことがほぼ網羅されてます。