【VBA基礎⑤】ステートメントと関数
皆さんはVBAのステートメントをどれくらい使いこなしていますか?ステートメントにはIf構文やFor Next構文以外にも様々なものがあります。今回は様々なステートメントやよく使用する関数についてまとめていますので、この記事を読めばステートメントや関数の基礎を学ぶことができます!
この記事はVBAの基礎シリーズです。他の記事は以下のリンクからご覧いただけます!
目次
ステートメントとは?
ステートメントとは条件分岐や繰り返し処理などのマクロの動作を制御するための命令文のことを言います。例えば、条件分岐の構文では「If~」構文があります。以下のマクロは条件1に該当したら処理1を実行、条件2に該当したら処理2を実行、いずれにも該当しなければ処理3を実行するという命令文です。
If 条件1 Then
処理1
ElseIf 条件2 Then
処理2
Else
処理3
End If
繰り返し処理の例としては「For Next」構文があります。以下のマクロでは変数に指定した数値だけ、処理を繰り返し実行します。
For 変数 = 初期値 To 終了値
処理
Next 変数
その他のステートメントについても確認していきましょう。
ステートメントの種類
Select Caseステートメント
「Select Case」ステートメントは複数の条件分岐処理を実施するときに便利な構文です。構文は以下のように書きます。
以下の構文は条件1に該当すれば処理1を実施、条件2に該当すれば処理2を実施…いずれにも該当しない場合はその他の処理を実施するという命令文です。
Select Case 変数
Case 条件1
処理1
Case 条件2
処理2
・
・
・
Case Else
その他の処理
End Select
Next 変数

If構文と似ていますが、複数の変数を扱う場合はIf構文、複数の条件を扱う場合はSelect Caseが使いやすいです!
Caseの条件指定 -複数条件の指定-
Caseに続く条件の複数条件を指定したい場合は、以下のように条件ごとに「, 」で区切って指定します。
Case 条件1 , 条件2 , 条件3 , ・・・
Caseの条件指定 -範囲指定-
1~10のようにCaseに続く条件範囲を指定したいときは、「To」を使用します。この時、左側の値<右側の値にならなければいけません。
Case 値 To 値
Caseの条件指定 -指定した変数と条件を比較する-
Caseに指定した変数と条件を比較したいときは、「Is」を使用します。
以下のマクロではアクティブセルが空白でなければ、メッセージを表示します。
Sub test1()
Select Case ActiveCell
Case Is <> ""
MsgBox "値が入力されています。"
End Select
End Sub
セルにスペースを入力してからマクロを実行すると、メッセージ表示されました。

Do Loopステートメント
「Do Loop」ステートメントは指定した条件の間、処理を繰り返す構文です。この構文は条件判定のタイミングで2通りの記述があります。
【繰り返し処理の前に条件判定する場合】
前判定の場合は、条件に該当しなければ処理は実行されません。
Do 条件判定
処理
Loop
【繰り返し処理の後に条件判定する場合】
後判定の場合は、条件に該当していなくても1度処理は実行されます。
Do
処理
Loop 条件判定
Do Loop構文では条件の指定方法として2通りの指定ができます。
繰り返し条件 -While-
「While」条件は「条件が該当する間は処理を繰り返す」という指定ができます。
Do While 条件
処理
Loop
繰り返し条件 -Until-
「Until」条件は「条件が該当しない間は処理を繰り返す」という指定ができます。
Do Until 条件
処理
Loop

Do Loopは条件の判定タイミングと指定方法で4パターンの構文がつくれますね!
For Eachステートメント
「For Each」ステートメントは、グループの中身を順番に取り出して処理を実行していく命令文です。ここで言うグループとはシートなどのオブジェクトや配列を指します。
For Each 変数 In グループ
処理
Loop 変数
以下のマクロはワークシートをFor Eachステートメントのグループとして指定し、ワークシート順に名前に番号を振ります。
Sub test2()
Dim ws As Worksheet, i As Integer
i = 1
For Each ws In Worksheets
ws.Name = i
i = i + 1
Next ws
End Sub


「Worksheets」は全てのワークシートの集合を表します。変数にワークシートを指定したいときは、変数型「Worksheet」か「Variant」型を使用します。
ワークシートの他にもグループの指定方法を確認しましょう。
グループ指定 -Range-
セルの範囲を指定したいときは「Range」を使用します。
以下のマクロは変数にRangeオブジェクトを指定し、グループにRangeの範囲をセルA1からA10までとしています。処理に指定範囲のセル数値が偶数か奇数か判定し、偶数であれば背景を着色するコードを記述します。
Sub test3()
Dim cell As Range
For Each cell In Range("A1:A10")
If cell.Value Mod 2 = 0 Then
cell.Interior.Color = vbYellow
End If
Next cell
End Sub

グループ指定 -Selection-
セル指定の方法として「Selection」を使用することもできます。
以下マクロは、選択したセル範囲のセル数値を合計して表示します。
Sub test4()
Dim cell As Object, i As Double
For Each cell In Selection
i = cell + i
Next cell
MsgBox i
End Sub

Exitステートメント
「Exit」ステートメントは処理を途中で中止する命令文です。Exitの後ろに中止する処理を記述します。
Exitステートメントの種類
Exit Sub
Subプロシージャを中止します。つまり作動中のマクロから抜け出します。
Exit Function
Functionプロシージャを中止します。
Exit For
ForステートメントおよびFor Eachステートメントの繰り返し処理から抜け出します。
Exit Do
Do Loopステートメントの繰り返し処理から抜け出します。
Exitステートメントの例を見てみましょう。以下のマクロは、A列にある名前が「田中」と一致するまでDo Loopで順番に照らし合わせていきます。A列には田中の記載はないため、ループが発生し続けてしまいます。そこで、Exitを使用して行が300に達した時点でDoループから抜け出します。このようにExitを使用することで、予期しないループ発生を防止することができます。
Sub test5()
Dim i As Integer
i = 1
Do Until Cells(i, 1) = "田中"
i = i + 1
If i = 300 Then Exit Do
Loop
MsgBox "ループの設定上限です。"
End Sub


Exit DoはDo Loopステートメントから抜け出しますので、抜け出した後は通常通り上から下に沿って処理が再開されます。MsgBoxはDo Loopの外に記述してあるので、メッセージが表示されます。
関数とは?
プログラミングにおける関数とは、計算の処理の元となるデータ(引数)を受け取り、決まった処理をした後に結果を返すものです。Excelに標準搭載されている関数と同じ仕組みです。VBAの関数は様々なものがありますので、いくつかの例を紹介したいと思います。
UBound関数・LBound関数
LBound関数は配列の最も小さいインデックスを、UBound関数は配列の最も大きいインデックスをそれぞれ返す関数です。以下のマクロは配列「member」を0~2としてインデックス「0」にデータを格納しています。マクロのメッセージ結果は「2」となります。これはUBound関数で配列の値の最大値が返されたためです。
Sub test6()
Dim member(2) As String
member(0) = "田中太郎"
MsgBox UBound(member)
End Sub

値が代入されているインデックスの最大値ではなくて、配列自体のインデックス最大値を返します。
Split関数
Split関数は文字列データを任意の区切り文字で区切り、区切った文字列ごとに配列として返す関数です。
Split関数は次のように書きます。
Split(区切られる文字列 , 区切る文字列)
以下マクロは1行に代入された文章を「。」で区切り、行ごとに代入し直します。
Sub test7()
Dim text() As String, i As Integer
text = Split(Range("A1"), "。")
For i = 0 To UBound(text)
Cells(i + 3, 1) = text(i)
Next i
End Sub

IsArray関数
IsArray関数は、引数が配列の場合「True」を返します。以下のマクロのメッセージ結果は「True」となります。
Sub test6()
Dim member(2) As String
MsgBox IsArray(member)
End Sub
IsDate関数
IsDate関数は、引数が日付の場合「True」を返します。以下のマクロはセルA1が日付でない場合、セルA1の値を消去します。
Sub test8()
If IsDate(Range("A1")) = False Then MsgBox = "日付を入力してください。"
Range("A1").Clear
End Sub

IsNumeric関数
IsNumeric関数は、引数が数字の場合「True」を返します。以下のマクロはA1列の値が数値の場合のみ値を合計します。
Sub test9()
Dim i As Integer, n As Integer
i = 1
Do While Cells(i, 1) <> ""
If IsNumeric(Cells(i, 1)) Then
n = n + Cells(i, 1)
End If
i = i + 1
Loop
MsgBox n
End Sub


IsNumeric関数の結果がTrueの時は「=True」を省略できます。
まとめ
いかがでしたでしょうか?今回はVBAのステートメントと関数についてまとめました。この記事はVBAの基礎シリーズとして今後も発信していきますので、良ければ他の記事も読んでいただければ嬉しいです。それで最後までお読みいただき、ありがとうございました。