支援対象地域:札幌、仙台、関東、愛知、関西、広島、福岡


はじめに

VBAとはVisual Basic for Applicationsの略で、WordやExcel、Outlookなどに命令する指示書を作るためのプログラミング言語のことです。一般的にはマクロというExcelの作業を自動化させたりする機能が有名で、こちらなら聞いたことのある人も多いのではないでしょうか。本記事ではExcelのマクロを通じてVBAのことを初心者の方に向けてご紹介しております。

開発タブを開こう

※ここではマクロを使うために開発タブの表示のさせ方をご紹介しています。もう開発タブがあるよ、という方は読み飛ばしていただいて構いません。

リボン

開発タブとは上図の様にマクロに関する様々な機能が備わっているタブのことです。これを表示させるには、まず「ファイルタブ」をクリックし「オプション」を選びます。「Excelのオプション」ダイアログボックスが出たら、その中の「リボンのユーザー設定」で右側の「メインタブ」の「開発」にチェックを入れることで開発タブが表示されるようになります(Excel 2019ではファイルタブ>リボンのユーザー設定という経由で行います)。

リボンのユーザー設定

各名称

さて、開発タブの表示出来たらプログラミングを書く準備をしていきましょう。マクロをプログラミングをする時の場所のことをVBE(Visual Studio Editor)と言い、Excel上で「Alt」+「F11」を押すことで起動します。もちろん開発タブ左上のVisualBasicというボタンを押しても起動しますが、恐らくショートカットキーの方が早く操作できるのでこちらの方法に慣れておきましょう。すると以下のような画面が開いたと思います。

VBE

・コードウィンドウ:プログラミングするところ

・プロジェクトエクスプローラー:現在Excelで開いているブック(プロジェクト)の一覧

・プロパティウィンドウ:主にUserForm(入力フォームなどをデザインする機能)を設計するところ

本来ならこのコードウィンドウにプログラミングをしていくのですが、まだ「モジュール」というコードを書いていく用紙のようなものが用意されていません。モジュールを挿入するには、VBE上部の「挿入タブ」をクリックし、ここでは「標準モジュール」を選択します。すると下の画像の様になります(特にプロジェクトエクスプローラーとプロパティウィンドウに注目し欲しいので右寄りにしています)。プロジェクトエクスプローラーに「標準モジュール」Module1というモジュールが出来、プロパティウィンドウにも変化が起きました。このModule1を選択した状態で、プロパティウィンドウ:(オブジェクト名)の横のModule1をクリックすると好きな名前に書き換えることが出来ます。名前を見ただけでどんな処理をするマクロなのか想像しやすい名前を付けてあげましょう。

VBEコーディングできる

この「Option Explicit」は変数を宣言することを強制させる、という制約が効いているということです。VBEの「ツールタブ」のオプション「変数の宣言を強制する」にチェックを入れOKすることで効果が発揮され、宣言されていない変数を使用して実行すると「コンパイルエラー」になります。一見、制約を付けることは不便なようにも見えるかもしれませんが、変数の宣言はプログラミングをするうえで重要なことです。例えば下のコードを見てください。ここではS0(Sと数字の0)を宣言し、文字列を代入していますが、実際に使用しているのはSO(Sとアルファベット大文字のO)です。目視で違いが判りますか?このちょっとしたスペルミスは時に重大なバグを生み出し、これが原因だと特定するのは非常に困難です。だって、見た目同じ文字に見えますもんね、これを防ぐために変数宣言の強制はしておくべきです。

SO

・プロシージャ

画面には明示的に出てこないので、イメージが掴みにくいかも知れませんが、プロシージャとはモジュールに記録するマクロの最小単位のことをいいます。モジュールが原稿用紙なら、プロシージャは原稿内容というイメージです。上のコードでも出てきた「Sub マクロ名()」「End Sub」というのもプロシージャの一種で、Sub~End Subの間に行いたい命令をプログラミングします。ちなみにマクロ名とは上のコードでいうところの「Test」です。マクロ名はアルファベット、漢字、ひらがな、カタカナ使えますが「.」「,」「+」「-」「*」「/」など一部の文字は使えません。

変数と定数

先ほどの「Option Explicit」の件で「変数?」と怪訝に思われた方、お待たせいたしました。変数とはいつでも変更可能な値を入れられる便利な箱のようなもののことです。一方、定数とは一度入れた値は変えられないセキュリティに特化した箱のようなもののことです。変数の宣言は上のコードにもあるように「Dim 変数名 As 型」の構造で作ります。型で特に良く使うのは文字列型String、長整数型Long、小数点型(倍精度)Doubleなどです。ルールとしてString型に値を入れる時は「""」で囲まなくてはいけない、Long、Integerなどの整数型においては整数しか入れられないことを覚えておきましょう。

スコープ

そして、重要なことですが変数には適応範囲(スコープ)というものがあります。考え方としてはシンプルで、プロシージャ間で宣言された変数(ローカル変数)はプロシージャ内でしか使えません。モジュールの先頭から最初のプロシージャまでの間にある「宣言セクション」に宣言した変数は「モジュールレベル変数」と言われ、そのモジュール内の全てのプロシージャで使えます。ちなみに上のコードの2つ目のプロシージャの中にある「End」でモジュールレベル変数をクリアさせています。

定数宣言

一方、定数の宣言は上のコードの様になります。変数の宣言と比べると大分すっきりしていますね。「Const 変数名 As 型=値」という構造で作ります。気を付けて欲しいことは定数は変数と違い、後から変更が効かないことと、宣言と代入を一行で済ませなければならないということです。

コーディングをしてみよう

習うより慣れよという言葉がある通り、読んでいるばかりではVBAの勉強にはなりません。ここからはコーディングしてその結果から、プロパティ(対象の様子や状態)やメソッド(動作やアクション命令)の持つ命令や状態にはどんな処理命令が意味付けられているのかを確認していきましょう。本記事のコーディングをコピー&ペーストしていただいても構いませんが、手入力をした方が覚えやすいのでご自身でコーディングすることをお勧めします。その際の便利な裏ワザをご紹介します。

まず、プロシージャについてですが「Sub マクロ名」まで入力してエンターを押せば、()とEnd Subが自動的に入力されます。もう一つ、関数や変数の入力中に「Ctrl+スペース」を押すといくつかの候補リストが現れますので、矢印キーで移動して「tabキー」で決定します。これによって関数や変数を最後まで入力する時間や手間が省ける他、コーディングミスを防ぐことに繋がります。実行する際には目的のプロシージャの中にカーソルを合わせ「F5」をすることで実行できます。VBE上部の「再生マーク」でも出来ますが、「F5」の方が楽なのでお勧めします。さて、長くなってしまいましたが、以下のコーディングを試してみましょう。


Sub Macro1()
  Dim A As String,B As String
  A="目指せ"
  B="プログラマー"
  MsgBox A & B
End Sub

「目指せプログラマー」のメッセージボックスが現れたと思います。そうです、今まで登場してきた「MsgBox」はメッセージボックスに表示させるという処理で、学習面では主にどんな処理がなされるかの確認のため良く使います。また、変数AとBは「""」で囲うと「AB」という文字列がメッセージボックスに表示されてしまうので「""」の使い方には注意しましょう。お気づきの方もいらっしゃると思いますが、変数の宣言は上記の様に連続で宣言することは可能です。しかし、「Dim A , B , C As String」といった形での連続宣言は出来ませんのでご注意ください。


Sub Macro2()
  Cells(1,1).value=100
End Sub
'******コメントアウト*************
Sub Macro3()
  Range("A2").Value=100
  Range("A3").Value=200
  Range("A4").Value=Range("A2").Value+Range("A3").Value
End Sub

セルの操作に関して2つの方法をご紹介します。まず、Cellls(行、列)でセルを指定する方法です。こちらは何行目の何列目のセルを指定するという方法で、Cells(1,"A")という表記でも表すことが出来、繰り返し文などセルを連続して指定したい時などに良く使われます。もう一つはRange(”文字列としてセルの指定”)というシンプルな方法で、繰り返し文で使用したいというときはRange(”A”&繰り返し用の変数)というように指定をします。ここではセルの指定の後ろに「.Value」という値を表すプロパティを記入していますが、これ、実は省略できます。以下のコードでその様子がわかると思うので参考にしてみてください。また、上記で出てきた「’*******」の「’」は後に続く文字をコメントアウトに出来ます。コメントアウトはプログラムに影響を与えない文字列を記入することが出来、覚え書きや他の人に対してのメモなどに使われます。


Sub Macro4()
  Dim i As Long
  For i = 1 To 10
    Cells(i,2) = i
  Next i
End Sub

セルB1~B10まで順番に1~10までの数字が表示されたのではないでしょうか。これはFor...Nextステートメントと言って繰り返し処理を行います。「For 変数名 =数値 To 数値」で繰り返しの回数を決めており、「For 変数名」と締めの「Next 変数名」はセットなので忘れずに必ず記入しましょう。


Sub Macro5()
  If Range("C1")>=50 Then
    Range("C2")="BIG"
  Else
    Range("C2")="SMALL"
  End If
End Sub

セルのC1に「100」を打ってからこのマクロを実行してみてください。セルC2に「BIG」と表示されるはずです。これはIfステートメントと言って条件分岐処理する命令です。まず、最初の条件分岐をして条件に合うなら中の処理を実行します(ここでは50以上なら「BIG」と表示)。条件が合わなければElse内の処理を行います(49以下なら「SMALL」を表示)。Ifステートメントの中に更にIfステートメントを入れる事で更に細かい条件分岐をしたり、For...Nextステートメントの中にIfステートメントを入れる事で繰り返しの条件分岐を組み合わせることも出来ます。ここまでコーディングをして参りましたが、コーディングする時はインデントと言って、タブキーを押して段落を下げることを心掛けましょう。こうすることで可読性が高まり、ご自身でコーディングする時はもちろん、第三者が見ても見やすいコーディングを実現することが出来ます。

おわりに

最後まで読んでいただきありがとうございます、そしてお疲れ様でした。本記事はVBAの超入門なので本当にVBAに関して入り口程度の事しか書いていません。最後の方に記述したFor...NextステートメントやIfステートメントは実務でも良く使われ、マスターすると楽しくなってくるコーディングです。この記事を通してプログラミングの楽しさ、自分には向いているかどうかなどの思考材料になってくれれば幸いです。VBAのいいところは他のプログラミング言語の様にJavaならeclipseなど専門のアプリケーションをインストールする必要はなく、もしあなたのPCにExcelが入っているなら手軽にプログラミング出来る事です。では、最後に長々と失礼いたしました、ありがとうございました。