【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」ステートメントは複数の条件分岐処理を実施するときに便利な構文です。構文は以下のように書きます。

以下の構文は条件1に該当すれば処理1を実施、条件2に該当すれば処理2を実施…いずれにも該当しない場合はその他の処理を実施するという命令文です。

Select Case 変数

 Case 条件1

  処理1

 Case 条件2

  処理2

  ・
  ・
  ・

 Case Else

  その他の処理

 End Select

Next 変数

If構文と似ていますが、複数の変数を扱う場合はIf構文、複数の条件を扱う場合はSelect Caseが使いやすいです!

Caseに続く条件の複数条件を指定したい場合は、以下のように条件ごとに「, 」で区切って指定します。

Case 条件1 , 条件2 , 条件3 , ・・・

1~10のようにCaseに続く条件範囲を指定したいときは、「To」を使用します。この時、左側の値<右側の値にならなければいけません。

Case 値 To 値

Caseに指定した変数と条件を比較したいときは、「Is」を使用します。

以下のマクロではアクティブセルが空白でなければ、メッセージを表示します。

Sub test1()

 Select Case ActiveCell
  Case Is <> ""
  MsgBox "値が入力されています。"
 End Select

End Sub

セルにスペースを入力してからマクロを実行すると、メッセージ表示されました。

「Do Loop」ステートメントは指定した条件の間、処理を繰り返す構文です。この構文は条件判定のタイミングで2通りの記述があります。

【繰り返し処理の前に条件判定する場合】
前判定の場合は、条件に該当しなければ処理は実行されません。

Do 条件判定

 処理

Loop

【繰り返し処理の後に条件判定する場合】
後判定の場合は、条件に該当していなくても1度処理は実行されます。

Do

 処理

Loop 条件判定

Do Loop構文では条件の指定方法として2通りの指定ができます。

「While」条件は「条件が該当する間は処理を繰り返す」という指定ができます。

Do While 条件

 処理

Loop

「Until」条件は「条件が該当しない間は処理を繰り返す」という指定ができます。

Do Until 条件

 処理

Loop

Do Loopは条件の判定タイミングと指定方法で4パターンの構文がつくれますね!

「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の範囲をセル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」を使用することもできます。

以下マクロは、選択したセル範囲のセル数値を合計して表示します。

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 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の関数は様々なものがありますので、いくつかの例を紹介したいと思います。

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(区切られる文字列 , 区切る文字列)

以下マクロは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関数は、引数が配列の場合「True」を返します。以下のマクロのメッセージ結果は「True」となります。

Sub test6()

 Dim member(2) As String
 MsgBox IsArray(member)

End Sub

IsDate関数は、引数が日付の場合「True」を返します。以下のマクロはセルA1が日付でない場合、セルA1の値を消去します。

Sub test8()

 If IsDate(Range("A1")) = False Then MsgBox = "日付を入力してください。"
 Range("A1").Clear

End Sub

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の基礎シリーズとして今後も発信していきますので、良ければ他の記事も読んでいただければ嬉しいです。それで最後までお読みいただき、ありがとうございました。