このページの内容について
このページは、VBAエキスパート(ExcelVBAベーシック)試験合格講座の第二回記事です。公式テキスト第3章「モジュールとプロシージャ」と第10章「マクロの実行」の内容について解説します。1時間の講義でお話する程度の分量です。講座受講者の復習での利用を想定しています。
プロシージャの実行方法
事前準備
サンプルコード(クリックでコピー)
'■①メッセージを表示するSubプロシージャ
Public Sub Test_Msgbox()
Call MsgBox("メッセージを表示する関数です。")
End Sub
'■②イミディエイトウィンドウに文字列を出力するSubプロシージャ
Private Sub Test_DebugPrint()
Debug.Print "文字列をイミディエイトウィンドウに出力します"
End Sub
'■③2つの引数を足し算して返すFunctionプロシージャ
Public Function Test_Sum(ByVal x As Long, ByVal y As Long) As Long
Test_Sum = x + y
End Function
'■④"Hello"という文字列を返すFunctionプロシージャ
Private Function Test_GetHello() As String
Test_GetHello = "Hello"
End Function
上記サンプルコードをモジュールに貼り付ける
プロシージャ(マクロ)の実行方法はいくつか種類があるため、1つずつ解説します。まずはVBEを立ち上げ(「Alt」+「F11」)標準モジュールを作成し、上記のサンプルコードをコピーして貼り付けてください。
VBEからの実行
VBEの画面でプロシージャ(マクロ)内にカーソルを合わせた状態で、タブの再生ボタン「▶」を押すとマクロを実行できます。再生ボタンにはショートカットキーとして「F5」が割り当てられており、開発中は最もよく使用するショートカットのひとつです。この方法でマクロを実行する場合、③のFunctionプロシージャは実行することができません。これはマクロ③には「引数」が必要であり他のプロシージャなどから呼び出して使用する必要があるためです。
「マクロ」メニューからの実行
Excelの開発タブから「マクロ」を選択すると実行可能なマクロの一覧が表示されます。このダイアログからもマクロは実行できます。この方法では①のマクロのみが表示されており、他のマクロは実行できません。それぞれ理由があります。②は「Sub」の前に「Private」を指定しているためです。「Private」を指定するとそのプロシージャが存在するモジュール内からしか実行できないようになります。③・④はFunctionプロシージャであり返される値を受け取ることのできないダイアログや後述するボタンからは実行ができなくなっています。
開発タブ⇒「マクロ」を選択する
マクロメニューが立ち上がるため、実行したいマクロを選択し「実行」を押す
ボタンなどに登録して実行
Excelの開発タブから「挿入」を選択し、ボタンを配置してみましょう。マクロの登録画面が立ちあがり、ボタンにマクロを登録することができます。実行可能なマクロは「マクロ」メニューと同じです。
開発タブ⇒「挿入」⇒「ボタン(フォーム コントロール)」選択する
マクロの登録画面が自動で立ち上がるため、登録したいマクロを選択する
ボタンの位置やサイズをマウス操作で決めます
ボタンの配置をセルに合わせてきれいに配置するには「Alt」を押しながらボタンのサイズを指定します。※VBAエキスパート試験には出ません。
ボタンが作成されました
下記のようにボタンが作成されるため、ボタンを押すとマクロを実行することができます。
ユーザー定義関数として実行
FunctionプロシージャはExcelの関数と同じようにセルに入力して呼び出すことができます。自作の関数のことを「ユーザー定義関数」と呼びます。ここでも「Private」指定したプロシージャ(④)は呼び出すことができません。
クイックアクセスツールバーに設定して実行する
クイックアクセスツールバーの設定を開く
一番簡単にクリックアクセスツールバーの設定を開く方法は下記画像の「その他のコマンド(M)」ボタンを押すことです。うまくいかない場合は「ファイル」⇒「オプション」⇒「クイックアクセスツールバー」からでも開けます。
コマンドの選択で「マクロ」を選ぶ
コマンド選択のプルダウンで「マクロ」を選択します。
クイックアクセスツールバーのユーザー設定で任意のオプションを選択する
クイックアクセスツールバーのユーザー設定(O)では、クイックアクセスツールバーの編集をExcel全体に適用するか、特定のブックにのみ適用するかを選択できます。任意のオプションをプルダウンで選択します。
任意のマクロを選択し「追加」「OK」
クイックアクセスツールバーから実行したい任意のマクロを選択し「追加」⇒「OK」で設定完了です。
クイックアクセスツールバーにマクロを登録できました
補記:マクロの発動にトリガーを設定する
VBAエキスパート試験の範囲ではありませんが、ダブルクリックされたときやシートが選択されたときなどの条件が満たされたときに自動でマクロを実行する(トリガーを設定する)方法について説明します。
シートモジュールかブックモジュールを開く
シートモジュールやブックモジュールにも標準モジュールと同様、マクロを記述することができます。ここではシートモジュールを例に説明をします。まずはプロジェクトエクスプローラーでシートモジュールを選択し、コードウィンドウを開きます。
オブジェクトのプルダウン「(General)」を「Worksheet」に変更する
自動的にプロシージャが生成されます
「オブジェクト」というプルダウンを変更すると自動的にプロシージャが生成されました。このプロシージャ「Worksheet_SelectionChange」はワークシートで選択範囲を変更したときに実行されるプロシージャです。
「オブジェクト」プルダウンの右の「プロシージャ」プルダウンを変更する
右のプルダウンを開くとトリガーの一覧が表示されるため、任意のトリガーを選択してください。下記例では「BeforeDoubleClick(ダブルクリックされたあとに実行)」を選択しました。
サンプルコード(クリックでコピー)
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Call MsgBox("ダブルクリックは禁止!", vbCritical)
Cancel = True
End Sub
サンプルコードをシートモジュールに貼り付けます
上記サンプルコードをコピーしてシートモジュールに貼り付けてみましょう。
トリガーを設定することができました
Excelのシートに移動し、セルをダブルクリックするとメッセージが表示され、ダブルクリックがキャンセルするマクロが実行されました。
プロシージャの実行オプション
コンパイラ言語とインタプリタ言語
プログラミングでは人間とコンピューターの中間の言語であるプログラム言語を使用してコードを記述しますが、コンピューターはこのままではプログラムを実行することができません。実行前に必ず機械語に翻訳されて実行されます。プログラム言語は、この翻訳のタイミングによってコンパイラ言語とインタプリタ言語に分類できます。
コンパイラ言語
すべてのコードを翻訳してからプログラムが実行されます。別名「一括翻訳型」。C言語やJavaなどが該当します。
インタプリタ言語
プログラムを翻訳しながら実行します。別名「逐次翻訳型」。VBAはインタプリタ言語に分類されます。そのためVBAではプログラムを1行ずつ実行したり、プログラムの実行中に停止させたり、マウスのドラッグ&ドロップで実行場所を変更することもできます。
マクロを1行ずつ実行する
実行したいプロシージャ(マクロ)にカーソルを合わせて「F5」を押すと、プログラムが最初から最後まで実行されますが、代わりに「F8」を押すと1行ずつ実行することができます。
マクロを実行中に停止させる・実行場所を変える
ブレイクポイントを設定する
プログラムの実行中に停止するポイントを設定することができます。停止させたい行にカーソルを合わせて「F9」を押すか、欄外の枠をクリックすると茶色いラインになります(書式変更していなければ)。
マクロを実行してみる
上記の状態でコードを実行すると、茶色くなっている行の一つ上の行まで処理が実行されマクロが停止されます。
黄色い矢印をドラッグ&ドロップで移動させる
黄色い矢印をドラッグ&ドロップで移動させると実行位置が変更できます。この状態で「F5」を押すとまた、茶色いラインで停止します。
マクロの実行順
プログラムの基本構成
プログラムは「順次処理」「分岐処理」「繰り返し処理」の3つを基本構成として記述されます。分岐処理と繰り返し処理は後の記事で解説をします。
順次処理とは
プロシージャ内に記述されたコードは原則として、上から下に向かって1行ずつ順番に実行されます。これはExcelVBA(マクロ)に限らないプログラミングの基本であり「順次処理」と呼びます。下記サンプルコードを標準モジュールにコピペしてみてください。
サンプルコード(クリックでコピー)
Private Sub Test_SequenceProcess()
Call MsgBox("メッセージを表示する関数です。")
Call MsgBox("2つ目のメッセージです。このメッセージが先に表示されることはありません。")
End Sub
上記コードを実行してみる
100回実行しても1,000回実行しても2番目のコードが先に実行されることはありません。これがプログラムの順次処理です。
コードの改行
サンプルコード(クリックでコピー)
Public Sub Test_LineBreak()
Call MsgBox("さあ、ExcelVBAの学習を始めましょう! まずは改行についてです。" & _
"このように長くなってしまうコードは途中で改行することができます。 " & _
"ただし、文字列や単語の途中で改行はできないので、このテキストは" & _
"文字列を「&」演算子で結合して表示しています。" _
)
End Sub
改行の方法
改行をしたいところに「 (半角スペース)」と「_(アンダーバー)」を入力します。文字列や単語の途中で改行はできませんので、サンプルのように長い文字列を途中で改行する場合は、文字列を分割して記述・改行し「&」を使って文字列を結合します。
コメント
プログラミングにおけるコメントの重要性
プログラミング言語は人間が扱う自然言語とコンピュータが扱う機械言語の中間に位置する言語です。そのため、機械言語ほど意味不明ではありませんが、自然言語ほどすんなり理解できるものではありません。エイダ・ラブレスが初めてコンピュータープログラムを作成した100年以上も前から他人(もしくは過去の自分)が書いたプログラムの解読は難解で困難な作業でした。そのためプログラミング言語には必ずと言っていいほど、コメント(コンピュータが無視するコード)を入力する機能が備わっています。
サンプルコード(クリックでコピー)
'■ここにもコメントを記述できます。
Private Sub Test_Comment() '■ここもOK
'■ここにコメントを記述します。
Call MsgBox("コメントのテスト") '■単語の途中や()の中にはコメントを記述できません。
'Call MsgBox("このメッセージは表示されません")
End Sub '■ここもOK
'■ここにもコメントを記述できます。
VBAでのコメントの書き方
VBAでは、「’(シングルクォーテーション)」以降のテキストをすべてコメントとみなします。コメントとして記述された部分はマクロの実行に影響を及ぼしません。単語の途中や、上述したコードを改行した途中にコメントの挿入はできません。
コメントブロック
VBAでは、コメントは「’」でのみ表現されるため、複数行のコメントを入力するにはそれぞれの行の先頭に「’」を入力する必要があります。複雑なマクロであればコメントも長くなることが多く、手入力で「’」を入力するのは手間です。VBAでは複数行を一括してコメントにする方法(コメントブロック)が用意されています。コメントブロックは実務において一部の処理をスキップしてコードのテストをしたりするときに多用します。コメントブロックの利用方法は「コメントブロックにショートカットキーを設定する」記事を参照してください。
コメントの色の変更
ツールバーの「ツール」⇒「オプション」⇒「エディターの設定」⇒「コードの表示色」⇒「コメント」からコメントの色を変更できます。
インデント
インデントとは
ExcelVBA(マクロ)に限らず、コードを整然ときれいに書くとそれだけで可読性が向上します。中でも適切なインデントを設定することは基本中の基本の必須項目です。インデントとは、文章やプログラムなどの文字列の開始位置をずらすことで、視覚的な整列や読みやすさを向上させるための機能のことです。VBAのデフォルト設定では「Tab」を入力することで空白文字の半角4文字分の間隔をあけることができます。
インデントあり/インデントなしの比較
インデントありのサンプルコード(クリックでコピー)
Private Sub Test_Indent()
Dim user_anser As VbMsgBoxResult
Dim factorial As Long, i As Long
Dim test_msg As String
user_anser = MsgBox("処理を実行しますか?", vbYesNo + vbInformation)
Select Case user_anser
Case vbYes
factorial = 1
For i = 1 To 10 Step 1
factorial = factorial * i
Next i
Call MsgBox("10! = " & factorial, vbInformation)
Case vbNo
Call MsgBox("処理の実行を中断します", vbInformation)
End Select
End Sub
インデントなしのサンプルコード(クリックでコピー)
Private Sub Test_UnIndent()
Dim user_anser As VbMsgBoxResult
Dim factorial As Long, i As Long
Dim test_msg As String
user_anser = MsgBox("処理を実行しますか?", vbYesNo + vbInformation)
Select Case user_anser
Case vbYes
factorial = 1
For i = 1 To 10 Step 1
factorial = factorial * i
Next i
Call MsgBox("10! = " & factorial, vbInformation)
Case vbNo
Call MsgBox("処理の実行を中断します", vbInformation)
End Select
End Sub
インデントの重要性
上記はどちらも同じマクロです。処理を開始するかどうかをユーザーへ質問し「はい」の場合、10の階乗を求めて返します。「いいえ」の場合、中断メッセージを表示します。インデント適切に使用されているコードは繰り返し箇所や分岐箇所が一目見て判別でき、読みやすくなっています。
他のプロシージャの呼び出し
プログラム(マクロ)を分割して作成する理由
マクロで業務を自動化するとき、例えばファイルダイアログを立ち上げてExcelファイルを選択させるというフローを入れる場合、このファイル選択プロセスは単一のマクロプログラム内で何度も使いまわしをしたり、他の開発案件に流用できたりします。このプロセスが必要になるたびに毎回イチからコードを記述するのは大変非効率なことです。そのため、VBAでは他のプロシージャを呼び出す機能が用意されています。
サンプルコード(クリックでコピー)
Private Sub Test_CallFunction()
Debug.Print OpenFileDialogExcelSingle("任意のExcelファイルを選択する")
End Sub
他のプロシージャを呼び出してみる
上記2つのサンプルコードをモジュールにコピペしてみましょう。「Test_CallFunction」を実行するとファイルダイアログが立ち上がります。Excelファイルを選択すると、イミディエイトウィンドウにファイルの絶対パスが表示されます。実務では例えばファイルパスを取得し、Excelを開いたり、さらにほかのExcelを選択させてデータを転記したり・・などと続きます。その都度、ファイル選択のコードを記述していてはコードが冗長になってしまうため、繰り返し使えるコードは関数化してしまうことをおすすめします。
PR:関数リファレンスの紹介
当サイトのトップページには関数リファレンスを設置しています。関数リファレンスは私がこれまでに開発をしてきた中で作成した関数を検索・コードを表示してクリックするとコピーできるツールです。使用頻度の高い機能をすべて関数化しているので、自分でイチから開発をする前に必要な機能がすでに作られていないか覗いてみてください。
VBAに備え付けの関数
VBAには多くの関数が事前に用意されています
これまでにサンプルコードで何度も登場しているMsgboxの他にもVBAに備え付けの関数はたくさん存在します。VBAエキスパート試験に登場する関数は後の記事で解説をしますが、自身でもどんな関数があるのかを確認してみましょう。
備え付け関数の探し方
「VBA.」と入力する
プロシージャ内に「VBA.(ブイビーエードット)」と入力してみましょう。下記のように候補が表示されます。
入力を進める
入力を進めると候補の近くへ表示が移動します。ここでは続けて「E」と入力しました。※大文字小文字は結果に影響しません。
候補から使用したい関数を選択する
マウスでクリックするか、カーソル移動してから「Tab」を入力することで自動で入力されます。ここでは「Environ」を選択しています。
関数の使い方を調べる
基本的に、初見の関数はネット検索をしてみましょう「VBA.Environ」と検索するとMicrosoftの公式ページがヒットします。公式サイトの解説では情報が足りないこともあるので、その他の解説ページもどんどん見てみるようにしましょう。
関数を使ってみる(クリックでコピー)
Private Sub Test_StandardFunction()
Debug.Print VBA.Environ("USERNAME")
End Sub
EnvironはWindowsの環境変数を取得できます。上記サンプルを実行すると「USERNAME」がイミディエイトウィンドウに表示されます。
VBEの入力補助機能(インテリセンス)
オートコレクト
VBEには入力補助機能(インテリセンス)が用意されています。宣言済の変数や、VBAで最初から使える関数や定数はオートコレクト機能で入力ができます。
途中まで関数名を入力する
プロシージャ内で関数名を途中まで入力します。ここでは「Be」と入力しています。
「Ctrl」+「スペース」でオートコレクトを使用する
Beの後ろにカーソルがある状態で「Ctrl」+「スペース」を入力すると、関数名が自動で保管されます。「Be」の場合、候補が「Beep」しかないのでそのまま補完され、候補が複数ある場合は、候補の選択窓が表示されます。
関数を使ってみる(クリックでコピー)
Private Sub Test_IntelliSense()
Call Beep
End Sub
「Beep」は警告音を鳴らします。警告音はPCによって異なります。
エラー判定
ExcelVBA(マクロ)では、1文入力するごとに文法チェックをしてくれています。下記例では最後に「)」で閉じる必要がありますが、閉じずに他の行へカーソルを移動させるとエラーが発生しました。エラー判定は外すことができます。方法については「VBAで改行するとエラーが発生する」記事を参照してください。
Comment