- Excel は SUM くらいしかまともに使ってなかったけど、ほかの人が作ったシートはいろいろ自動化されてて便利なので、あんなのを気軽に作れるようになりたい。
- こちとらプログラマなんで、VBA マクロの起動とデバッグの仕方さえ分かればあとはどうとでもできるはず?
Excel のオプション設定
- ファイル > オプション > リボンのユーザー設定 > 右側の メイン タブ のリストの中の 開発 がチェックされていなければチェック。
これでリボンに 開発 が追加される。まずこれを有効にしないと VBA 関連の機能が何も使えない。
新規ブックを作ったらやること
拡張子が .xlsx のブックではマクロを動かせないので、.xlsm(Execl マクロ有効ブック)で保存しなおす。
開発 > Visual Basic で VBA ウインドウを出し、そのウインドウで 挿入 > 標準モジュール をすると
Module1
が作られてコードエディタが開く。これで VBA マクロを書く準備完了。
シート上のボタンを押したら VBA マクロが動くようにしてみる
VBA のウインドウの標準モジュールのコードエディタで、引数なしの Sub プロシージャ を記述。例えば以下。
Sub TestMacro() MsgBox "はじめるよ!" End Sub
マクロを起動するボタンを作る。
引数ありの Sub プロシージャや Function はマクロ名のリストには表示されない。引数ありのプロシージャを強引に起動する事もできるが よろしくなさそう。
Excel のウインドウで 開発 > 挿入 > フォームコントロール の ボタン を選択。シート上のボタンを作りたい場所を矩形選択するとボタンが作成され、起動するマクロを登録できるので、上で作成した Sub プロシージャを選択。
ボタンが選択されてる状態を一旦解除してからボタンを押すとマクロが実行される。この例ならメッセージボックスが出る。
VBA のデバッグ機能
Visual Studio のようにエディタ上でブレークポイントをつけて変数の内容を見たりもできるが、正直あまり使わない。
Debug.Print
でログ出力 できる。出力したログは VBA ウインドウの 表示 > イミディエイトウインドウ に表示される。Debug.Print
やMsgBox
で複数の変数を出力する際、& での文字列結合だけでなく、; や , でも連結できて、その方が自動でスペースが入ったり見やすくて楽。
変数宣言 Dim
は省略できるけどすんなさせんな
VBA は変数宣言なしでいきなり変数を使い始める事ができるが、型も不明瞭なうえ、タイプミスがエラーではなく新規の変数として誤動作するので害悪でしかない。
'変数は Dim で宣言するのが基本だけど、VBA では省略してもOK
'For の i は変数宣言してないけどエラーにはならない
Dim count As Long
count = 0
For i = 1 to 10
'cont は count のタイプミスだけどエラーでなく新規変数として扱われる
'cont は初期値の 0 のままなので、count はずっと 1
count = cont + 1
Next i
これを避けるため、モジュールのコードの先頭に、
Option Explicit
という1行を記述すれば、そのモジュールのコードでは Dim
で宣言してない変数は全てエラー になる。例えば上の例であれば、For
の i
と cont
のところでエラー。入力の手間は多少増えるが、こっそり誤動作されるよりよっぽどマシ。
さらに VBA のウインドウの ツール > オプション を開き、 編集 タブの 変数の宣言を強制する をチェックしておけば、モジュールの新規作成時に Option Explicit が自動で記述されるようになる。これをチェックしたからといって既存の変数宣言してないコードが全てエラーになる訳ではないので気軽にチェックしてOK。