条件は、設定された基準に応じてアクションを実行できるため、プログラミングにおいて非常に役立ちます (IF 関数 Excel と同じ原理が使用されます)。
VBA If...Then...Else ステートメントは、指定された条件が true かどうかに応じて一連のステートメントを実行します。条件 (論理テスト) が満たされると、1 セットのアクションが実行されます。ただし、条件が false の場合は、別の一連のアクションが実行されます。
ただし、読みやすさを考慮して、複数レベルのネストされた If...Then...Else ステートメントの代わりに Select Case ステートメントを使用できます。
したがって、条件を設定する最も重要な関数は IF であり、次にそれがどのように機能するかを見ていきます。
If [ここで用語] Then '=> 条件が true の場合 THEN '「true」の場合の指示 Else '=> それ以外の場合 '「嘘」の場合の指示 End If
実践的になり、変数のレッスンで使用した例に戻りましょう。この手順の目的は、セル F5 で指定された文字列の値を表示するダイアログ ボックスを表示することでした。
F5 セルに文字を入力するとエラーが発生します。私たちはこれを防ぎたいのです。
Sub variables() '変数の宣言 Dim last_name As String, first_name As String, age As Integer, row_number As Integer '変数への値の代入 row_number = Range("F5") + 1 last_name = Cells(row_number, 1) first_name = Cells(row_number, 2) age = Cells(row_number, 3) 'ダイアログボックス MsgBox last_name & " " & first_name & ", " & age & "年" End Sub
コードを実行する前に、セル F5 に入力された値が数値かどうかをチェックする条件を追加してみましょう。
IsNumeric 関数を使用して条件をテストします。
Sub variables() '括弧内の値 (セル F5) が数値の場合 (したがって、IF CONDITION IS TRUE)、 'その後に続く命令を実行してから If IsNumeric(Range("F5")) Then '変数の宣言 Dim last_name As String, first_name As String, age As Integer, row_number As Integer '変数への値の代入 row_number = Range("F5") + 1 last_name = Cells(row_number, 1) first_name = Cells(row_number, 2) age = Cells(row_number, 3) 'ダイアログボックス MsgBox last_name & " " & first_name & ", " & age & "年" End If End Sub
設定した条件が満たされない場合の指示も記述する必要があります。
Sub variables() If IsNumeric(Range("F5")) Then '条件が満たされた場合 '変数の宣言 Dim last_name As String, first_name As String, age As Integer, row_number As Integer '変数への値の代入 row_number = Range("F5") + 1 last_name = Cells(row_number, 1) first_name = Cells(row_number, 2) age = Cells(row_number, 3) 'ダイアログボックス MsgBox last_name & " " & first_name & ", " & age & "年" Else '条件が満たされない場合 'ダイアログボックス: 警告 MsgBox "入力された値" & Range("F5") & "真実ではない!" 'セルF5の内容を削除します。 Range("F5").ClearContents End If End Sub
これで、数値以外の値が問題を引き起こすことはなくなりました。
16 行のデータを含む配列を使用して、次のステップでは row_number 変数が「2 以上」および「17 以下」であるかどうかを確認します。
まず、比較演算子を見てみましょう。
= | その通り |
<> | ではない正確に |
< | 未満 |
<= | 以下 |
> | より多い |
>= | 以上 |
これらの便利な演算子は次のとおりです。
AND | [条件1] AND [条件2] 2 つの条件を満たす必要があります |
OR | [条件1] OR [条件2] 2 つの条件のうち少なくとも 1 つが満たされる必要があること |
NOT | NOT [条件1] 条件を満たしてはいけません |
次に、比較演算子の間に上記の AND 条件の 1 つを追加しましょう。
Sub variables() If IsNumeric(Range("F5")) Then '数値の場合 Dim last_name As String, first_name As String, age As Integer, row_number As Integer row_number = Range("F5") + 1 If row_number >= 2 And row_number <= 17 Then '正しい番号であれば last_name = Cells(row_number, 1) first_name = Cells(row_number, 2) age = Cells(row_number, 3) MsgBox last_name & " " & first_name & ", " & age & "年" Else '番号が正しくない場合 MsgBox "入力された番号" & Range("F5") & "は正しくありません!" Range("F5").ClearContents End If Else '数値でない場合 MsgBox "入力された値" & Range("F5") & "真実ではない!" Range("F5").ClearContents End If End Sub
マクロをより実用的なものにしたい場合は、17 を行数を保持する変数に置き換えることができます。これにより、この制限を毎回変更することなく、配列に行を追加したり、配列から行を削除したりできるようになります。
これを行うには、変数 nb_rows を作成し、この関数を追加する必要があります。
この場合、WorksheetFunction.CountA 関数を使用します。これは、Excel 自体の COUNTA 関数に似ています。
この関数では、最初の列の空でないセルの数をカウントし、その結果の値を nb_rows 変数に書き込みます。
Sub variables() If IsNumeric(Range("F5")) Then 'IF番号 Dim last_name As String, first_name As String, age As Integer, row_number As Integer Dim nb_rows As Integer row_number = Range("F5") + 1 nb_rows = WorksheetFunction.CountA(Range("A:A")) '行数をカウントする機能 If row_number >= 2 And row_number <= nb_rows Then '有効な番号の場合 last_name = Cells(row_number, 1) first_name = Cells(row_number, 2) age = Cells(row_number, 3) MsgBox last_name & " " & first_name & ", " & age & "年" Else '番号が間違っている場合 MsgBox "入力された番号" & Range("F5") & "は正しくありません!" Range("F5").ClearContents End If Else '番号でない場合 MsgBox "入力された値" & Range("F5") & "真実ではない!" Range("F5").ClearContents End If End Sub
ElseIf を使用すると、IF コマンドの後に追加の条件を追加できます。
If 【条件1】 Then '=> 条件 1 が true の場合 THEN '手順 1 ElseIf 【条件2】 Then '=> 条件 1 が偽だが条件 2 が真の場合 THEN '手順 2 Else '=> それ以外の場合 '手順 3 End If
条件 1 が true の場合、ステートメント 1 が実行され、IF ステートメント (IF で始まり End If で終わります) が終了します。条件 2 が false を返した場合はステートメント 2 が実行され、条件 2 が false を返した場合はステートメント 3 (Else の下) が実行されます。
以下は、セル A1 に成績 1 ~ 6 があり、セル B1 にそれらの成績に対するコメントがある例です。
Sub scores_comment() '変数 Dim note As Integer, score_comment As String note = Range("A1") '受け取ったスコアに基づくコメント If note = 6 Then score_comment = "素晴らしいスコアです!" ElseIf note = 5 Then score_comment = "いい視点ね" ElseIf note = 4 Then score_comment = "満足のいくスコア" ElseIf note = 3 Then score_comment = "満足できないスコア" ElseIf note = 2 Then score_comment = "悪いスコア" ElseIf note = 1 Then score_comment = "ひどいスコア" Else score_comment = "ゼロスコア" End If 'セルB1のコメント Range("B1") = score_comment End Sub
If を多くの ElseIf ステートメントとともに使用する代わりに、Select Case コマンドという、この種の状況に適したコマンドがあります。
Select Case 演算子を使用したマクロの例を考えてみましょう。
Sub scores_comment() '変数 Dim note As Integer, score_comment As String note = Range("A1") '受け取ったスコアに基づくコメント Select Case note '=> テストのスコア (ポイント) Case Is = 6 '=> 値 = 6 の場合 score_comment = "素晴らしいスコアです!" Case Is = 5 '=> 値 = 5 の場合 score_comment = "いい視点ね" Case Is = 4 '=> 値 = 4 の場合 score_comment = "満足のいくスコア" Case Is = 3 '=> 値 = 3 の場合 score_comment = "満足できないスコア" Case Is = 2 '=> 値 = 2 の場合 score_comment = "悪いスコア" Case Is = 1 '=> 値 = 1 の場合 score_comment = "ひどいスコア" Case Else '=> 値が上記のいずれにも等しくない場合 score_comment = "ゼロスコア" End Select 'セルB1のコメント Range("B1") = score_comment End Sub
他の比較演算子も使用できることは注目に値します。
Case Is >= 6 '値 >= 6 の場合
さまざまな意味を持つ例:
Case Is = 6, 7 '値 = 6 または 7 の場合 Case Is <> 6, 7 '値が 6 または 7 に等しくない場合
Case 6 To 10 'if 値 = 6 ~ 10 の任意の数値