
VBAを用いたマクロの基本事項
この記事は、「ルーティーン作業をマクロで自動化する」マガジン内の記事をご購読頂く上で、知っておいて頂きたい、VBAを用いたマクロの基本事項をまとめた記事です。この記事は随時更新されます。
より詳しく知りたい方向けに、Microsoft社Officeのウェブページのリンクを記載していますので、適宜ご参照下さい。
(1) VBAとマクロ
Word、Excel、Visio等、Microsoft社のOffice製品の多くは、Visual Basic for Applications(VBA)というプログラミング言語を用いてマクロを作成する機能を備えます。
マクロは、処理を実行するための指示(コード)を含むプログラムを記録したり、記録されたプログラムを呼び出して、プログラムに含まれる指示を実行したりする機能のことをいいます。
(2) プロシージャ
マクロは、Visual Basic Editorのコードウィンドウ内に、プロシージャを1単位として記録されます。プロシージャには、Subプロシージャ、Functionプロシージャ等の複数の種類があります。
(2-1) Subプロシージャ
Subプロシージャは、「Sub マクロ名()」から始まり、「End Sub」で終わります。マクロ名は、一定の規則の下、自由に設定できます。マクロ名の規則の詳細は、例えば、Microsoft Officeのデベロッパーセンターのウェブページ(こちら:無効なプロシージャ名のエラー)で確認できます。
Subプロシージャでは、「Sub マクロ名()」と、「End Sub」との間に処理を実行するためのコードが記録されます。コードは基本的に上から順に実行されます。例えば、下記図1に示すフローチャートの処理のように、文書を全選択してから(S1)、選択範囲を太字にする場合(S2)、マクロには、具体例1のMacro1のように、全選択を実行させるためのコードと、選択範囲太字を実行させるためのコードとが順に記録されます。
【図1】
【具体例1】
Sub Macro1()
'
' Macro1 Macro
'
'
Selection.WholeStory '1番目に実行されます。
Selection.Font.Bold = wdToggle '2番目に実行されます。
End Sub
具体例1のマクロにおいて、シングルクォーテーション「 '」は、コメントの開始とみなされます。 プログラム実行時には、シングルクォーテーション以降の文字列は無視され、実行されません。コードウィンドウ内では、「 '」以降の文字列は、黄緑色の文字で表示され、他の文字列と区別されます。
コードウィンドウ内には、複数のプロシージャを記録することができます。コードウィンドウ内に、複数のプロシージャを記録された場合、図2のように、プロシージャとプロシージャとの間には、横線が自動的に入ります。
【図2】
(3) 繰り返し処理
VBAを用いて繰り返し処理を実行させる場合、
(3-1) For Next文
(3-2) Do While文
(3-3) Do Until文
の、3つの構文がよく使用されます。
For Next文は、変数の初期値から到達値に達するまでの間、繰り返し処理を実行させる場合に用いられます。
Do While文は、処理を継続する条件を指定して、繰り返し処理を実行させる場合に用いられます。指定された条件が満たされている間、繰り返し処理が継続され、条件が満たされなくなると、繰り返し処理が終了されます。
Do Until文は、処理を終了する条件を指定して、繰り返し処理を実行させる場合に用いられます。指定された条件が満たされない場合に、繰り返し処理が継続され、条件が満たされた場合に、繰り返し処理が終了されます。
上記のように、3つの構文は、指定する条件が互いに異なります。
(3-1) For Next文
For Next文は、変数の初期値から到達値に達するまでの間、繰り返し処理を実行させます。例えば、図3に示すフローチャートの処理のように、変数Nが1から10までの間、S2と、S3との処理を繰り返す場合、For Next文を用い具体例2のように処理を記述できます。変数名、初期値、到達値は自由に設定できます。
【図3】
【具体例2】
Sub Macro2()
'変数の定義
Dim N As Integer
For N = 1 To 10
Selection.TypeText Text:=" 【0000】" '文字列1を記載
Selection.TypeParagraph '改行
Selection.TypeText Text:=" 本発明の請求項" & StrConv(N, vbWide) & "に係る" '文字列2を記載
Selection.TypeParagraph '改行
Next
End Sub
具体例2のように変数を用いる場合、For Next文の前に、「Dim 変数名 As データ型」の形式で、変数Nにはどのようなデータが格納されるかを記述します。データ型にはたくさんの種類がありますが、よく使用するのは、整数(Integer)、文字(String)です。
データ型を詳しく知りたい方は、Office デベロッパー センター のウェブページ(こちら:データ型の概要)をご参照下さい。具体例2では、「Dim N As Integer」で変数Nが整数であることを定義しています。
変数ではない文字列はダブルコーテーション「"」で囲んで記載されます。変数は「"」で囲まれません。文字列に、別の文字列、又は変数を追加する場合、「&」が用いられます。
For Next文では、図3のS1、S4、S5 の処理は、「For 変数名 = 初期値 To 到達値」で記述されますので、「For 変数名 = 初期値 To 到達値」とは別途、S1の処理、S5の処理を実行するコードの記述は不要です。
(3-2) Do While文
処理を継続する条件を指定して、繰り返し処理を実行させる場合に用いられます。指定された条件が満たされている間、「Do While 条件」と「Loop」の間に記述した繰り返し処理が継続され、条件が満たされなくなると、繰り返し処理が終了されます。For Next文とは異なり、変数に応じた処理を行わせる場合に、変数は自動的にインクリメントされませんので、記述する必要があります。
Do While文では、指定された条件が満たされている間、処理が繰り返し実行されるため、条件の設定を誤ると、処理が際限なく実行されることになります。処理が無限に実行される「無限ループ」に陥ることを回避するため、繰り返し処理を抜ける条件をマクロに加えておくことが好ましいです。
以下の具体例3は、英文段落番号([0001]等)を連番にするマクロです。変数Nが1000を超えると繰り返し処理から抜けるように記述しています。
【具体例3】
Sub Macro3()
Dim N As Long
'Nを0に設定
N = 0
'カーソルを先頭に移動
Selection.HomeKey Unit:=wdStory
'[4桁半角角数字]を検索する
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = "[\[]([0-9]{4})[\]]"
.Replacement.Text = ""
.Forward = True
.Wrap = wdFindStop
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchByte = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchFuzzy = False
.MatchWildcards = True
'検索が実行されている間、処理を繰り返す
Do While .Execute
'Nをインクリメント
N = N + 1
'4桁の半角連番に書き換える
Selection.Text = "[" & Format(N, "0000") & "]"
'無限ループ防止 Nが1000を超えたらループを抜ける
If N > 1000 Then
MsgBox "残念失敗!"
Exit Do
End If
Loop
End With
End Sub
(4) 分岐処理
条件を満たすか否かに応じて処理を分岐させたい場合、If文を使用します。If文の詳細を知りたい方は、Office デベロッパー センター のウェブページ(こちら)をご参照下さい。
例えば、条件式を満たす場合に処理1を実行し、満たさない場合には処理2を実行する場合、以下のように記述します。
If 条件式 Then
処理1
Else
処理2
End If
例えば、書類毎に異なるページに文章が記載されている場合には、図4に示すフローチャートの処理を実行させることで、要約書の文字数を取得し、取得された文字数が400を超える否かで異なるメッセージを表示させることができます。図4の処理を実行させるためのマクロは、例えば、具体例4のように記述できます。
【図4】
【具体例4】
Sub Macro4()
'変数Nの定義。
Dim N As Integer
'「【書類名】要約書」を検索する。
Selection.Find.ClearFormatting
With Selection.Find
.Text = "【書類名】要約書"
.Replacement.Text = ""
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchByte = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = False
.MatchFuzzy = False
End With
'ページ内の文字列を選択する。
ActiveDocument.Bookmarks("\Page").Range.Select
'ページ内の文字数を変数Nに設定する。
N = Selection.Range.ComputeStatistics(wdStatisticWords)
'変数Nが400を超えるか否かに応じたメッセージを表示する。
If N > 400 Then
MsgBox "要約書の文字数は、" & N & "文字で、400字を超えています。" 'メッセージ1を表示
Else
MsgBox "要約書の文字数は、" & N & "文字で、400字以内です。" 'メッセージ2を表示
End If
End Sub
複数の条件で処理を分岐させる場合、「ElseIf」を用います。以下のように記述すると、条件式1を満たす場合に、処理1を実行します。条件式1を満たさず、且つ、条件式2を満たす場合には、処理2を実行します。条件式1も、条件式2も満たさない場合には、処理3を実行します。
If 条件式1 Then
処理1
ElseIf 条件式2 Then
処理2
Else
処理3
End If
ご購読どうもありがとうございます。
いいなと思ったら応援しよう!
