VBAに限らず、プログラミング言語の入門には定番があります。
それは"Hello world!"を表示するプログラムを書くこと。
"Hello world!"という言葉自体に重要な意味はなく、プログラムを使って文字列を表示するという点に意義があります。
何事においても基本は大事ですし、簡単なようで奥が深い、重要な儀式といえます。
プログラムを書く準備
まずエクセルのファイルを作りましょう。
エクセルを起動して『ファイル』→『名前をつけて保存』で拡張子(.xlsx等)の前のファイル名をHelloにします。
このとき、Excel2007以降であれば『ファイルの種類』を『Excel マクロ有効ブック(*.xlsm)』にしておきましょう。
ちなみに『Excel バイナリ ブック(*.xlsb)』形式は過去のバージョンとの互換性等に問題がある可能性がありますが、保存時の容量を小さく抑えることができるため、こちらを使用しても構いません。
VBE(Visual Basic Editor)の起動
VBAでプログラムを書くにはVBEというエディタを使います。
作成したファイル(Hello.xlsm)を開き、AltキーとF11キーを同時に押してください。
又は、『オプション』→『リボンのユーザー設定』で『開発』をチェックしてから『開発』タブのVisual Basicアイコンをクリックします。
VBEの画面が開いたでしょうか。VBAのプログラム開発にはこのエディタを使用します。
参考図ではプロジェクトエクスプローラー、プロパティウィンドウ、ローカルウィンドウ、ウォッチウインドウを表示していますが、このようになっていると使いやすいので、ツールバーの『表示』から該当するものを選んで、参考図のように配置してみてください。
標準モジュールを追加する
プロジェクトエクスプローラーの下の空いているところを右クリックして開くメニュー、又はツールバーから『挿入』→『標準モジュール』をクリックしてください。
プロジェクトに標準モジュール(Module1)が追加され、空のモジュール全体が表示されます。
VBAではこのモジュール単位でプログラムを作成していきます。
追加した標準モジュールの名前(オブジェクト名)はプロパティウィンドウで変更することができます。分かりやすい名前をつけておくと、モジュールが増えてきたときに機能が分かりやすく、管理するのに便利です。
標準モジュールを削除したい場合は、プロジェクトエクスプローラーで対象のモジュールを右クリックし、『(モジュール名)の解放』をクリックします。このとき、『エクスポート』を選択すると、モジュールをブックから独立したファイルとして保存することができ、他のブックで使用することもできます。
最初のプログラム
VBEが起動できればプログラムを書く準備は整いました。
早速プログラムを書いてみます。
プログラムの作成
以下のコードを空のモジュールに書いてみてください。コピーして貼り付けるのではなく、自分で入力してください(練習のため)。
Sub Hello() 'メッセージボックスに文字列("Hello world!")を表示するプログラム
MsgBox "Hello world!"
End Sub
※上の図ではオブジェクト名を Module1 から Hello に変更しています。
VBEには入力支援機能があり、エディタでsub Helloと入力して『Enter』キーで改行するだけで、Helloの後に()とend subが自動入力されます。自動的にsubをSubにしたり、msgboxをMsgBoxにしたりと(先頭が小文字→大文字になっている)、VBAの文法に従って入力内容を補完してくれる便利な機能です。
他にも、途中まで入力した時点でその後に続く可能性のある候補を表示してくれたりするので、効率的な作業を行うための必須機能ともいえます。入力途中に『Ctrl』キー+『スペース』キーで呼び出すこともできます。覚えておくと後々必ず役に立つでしょう。
話がそれましたが、上のコードのsubからend subまでをsubプロシージャ(VBAのプログラムの単位)と呼び、ここではHelloという名前のsubプロシージャ(関数、サブルーチン、メソッドとも呼ばれる)を作成したことになります。
プログラムの実行
入力カーソルを実行したいsubプロシージャ内に置いて『F5』キーを押すと、そのsubプロシージャのプログラムを全部実行することができます。ツールバーの『実行』からも実行することができます。
ちなみに『F8』キーを押すと、プログラムを一行ずつ実行すること(ステップ実行)ができます。プログラムの開発段階で、処理の内容を確認しながらプログラムを追うのに便利ですから、覚えておきましょう。
カーソルがsubプロシージャ内にない場合、以下のようなダイアログウィンドウが表示されますので、実行したいマクロ(subプロシージャ)名を選択して実行します。
それでは実行してみましょう。
コードの解説
さて、たった3行のコード(プログラム)で、メッセージボックスに"Hello world"という文字列を表示することができました。
1行目はsubプロシージャの開始、3行目は終了を示すだけですから、実質的な処理は一行だけです。
MsgBoxはVBAに予め組み込まれたメッセージボックスを表示する関数で、MsgBoxの後に表示したい文字列を記述することで、その文字列を表示することができます。
もちろん、"Hello world!"以外の文字列でも大丈夫ですが、二重引用符で囲まれていないと文字列とは見なされないために、エラーになってしまいます(例えば『MsgBox Hello world!』というコードはエラー)。
1行目の『'メッセージボックスに文字列("Hello world!")を表示するプログラム』という部分はプログラムに影響しないコメントです。適切なコメントを書いておくことで、何の処理なのかが一目で分かりやすくなり、開発効率を高めることにつながります。
VBAでは ' 以下に書いた文字はコメントと見なされます。
補足説明
1行目の関数名、Helloの直後に空の () が付いていることを疑問に思うかもしれませんが、この括弧は引数(ひきすう)と呼ばれる情報を記述するためのもので、引数がない場合でも関数を定義するときには関数名の後に()をつけます。
一方、関数を呼び出す際には関数名の後の括弧を省略することも多いです。というか、引数の無い関数には括弧を付けて呼び出すことができません。
引数とは関数を呼び出す際に、呼び出し先で参照(使用)するために渡す(広義の)値です。
さしあたり、ここでは関数名の後には括弧()を付けるものだと覚えておいてください。
MsgBoxを呼び出す際に記述した"Hello world!"という文字列もMsgBox関数に渡される引数です。
VBAの引数は括弧内に書かない場合も多く、例えば『msgbox "aaa"』も『msgbox ("aaa")』も同じ動作をします。ちなみに、関数を呼び出す際に『call』を使いますが、『call msgbox("aaa")』も前の2つの例と動作は同じです。callは省略することができます。
ただし、メッセージボックスでは挙動が同じように見えても、厳密には『msgbox "aaa"』と『msgbox ("aaa")』は異なります。条件分岐とジャンプで多少説明しています。
とりあえず一段落
以上でVBAを使って文字列を表示するプログラムが作れるようになりました。おめでとうございます。
VBAを使いこなすためにはもう少し勉強する必要がありますが、あとは簡単なものです。
まず始めてみるという壁を越えた時点で、最も大きな難関を乗り越えたといってもよいからです。
このまま進むのも、一旦コーヒーを飲んで休憩するのも、ブラウザを閉じるのもよいですが、せっかく始めたのですから、もう少しVBAの練習を楽しんでいただけたら幸いです。