条件付きロジック
メニューを表示するにはスワイプしてください
これまでの内容は、値の保存とテストに関するものでした。条件分岐は、コードが実際に判断を下す部分であり、テスト結果に応じて異なる命令ブロックを実行します。
If...Then
最も単純な形式:ある条件が成立した場合のみ、1つの処理を実行します。
If currentStock < reorderLevel Then
MsgBox "Reorder needed!"
End If
If 条件がFalseの場合、VBAは単にEnd Ifの後に進み、何も起こらずエラーも発生しません。
If...ElseIf...Else
複数の結果を条件ごとに連鎖させて処理します:
If currentStock = 0 Then
status = "Out of Stock"
ElseIf currentStock < reorderLevel Then
status = "Reorder Now"
ElseIf currentStock < reorderLevel * 2 Then
status = "Watch Closely"
Else
status = "Healthy"
End If
VBAは上から順に条件をチェックし、最初にTrueとなった条件で処理を止めます。後続の条件がTrueであってもチェックされません。これが順序が重要な理由です。たとえば、currentStockが0の場合、最初の条件(= 0)が該当し、statusは即座に"Out of Stock"となります。0はreorderLevel未満でもあるため、もしElseIf currentStock < reorderLevelが先に評価されていたら、在庫切れの商品に対して誤って"Reorder Now"と表示されてしまいます。最も具体的で緊急性の高い条件を先に記述し、より広い条件は後に記述することで、このような連鎖が正しく動作します。
Select Case
1つの変数を複数の固定値と比較する場合、Select Caseは長いElseIfチェーンと同じ意味を持ちますが、より読みやすくなります:
Select Case category
Case "Electronics"
discountRate = 0.05
Case "Office"
discountRate = 0.1
Case Else
discountRate = 0
End Select
Select Caseは数値の範囲にも対応しており、ElseIfの連鎖よりも読みやすくなります:
Select Case currentStock
Case 0
status = "Out of Stock"
Case 1 To 19
status = "Low"
Case 20 To 49
status = "Adequate"
Case Is >= 50
status = "Well Stocked"
End Select
Case 1 To 19は1から19までのすべての値に一致します。Case Is >= 50は、固定範囲ではなくテスト対象の変数に対してIsを使って比較します。
課題
- 上記の例のように、ハードコードされた在庫数に基づいてステータス文字列を割り当てる
Subブロックを持つSelect Caseを作成してください。 - 同じ
Sub内で在庫数を0、15、134に変更して3回テストし、それぞれの結果をDebug.Printで出力してください。 - 4つ目の条件として、ちょうど20(キーボードの再発注レベル)の場合を追加し、どのCaseが該当するか確認してください。
1. Select Case を使った Sub の作成
- 在庫数を保持する変数と、結果のテキスト(
status)を保持する変数を宣言。 - まず在庫数の変数にハードコーディングした値を代入(例:
stockLevel = 0)、その後Select Case stockLevelを実行 — セクション2.4の例と同じCase構造(Case 0、Case 1 To 19、Case 20 To 49、Case Is > 50)をコピー。 - 各
Caseで異なるテキスト値をstatusに代入。
2. 1つの Sub で3つの値をテスト
- 3つの個別プロシージャは不要 — 変数の値を変更し、
Select Caseブロックを実行し、結果を出力、その後再度値を変更して2回目を実行、すべて同じSub内で順番に行う。 - 各代入後に
Debug.Print statusを実行すると、イミディエイトウィンドウに結果が表示され、他の2つのテストを邪魔するポップアップは発生しない。
3. ちょうど20の場合のケース追加
- セクション2.4の元の例に戻り、
Case 1 To 19の終了位置とCase 20 To 49の開始位置をよく確認 — どちらか一方がすでに20を含んでいる。 Select Caseは最初に一致したものを採用するため、Case 20を別に追加しても、それを本来キャッチするケースより前に置かない限り何も変わらない。- 特に
stockLevel = 20で実行し、どのメッセージが表示されるか確認 — どのCaseが実際にキャッチしたかが分かり、新たに何も追加する必要がないことが分かる。
Sub ClassifyStockLevels()
Dim stockLevel As Integer
Dim status As String
' --- Test 1 ---
stockLevel = 0
Select Case stockLevel
Case 0
status = "Out of Stock"
Case 20
status = "Exactly at Reorder Level"
Case 1 To 19
status = "Low"
Case 20 To 49
status = "Adequate"
Case Is > 50
status = "Well Stocked"
End Select
Debug.Print stockLevel & " -> " & status
' --- Test 2 ---
stockLevel = 15
Select Case stockLevel
Case 0
status = "Out of Stock"
Case 20
status = "Exactly at Reorder Level"
Case 1 To 19
status = "Low"
Case 20 To 49
status = "Adequate"
Case Is > 50
status = "Well Stocked"
End Select
Debug.Print stockLevel & " -> " & status
' --- Test 3 ---
stockLevel = 134
Select Case stockLevel
Case 0
status = "Out of Stock"
Case 20
status = "Exactly at Reorder Level"
Case 1 To 19
status = "Low"
Case 20 To 49
status = "Adequate"
Case Is > 50
status = "Well Stocked"
End Select
Debug.Print stockLevel & " -> " & status
' --- Test 4: exactly 20 ---
stockLevel = 20
Select Case stockLevel
Case 0
status = "Out of Stock"
Case 20
status = "Exactly at Reorder Level"
Case 1 To 19
status = "Low"
Case 20 To 49
status = "Adequate"
Case Is > 50
status = "Well Stocked"
End Select
Debug.Print stockLevel & " -> " & status
End Sub
フィードバックありがとうございます!
AIに質問する
AIに質問する
何でも質問するか、提案された質問の1つを試してチャットを始めてください
条件付きロジック
これまでの内容は、値の保存とテストに関するものでした。条件分岐は、コードが実際に判断を下す部分であり、テスト結果に応じて異なる命令ブロックを実行します。
If...Then
最も単純な形式:ある条件が成立した場合のみ、1つの処理を実行します。
If currentStock < reorderLevel Then
MsgBox "Reorder needed!"
End If
If 条件がFalseの場合、VBAは単にEnd Ifの後に進み、何も起こらずエラーも発生しません。
If...ElseIf...Else
複数の結果を条件ごとに連鎖させて処理します:
If currentStock = 0 Then
status = "Out of Stock"
ElseIf currentStock < reorderLevel Then
status = "Reorder Now"
ElseIf currentStock < reorderLevel * 2 Then
status = "Watch Closely"
Else
status = "Healthy"
End If
VBAは上から順に条件をチェックし、最初にTrueとなった条件で処理を止めます。後続の条件がTrueであってもチェックされません。これが順序が重要な理由です。たとえば、currentStockが0の場合、最初の条件(= 0)が該当し、statusは即座に"Out of Stock"となります。0はreorderLevel未満でもあるため、もしElseIf currentStock < reorderLevelが先に評価されていたら、在庫切れの商品に対して誤って"Reorder Now"と表示されてしまいます。最も具体的で緊急性の高い条件を先に記述し、より広い条件は後に記述することで、このような連鎖が正しく動作します。
Select Case
1つの変数を複数の固定値と比較する場合、Select Caseは長いElseIfチェーンと同じ意味を持ちますが、より読みやすくなります:
Select Case category
Case "Electronics"
discountRate = 0.05
Case "Office"
discountRate = 0.1
Case Else
discountRate = 0
End Select
Select Caseは数値の範囲にも対応しており、ElseIfの連鎖よりも読みやすくなります:
Select Case currentStock
Case 0
status = "Out of Stock"
Case 1 To 19
status = "Low"
Case 20 To 49
status = "Adequate"
Case Is >= 50
status = "Well Stocked"
End Select
Case 1 To 19は1から19までのすべての値に一致します。Case Is >= 50は、固定範囲ではなくテスト対象の変数に対してIsを使って比較します。
課題
- 上記の例のように、ハードコードされた在庫数に基づいてステータス文字列を割り当てる
Subブロックを持つSelect Caseを作成してください。 - 同じ
Sub内で在庫数を0、15、134に変更して3回テストし、それぞれの結果をDebug.Printで出力してください。 - 4つ目の条件として、ちょうど20(キーボードの再発注レベル)の場合を追加し、どのCaseが該当するか確認してください。
1. Select Case を使った Sub の作成
- 在庫数を保持する変数と、結果のテキスト(
status)を保持する変数を宣言。 - まず在庫数の変数にハードコーディングした値を代入(例:
stockLevel = 0)、その後Select Case stockLevelを実行 — セクション2.4の例と同じCase構造(Case 0、Case 1 To 19、Case 20 To 49、Case Is > 50)をコピー。 - 各
Caseで異なるテキスト値をstatusに代入。
2. 1つの Sub で3つの値をテスト
- 3つの個別プロシージャは不要 — 変数の値を変更し、
Select Caseブロックを実行し、結果を出力、その後再度値を変更して2回目を実行、すべて同じSub内で順番に行う。 - 各代入後に
Debug.Print statusを実行すると、イミディエイトウィンドウに結果が表示され、他の2つのテストを邪魔するポップアップは発生しない。
3. ちょうど20の場合のケース追加
- セクション2.4の元の例に戻り、
Case 1 To 19の終了位置とCase 20 To 49の開始位置をよく確認 — どちらか一方がすでに20を含んでいる。 Select Caseは最初に一致したものを採用するため、Case 20を別に追加しても、それを本来キャッチするケースより前に置かない限り何も変わらない。- 特に
stockLevel = 20で実行し、どのメッセージが表示されるか確認 — どのCaseが実際にキャッチしたかが分かり、新たに何も追加する必要がないことが分かる。
Sub ClassifyStockLevels()
Dim stockLevel As Integer
Dim status As String
' --- Test 1 ---
stockLevel = 0
Select Case stockLevel
Case 0
status = "Out of Stock"
Case 20
status = "Exactly at Reorder Level"
Case 1 To 19
status = "Low"
Case 20 To 49
status = "Adequate"
Case Is > 50
status = "Well Stocked"
End Select
Debug.Print stockLevel & " -> " & status
' --- Test 2 ---
stockLevel = 15
Select Case stockLevel
Case 0
status = "Out of Stock"
Case 20
status = "Exactly at Reorder Level"
Case 1 To 19
status = "Low"
Case 20 To 49
status = "Adequate"
Case Is > 50
status = "Well Stocked"
End Select
Debug.Print stockLevel & " -> " & status
' --- Test 3 ---
stockLevel = 134
Select Case stockLevel
Case 0
status = "Out of Stock"
Case 20
status = "Exactly at Reorder Level"
Case 1 To 19
status = "Low"
Case 20 To 49
status = "Adequate"
Case Is > 50
status = "Well Stocked"
End Select
Debug.Print stockLevel & " -> " & status
' --- Test 4: exactly 20 ---
stockLevel = 20
Select Case stockLevel
Case 0
status = "Out of Stock"
Case 20
status = "Exactly at Reorder Level"
Case 1 To 19
status = "Low"
Case 20 To 49
status = "Adequate"
Case Is > 50
status = "Well Stocked"
End Select
Debug.Print stockLevel & " -> " & status
End Sub
フィードバックありがとうございます!