連絡先 Hikwareホーム
Hikware.Tech
自分用の覚え書きをそのまま公開。参考程度にどうぞ。

Excel VBA はじめるよ!

公開日 2024/02/25
最終更新 2024/02/25
  • Excel は SUM くらいしかまともに使ってなかったけど、ほかの人が作ったシートはいろいろ自動化されてて便利なので、あんなのを気軽に作れるようになりたい。
  • こちとらプログラマなんで、VBA マクロの起動とデバッグの仕方さえ分かればあとはどうとでもできるはず?

Excel のオプション設定

  • ファイルオプションリボンのユーザー設定 > 右側の メイン タブ のリストの中の 開発 がチェックされていなければチェック。
    これでリボンに 開発 が追加される。まずこれを有効にしないと VBA 関連の機能が何も使えない。

新規ブックを作ったらやること

  1. 拡張子が .xlsx のブックではマクロを動かせないので、.xlsm(Execl マクロ有効ブック)で保存しなおす。

  2. 開発Visual Basic で VBA ウインドウを出し、そのウインドウで 挿入標準モジュール をすると Module1 が作られてコードエディタが開く。これで VBA マクロを書く準備完了。

シート上のボタンを押したら VBA マクロが動くようにしてみる

  1. VBA のウインドウの標準モジュールのコードエディタで、引数なしの Sub プロシージャ を記述。例えば以下。

    Sub TestMacro()
        MsgBox "はじめるよ!"
    End Sub
    
  2. マクロを起動するボタンを作る。
    Excel のウインドウで 開発挿入フォームコントロールボタン を選択。シート上のボタンを作りたい場所を矩形選択するとボタンが作成され、起動するマクロを登録できるので、上で作成した Sub プロシージャを選択。

    引数ありの Sub プロシージャや Function はマクロ名のリストには表示されない。引数ありのプロシージャを強引に起動する事もできるが よろしくなさそう

  3. ボタンが選択されてる状態を一旦解除してからボタンを押すとマクロが実行される。この例ならメッセージボックスが出る。

VBA のデバッグ機能

  • Visual Studio のようにエディタ上でブレークポイントをつけて変数の内容を見たりもできるが、正直あまり使わない。

  • Debug.Print でログ出力 できる。出力したログは VBA ウインドウの 表示イミディエイトウインドウ に表示される。

  • Debug.PrintMsgBox で複数の変数を出力する際、& での文字列結合だけでなく、;, でも連結できて、その方が自動でスペースが入ったり見やすくて楽。

変数宣言 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 で宣言してない変数は全てエラー になる。例えば上の例であれば、Foricont のところでエラー。入力の手間は多少増えるが、こっそり誤動作されるよりよっぽどマシ。

 さらに VBA のウインドウの ツールオプション を開き、 編集 タブの 変数の宣言を強制する をチェックしておけば、モジュールの新規作成時に Option Explicit が自動で記述されるようになる。これをチェックしたからといって既存の変数宣言してないコードが全てエラーになる訳ではないので気軽にチェックしてOK。