プログラム制御文 6

VBAトップへ
   6 プログラム制御文
   If〜Else  
  Select Case
  For〜Next  
  Do〜Loop
  With〜End With
  Exit
  Goto
  On Error


If〜Else

1.If〜ElseIfステートメント

条件により処理を分岐させたい場合は、If〜ElseIfステートメントを使用します。Ifは、"If 条件式 Then"の形式で条件を調べて、 条件式に合致(式を評価した結果がtrueであるとき)だけその次のステートメントを実行します。 条件がtrueでないときは、次の次の条件式の条件を調べます。


If 条件式1 Then
    条件式1を満たした場合の処理
ElseIf 条件式2 Then
    条件式2を満たした場合の処理
Else
    条件式1と条件式2を満たさなかった場合の処理
End If

条件式で使われている比較演算子には、以下のものあります。

演算子 意味
= 等しい If Value=5 Then ⇒ Valueの値が5ならTrue
< より小さい If Value<5 Then ⇒ Valueの値が5より小さいならTrue
<= 以下 If Value<=5 Then ⇒ Valueの値が5以下ならTrue
> より大きい If Value>5 Then ⇒ Valueの値が5より大きいならTrue
>= 以上 If Value>=5 Then ⇒ Valueの値が5以上ならTrue
<> 等しくない If Value<>5 Then ⇒ Valueの値が5と等しくないならTrue

以下の例ではインプットボックスを使って入力された文字により処理を分岐させた例です。


Sub test()
    Dim intAge As Integer
    intAge = InputBox("あなたの年齢を入力してください。")
      
    If intAge > 19 Then
        MsgBox "成人です。"
    Else
        MsgBox "未成年です。"
    End If
End Sub

条件式では論理演算子を使用することができます。

演算子 意味
条件式1 And 条件式2 条件式1と条件式2の両方を満たした場合True
条件式1 Or 条件式2 条件式1か条件式2のいずれか1つを満たした場合True
Not 条件式 条件式を満たさない場合True

以下の例では論理演算子を使用して処理を分岐させています。


Sub test()
    Dim intScore As Integer
    intScore = InputBox("得点を入力してください")
    
    If 79 < intScore And intScore <= 100 Then
        MsgBox "優です"
    ElseIf 69 < intScore And intScore < 80 Then
        MsgBox "良です"
    ElseIf 59 < intScore And intScore < 70 Then
        MsgBox "可です"
    ElseIf 0 < intScore And intScore < 60 Then
        MsgBox "不可です"
    Else
        MsgBox "得点は 0〜100の数字で入力してください"
    End If
    
End Sub

先頭へ戻る

Select Case

2.Select Case〜ステートメント

複数の条件により処理を分岐させたい場合はSelect Caseステートメントを使用します。 "Select Case 変数"の形式で式を評価し、Case以下の条件に合致(式を評価した結果がtrueであるとき)だけその次の文を実行します。条件がtrueでないときは、次の次の条件を調べます。 どのCase以下の条件にも当てはまらない場合はCase Else以下の文を実行します。


Select Case 変数
    Case 値1
        変数=値1の場合の処理
    Case 値2
        変数=値2の場合の処理
    Case Else
       変数=値1、変数=値2を満たさなかった場合の処理
End Select

以下の例では、インプットボックスに入力した文字により処理を分岐させた例です。


'説明:インプットボックスに入力された文字を英語に訳して
'   メッセージボックスに表示する。
Sub test()
    Dim strFruitName As String
    strFruitName = InputBox("果物の名前をひらがなで入力してください。")
    
    Select Case strFruitName
        Case "りんご"
            MsgBox "Apple"
        Case "もも"
            MsgBox "Peach"
        Case "いちご"
            MsgBox "Strawberry"
        Case "なし"
            MsgBox "Pear"
        Case "みかん"
            MsgBox "Mandarin orange"
        Case Else
            MsgBox "???"
    End Select
End Sub

比較演算子を使用する場合はCase Is以下に比較条件を記述します。

先頭へ戻る

For〜Next

3.For〜Nextステートメント

条件により処理を繰り返したい場合はFor〜Nextステートメントを使用します。


For カウンタ変数 = 初期値 To 繰り返し回数
    繰り返し回数までの処理
Next

下記の例では、まず変数 i に 1 が代入され、次に i が10以上かどうかを評価し、セルに値を代入し、次に i の値を1つ加算し、 もう一度 i が10以上かどうかを評価し、セルに値を代入します。この処理を i が10以上になるまで繰り返します。


'説明:セルのA1〜A10に1〜10を入力する
Sub test()
    For i = 1 To 10
        Worksheets("Sheet1").Cells(i, 1).Value = i
    Next
End Sub


For〜Next文ではデフォルトでは、カウンタ変数に 1 が加算されますが、"STEP"を指定しカウンタ変数に加算される数値を指定することができます。


For カウンタ変数 = 初期値 To 繰り返し回数 Step 加算値
    繰り返し回数までの処理
Next

下記の例では、まず変数 i に 1 が代入され、次に i が10以上かどうかを評価し、セルに値を代入し、次に i の値を 2 つ加算し、 もう一度 i が10以上かどうかを評価し、セルに値を代入します。この処理を i が10以上になるまで繰り返します


'説明:セルのA1〜A10に1,3,5,7,9を入力する
Sub test()
    For i = 1 To 10 Step 2
        Worksheets("Sheet1").Cells(i, 1).Value = i
    Next
End Sub

先頭へ戻る

   

Do〜Loop

4.Do〜Loopステートメント

条件により処理を繰り返したい場合はDo〜Loopステートメントを使用します。また、Do〜Loopステートメント には条件を指定する方法としてWhile と Untilを使用する方法があります。

>>Whileを使用する場合

While〜には"While 条件式"の形式で条件を指定します。条件式がtrueの間、処理が実行されます。 従って、通常は処理の中でWhile文の条件式がfalseになるようにしたり、 繰り返しを中断するような文を記述します。そうでないとwhile文は処理を永遠にし続けてしまうからです。

"While 条件式"は記述位置には2つの形式があり、記述位置により処理内容が異なってきます。 Whileの位置を前にした場合、条件式を満たしているのかを判断してから 繰り返す処理を実行します。


Do While 条件式
    条件式を満たすまで繰り返す処理
Loop

下記の例では、まず初期値として変数 i に 1 が代入しておき、次に i が11以下かどうかを評価し、セルに値を代入し、次に i の値を1つ加算し、 もう一度 i が11以下かどうかを評価し、セルに値を代入します。この処理を i が10以上になるまで繰り返します。


Sub test()
'セルのA1〜A10に1〜10を入力する
    i = 1
    Do While i < 11
        Worksheets("Sheet1").Cells(i, 1).Value = i
        i = i + 1
    Loop
End Sub

これに対してWhileの位置を後ろにした場合、繰り返す処理を実行してから 条件式を満たしているか判断します。つまりどのような条件でも1回は繰り返す処理 を実行します。


Do
    条件式を満たすまで繰り返す処理
Loop While 条件式

下記の例では、まず初期値として変数 i に 10 が代入しておき、セルに値を代入し、次に i の値を1つ加算し、 i が11以下かどうかを評価します。つまりWhile 条件式を評価する前に処理を 1回実行しています。i の値は11なので 繰り返す処理を実行せずに終了します。


Sub test()
'セルのA1〜A10に1〜10を入力する
    i = 10
    Do
        Worksheets("Sheet1").Cells(i, 1).Value = i
        i = i + 1
    Loop While i < 11
End Sub


>>Untilを使用する場合

Until〜には"Until 条件式"の形式で条件を指定します。条件式がtrueの間、処理が実行されます。 従って、通常は処理の中でUntil文の条件式がfalseになるようにしたり、 繰り返しを中断するような文を記述します。そうでないとUntil文は処理を永遠にし続けてしまうからです。

"Until 条件式"の記述には2つの形式があり、記述位置により処理内容が異なってきます。 Untilの位置を前にした場合、条件を満たしているのかを判断してから 繰り返す処理を実行します。


Do Until 条件式
    条件式を満たすまで繰り返す処理
Loop

下記の例では、まず初期値として変数 i に 1 が代入しておき、次に i が11以下かどうかを評価し、セルに値を代入し、次に i の値を1つ加算し、 もう一度 i が11かどうかを評価し、セルに値を代入します。この処理を i が11になるまで繰り返します。


Sub test()
'セルのA1〜A10に1〜10を入力する
    i = 1
    Do Until i = 11
        Worksheets("Sheet1").Cells(i, 1).Value = i
        i = i + 1
    Loop
End Sub

これに対してUntilの位置を後ろにした場合、繰り返す処理を実行してから 条件式を満たしているか判断します。つまりどのような条件でも1回は繰り返す処理 を実行します。


Do
    条件式を満たすまで繰り返す処理
Loop Until 条件式

下記の例では、まず初期値として変数 i に 10 が代入しておき、セルに値を代入し、次に i の値を1つ加算し、 i が11かどうかを評価します。つまりUntil 条件式を評価する前に処理を 1回実行しています。i の値は11なので 繰り返す処理を実行せずに終了します。


Sub test()
'セルのA1〜A10に1〜10を入力する
    i = 10
    Do
        Worksheets("Sheet1").Cells(i, 1).Value = i
        i = i + 1
    Loop Until i = 11
End Sub

先頭へ戻る

   

With〜End With

5.With〜End Withステートメント

同じオブジェクトに対して複数の処理を実行する方法としてWithステートメントを使用する方法があります。


With オブジェクト名
     処理1
     処理2
     処理3
End With

以下の例はSheet1をアクティブにし、セルの複数のプロパティに値をセットしています。


Sub test()
    
    With Worksheets("Sheet1").Cells(1, 1)
        .Activate
        .Value = "WithTest" '値
        With .Font
            .Size = 14  '文字サイズ
            .Bold = True  '太文字
            .FontStyle = "HG教科書体"  '書式
        End With
        .Interior.ColorIndex = 6  'セルの色
        .RowHeight = 20  'セルの高さ
        .ColumnWidth = 10  'セルの幅
    End With
    
End Sub

先頭へ戻る

   

Exit

6.Exitステートメント

実行中の処理を途中で抜ける場合Exitステートメントを使用します。


Exit Do

Exit For

Exit Function

Exit Property

Exit Sub

Do〜Loopステートメントを処理途中で抜け次のステートメントに制御を移します。 以下の例では変数iの値が10になったときにDo〜Loopを抜けます。


Sub ExitDo()
    Dim i As Integer
    i = 1
    Worksheets("Sheet8").Activate
        
    Do
        Worksheets("Sheet8").Cells(i, 1) = i
        i = i + 1
        If i = 10 Then
            Exit Do
        End If
    Loop

End Sub

For〜Nextステートメントを処理途中で抜け次のステートメントに制御を移します。


Sub ExitFor()
    Dim i As Integer
    
    Worksheets("Sheet8").Activate
        
    For i = 1 To 100
        Worksheets("Sheet8").Cells(i, 1) = i
        
        If i = 10 Then
            Exit For
        End If
    Next

End Sub

Subプロシージャを処理途中で抜け、制御はSub プロシージャを呼び出した次のステートメントに制御を移します。


Private Sub Test()

    Call ExitSub

    MsgBox ("Exit Subのテスト3")

End Sub

Sub ExitSub()

    MsgBox ("Exit Subのテスト1")

    Exit Sub
    
    MsgBox ("Exit Subのテスト2")'このステートメントは実行されない
    
End Sub

Functionプロシージャを処理途中で抜け、制御はFunction プロシージャを呼び出した次のステートメントに制御を移します。


Private Sub Test()

    Call ExitFunction

End Sub

    MsgBox ("Exit Functionのテスト3")

Function ExitFunction()

    MsgBox ("Exit Functionのテスト1")

    Exit Function
    
    MsgBox ("Exit Functionのテスト2")'このステートメントは実行されない
    
End Function

先頭へ戻る

   

Goto

7.GoToステートメント

プロシージャ内で処理を分岐させたい場合にはGoToステートメントを使用することができます。 ただし、GoToステートメントを多用するとプログラムが分かりにくくなるのでなるべく使用しない 方が良いでしょう。


GoTo LABEL名

LABEL名:

Sub Goto文()			

    MsgBox ("Gotoステートメントのテスト1")			

    GoTo Label1			
    			
    MsgBox ("Gotoステートメントのテスト2")         '→実行されない
    			
Label1:	
    MsgBox ("Gotoステートメントのテスト3")
End Sub

先頭へ戻る

   

On Error 

8.On Errorステートメント

プロシージャ内でエラーが発生した場合のプログラム制御には、On Errorステートメントを使用し Gotoステートメントによりエラー処理ルーチンにプログラム制御を移します。


On Error GoTo LABEL名

LABEL名:
     エラー処理 

エラーには実行時エラーと構文エラーとがあり、 実行時エラーとはシステムで処理できない動作を実行しようとした場合に発生するエラーであり、 構文エラーとは文法上の規則に違反した場合に発生するエラーで、プログラム実行前のコンパイル時に発生します。

エラーはErrオブジェクトを使用することにより、そのエラー内容を知ることができます。

オブジェクト名プロパティ内容
ErrNumberエラー番号
Description エラー番号に対応する文字列(エラー内容)
Source現在のプロジェクト名
HelpFileヘルプファイル名
HelpContext Number ヘルプファイルに対応するコンテキスト番号

エラーが発生した場合プログラムが中断しますが、 もし、プログラムを中断したくない場合はResume Nextステートメントを使用します。 Resume Nextステートメントを使用するとエラーが発生した次のステートメントから プログラムが継続されます。

以下は、構文エラーが発生した場合のプログラム制御の簡単な例です。


Sub OnErrorTest()
    On Error GoTo ErrorTrap
    
    Dim i As Integer
    i = "test"             '←ココで構文エラーとなる。
    
    MsgBox "終了します。"
    
    Exit Sub

ErrorTrap:
    MsgBox "エラー番号:" & Err.Number
    MsgBox "エラー内容:" & Err.Description
    MsgBox "ヘルプファイル名" & Err.HelpContext
    MsgBox "プロジェクト名:" & Err.Source
    Resume Next
End Sub

   先頭へ戻る   

中級・特別編トップへ