5. VBA(for Excel)とフローチャート

ここでは、VBAとフローチャートの対応関係について書きます。ソースコードとフローチャートを順番に書くことで、VBAの処理の流れを明確にします。

5.1. goto文

goto文はスパゲッティープログラムの元として嫌われることが多いので、多重ループから脱出するなどの特定の場面でのみ利用するのがよい。

gotoの構文

GoTo ラベル

ラベル:   'GoTo文のジャンプ先。

ラベルの後ろには : (コロン) を指定し、ラベルだけを単独で 1 行に入力する


goto文例

vba_goto.bas

Sub main
	GoTo B
A:
	'処理しない
	MsgBox "01"
	
B:
	'処理する
	MsgBox "02"
	GoTo D
	
C:
	'処理しない
	MsgBox "03"
	
D:
End Sub

goto文例のフローチャート

_images/bat_goto_ex.gif

5.2. 三項の条件演算子

三項の条件演算子の構文

IIf(条件, 式1,  式2)

三項の条件演算子の例

vba_conditional_op.bas

Sub main
  Dim sum As Integer
  sum = 10
  Dim str As String
  str = IIf(sum >= 60, "合格", "不合格")
  MsgBox str
End Sub

三項の条件演算子フローチャート

_images/sanko.gif

5.3. if...else文

if..elseの構文

If 条件式1 then
    命令文1
ElseIf 条件式2 then
    命令文2;
Else
    命令文3;
End If

if..elseのフローチャート

_images/ifelse.gif

if..elseの例

vba_if_else.bas

Sub main
	Dim age As Integer
	age = 16
	Dim result As String
	result = ""
	If age >= 70 Then
	    result = "心の欲する所に従って矩を踰えず"
	ElseIf age >= 60 Then
	    result = "耳順う"
	ElseIf age >= 50 Then
	    result = "天命を知る"
	ElseIf age >= 40 Then
	    result = "惑わず"
	ElseIf age >= 30 Then
	    result = "立つ"
	ElseIf age >= 15 Then
	    result = "学に志す"
	Else
	    result = "無し"
	End If
	MsgBox result '=> 学に志す
End Sub

if..else文例のフローチャート

_images/rongo.gif

5.4. switch文

switch文の構文

Select Case 式
        Case 値1
                命令文1
        Case 値2
                命令文2
        Case Else
           命令文3
End Select

switch文のフローチャート

_images/switch.gif

switch文の例

js_switch.html

Sub main
	Dim month As Integer
	month = 2
	Dim result As String
	result = ""
	Select Case month
		Case 1
			 result = "January"
		Case 2
			 result = "February"
		Case 3
			result = "March"
		Case 4
			result = "April"
		Case 5
			result = "May"
		Case 6
			result = "June"
		Case 7
			result = "July"
		Case 8
			result = "August"
		Case 9
			result = "September"
		Case 10
			result = "October"
		Case 11
			result = "November"
		Case 12
			result = "December"
		Case Else
			Debug.Assert False
	End Select
	MsgBox result '=> February
End Sub

switch文例のフローチャート

_images/switch_ex.gif

5.5. for文

for文の構文

For カウンタ変数 = 初期値 To 繰り返し回数 Step カウンタ変数増加数
    命令文;
Next

for文のフローチャート

_images/for.gif

1~10の合計を求めるfor文の例

vba_for.bas

Sub main
	Dim sum As Integer
	sum = 0
	Dim i As Integer
	For i = 1 To 10
		sum = sum + i
	Next
	MsgBox sum '=>55
End Sub

for文例のフローチャート

_images/for_ex.gif

5.6. for-each文

for-eachのループ文の説明


for each文の構文

For Each 変数 In グループ
    文
Next
グループ:グループに指定された、配列、コレクション(オブジェクトの集合)

1~10の合計を求めるfor文の例
vba_for_each.html
Sub main()
    Dim nums() As Variant
    nums = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
    Dim sum As Integer
    sum = 0
    Dim num As Variant

    For Each num In nums
        sum = sum + num
    Next
    MsgBox sum '=>55
End Sub

for_each文例のフローチャート

_images/for_each.gif

5.7. while文

VBAのwhile文には、Do While...Loop文とDo Until...Loopの二つがある。

Whileの否定がUntilとなっており、継続条件式が反対の関係である。

while文の構文

Do While 継続条件式
   命令文
Loop

Do Until not継続条件式
   命令文
Loop

while文のフローチャート

_images/while.gif

1~10の合計を求める。while文の例

vba_while.bas

'(1) While
Sub main_while
    Dim i As Integer
    i = 1
    Dim sum As Integer
    sum = 0
    Do While i <= 10
        sum = sum + i
        i = i + 1
    Loop
    MsgBox sum '=>55
End Sub

'(2) Until
Sub main_until
    Dim i As Integer
    i = 1
    Dim sum As Integer
    sum = 0
    Do Until Not (i <= 10)
        sum = sum + i
        i = i + 1
    Loop
    MsgBox sum '=>55
End Sub

while文例のフローチャート

_images/while_ex.gif

5.8. do..while文

do-while文の構文

VBAのdo..while文には、Do...Loop While文とDo...Loop Untilの二つがある。

Whileの否定がUntilとなっており、継続条件式が反対の関係である。

'(1) While
Do
    命令文
Loop While 継続条件式

'※継続条件式:繰り返しを継続するする条件

'(2) Until
Do
    命令文
Loop Until not継続条件式

'※not継続条件式:繰り返しを継続しない条件。


do-while文のフローチャート
_images/do_while.gif

1~10の合計を求める。do-while文の例

vba_do_while.bas

'(1) Do ... Loop While
Sub main_while
    Dim i As Integer
    i = 1
    Dim sum As Integer
    sum  = 0
    Do
        sum = sum + i
        i = i + 1
    Loop While i <= 10
    MsgBox sum '=>55
End Sub


'(2) Do ... Loop Until
Sub main_until
    Dim i As Integer
    i = 1
    Dim sum As Integer
    sum  = 0
    Do
        sum = sum + i
        i = i + 1
    Loop Until Not(i <= 10)
    MsgBox sum '=>55
End Sub

do-while文のフローチャート

_images/do_while_ex.gif

5.9. continue文

VBAにはcontinue文はありません。

GoTo文を利用して類似の処理が書けます。

なお、continue文はJavaやC言語などにある処理です。

※参考:Javaの continue文への参照

continueの構文

'continue文はないので下記のように書く

'GoTo文を使う
For カウンタ変数 = 初期値 To 繰り返し回数
        処理
        If 条件式 GoTo CONTINUE_LABEL
        処理
CONTINUE_LABEL:
Next


continue文の例

vba_for_continue.bas

Sub main
	Dim sum As Integer
	sum = 0
	Dim i As Integer
	For i = 1 To 10 Step 1
		If i = 3 Then
			GoTo CONTINUE_LABLE
		End If
		sum = sum + i
CONTINUE_LABLE:
	Next
	MsgBox sum '=>52
End Sub

continue文例のフローチャート

_images/bat_for_continue_ex.gif

5.10. break文

breakの構文

VBAでは「break」の代わりに、「Exit For」、「Exit Do」を使う。

break構文はFor、While文の繰り返し処理の途中で、繰り返し処理から抜け出す時に使う。

※Java、C言語などでは「break」というスペルを使う。Javaの break文への参照

For カウンタ変数 = 初期値 To 繰り返し回数 Step カウンタ変数増加数
        命令文
        Exit For
Next

Do While 条件式
        命令文
        Exit Do
Loop

break文の例

vba_for_break.bas

Sub main
    Dim sum As Integer
    sum = 0
    Dim i As Integer
    For i = 1 To 10 Step 1
        sum = sum + i
        If sum >= 30 Then
            Exit For 'ループを脱出する。
        End If
    Next
    MsgBox sum '=>36
End Sub

break文例のフローチャート

_images/bat_for_break_ex.gif

5.11. ラベル付きcontinue文

VBAにはラベル付きcontinue文はないためGoTo文を利用して類似の処理を書きます。

なお、ラベル付きcontinue文はJavaにある処理で、主に多重ループを抜ける処理をスマートに書くために使います。

※参考:Javaの ラベル付きcontinue文への参照

ラベル付きcontinue文の例

vba_for_double_continue.bas

Sub main
    Dim sum As Integer
    sum = 0
    Dim i As Integer
    For i = 1 To 10 Step 1
        Dim j As Integer
        For j=1 To 10 Step 1
            If i = 3 Then
                GoTo CONTINUE_LABEL
            End If
            sum = sum + i * j
        Next
CONTINUE_LABEL:
    Next
    MsgBox sum '=>2860
End Sub

ラベル付きcontinue文例のフローチャート

_images/bat_for_double_continue_ex.gif

5.12. ラベル付きbreak文

ラベル付きのものは、主に多重ループを抜ける処理をスマートの書くために使います。

ラベル付きbreak文の例

vba_for_double_break.bas

Sub main
    Dim sum As Integer
    sum = 0
    Dim i As Integer
    For i = 1 To 10 Step 1
        Dim j As Integer
        For j=1 To 10 Step 1
            sum = sum + i * j
            If sum >= 15 Then
                GoTo BREAK_LABEL '多重ループを抜けるため、BREAK_LABELへジャンプする。
            End If
        Next
    Next
BREAK_LABEL:
    MsgBox sum '=>15
End Sub

ラベル付きbreak文例のフローチャート

_images/bat_for_double_break_ex.gif