【HOME】 【INDEX】 【第1回】 【第2回】 【第3回】 【第4回】【第5回】 第6回
プログラミングの基礎編 第5回
制御ステートメント(2)
●処理の繰り返しをさせるステートメント Do・・・・
(1)条件が真の間、処理を繰り返す〜Do While 条件式 ・・・ Loop
このステートメントは、Do While から Loopの間、
指定した条件が真の間、処理を繰り返し実行します
最初から偽であれば処理は実行されません
Do Whileを使って任意の月の最終日を迎えるまで日にちを加算して
最終日を知るというプログラムを考えていきましょ
例
Sub Test1()
Dim MyDate As Date
Dim MyDay As Integer
Dim MyMonth As Integer
Dim StartMonth As Integer
MyDay = 0 '初期値として 0 を入力します
MyDate = InputBox("年月を半角で入力してください(例:2005/12)" _
, "年月入力")
'2005/12 を入力するだけで Date関数は 2005/12/1と認識します
'Input関数で入力を促します
StartMonth = Month(MyDate)
'入力された月をStartMonthとして代入しておきます
MyMonth = Month(MyDate)
'MyMonthの初期値です。入力された月と同じにしておきます
Do While StartMonth = MyMonth '月が同じ場合はの意味になります
'入力された月とMyMonthが真の間は次の処理を繰り返します
MyDay = Day(MyDate)
'Day関数により加算された日数を調べます
MyDate = MyDate + 1
'MyDateから1日加算していきます
MyMonth = Month(MyDate)
'関数Monthにより月を調べます
Loop
'加算された日が翌月になればStartMonthとMyMonthが同じにならないので
'処理が終了します
MsgBox StartMonth & "月の最終日は" & MyDay & "でした"
'MyDayがその月の最終日となります
End Sub
(2)条件が真の間、処理を繰り返す〜Do ・・・ Loop While 条件式
これはDo Whileと同じで指定した条件が真の間、Do 〜Loop While
までの処理が繰り返されます。ただ Do While と異なり
最後に条件が判定されるため、最初から条件が偽であっても
かならず一度は処理が実行されます。
Sub Test2()
Dim MyDate As Date
Dim MyDay As Integer
Dim MyMonth As Integer
Dim StartMonth As Integer
MyDay = 0
MyDate = InputBox("年月を半角で入力してください(例:2005/12)" _
, "年月入力")
StartMonth = Month(MyDate)
'MyMonth = Month(MyDate)このステートメントを省略しても答えは同じです
'Do While の 時は ここで初期値を設定しないと 最終日が0で
'Do While の時点で偽のため、そこから以降の中の処理が実行されません
Do
MyDay = Day(MyDate)
MyDate = MyDate + 1
MyMonth = Month(MyDate)
'この時点でMyMonthの初期値となる
'(実は最初のMyMonthは指定された月の2日目のデータが代入される)
Loop While StartMonth = MyMonth
MsgBox StartMonth & "月の最終日は" & MyDay & "でした"
End Sub
(3)条件が真になるまで、処理を繰り返す〜Do Until 条件式 ・・・ Loop
最初から真であった場合は処理は実行されません
Sub Test3()
Dim MyDate As Date
Dim MyDay As Integer
Dim MyMonth As Integer
Dim StartMonth As Integer
MyDay = 0
MyDate = InputBox("年月を半角で入力してください(例:2005/12)" _
, "年月入力")
StartMonth = Month(MyDate)
MyMonth = Month(MyDate)
Do Until StartMonth <> MyMonth '月が変わるまでの意味になる
MyDay = Day(MyDate)
MyDate = MyDate + 1
MyMonth = Month(MyDate)
Loop
MsgBox StartMonth & "月の最終日は" & MyDay & "でした"
End Sub
(4)条件が真になるまで、処理を繰り返す〜Do ・・・ Loop Until 条件式
最初から真であった場合でも 一度は処理を実行します
Sub Test4()
Dim MyDate As Date
Dim MyDay As Integer
Dim MyMonth As Integer
Dim StartMonth As Integer
MyDay = 0
MyDate = InputBox("年月を半角で入力してください(例:2005/12)" _
, "年月入力")
StartMonth = Month(MyDate)
' MyMonth = Month(MyDate) (2)と同様です
Do
MyDay = Day(MyDate)
MyDate = MyDate + 1
MyMonth = Month(MyDate)
Loop Until StartMonth <> MyMonth
MsgBox StartMonth & "月の最終日は" & MyDay & "でした"
End Sub
(1)〜(4)まで処理を繰り返すことについては、少しやり方が違っても
結果としては、同じものが得られます
どれか、ひとつを覚えて、マスターしてくださいね^^
(5)繰り返し処理の強制終了・・・・Exit Do
条件によって繰り返し処理を中止させるには Exit Do を使用します
次の例では 5月だけは処理を中止させて、他は処理を継続させる
プログラムです
Sub Test5()
Dim MyDate As Date
Dim MyDay As Integer
Dim MyMonth As Integer
Dim StartMonth As Integer
MyDay = 0
MyDate = InputBox("年月を半角で入力してください(例:2005/12)" _
& Chr(13) & "ただし5月の月は処理が中止されます", "年月入力")
StartMonth = Month(MyDate)
MyMonth = Month(MyDate)
Do While StartMonth = MyMonth
If MyMonth = 5 Then Exit Do
MyDay = Day(MyDate)
MyDate = MyDate + 1
MyMonth = Month(MyDate)
Loop
If MyMonth = 5 Then
MsgBox "5月の月ですので処理を中止します"
Else
MsgBox StartMonth & "月の最終日は" & MyDay & "でした"
End If
End Sub
●指定した回数だけ処理を繰り返すステートメント For・・・・Next
For 変数 = 初期値 To 最終値 Step 加算値
処理
Next 変数(この変数は省略可です)
例
Sub test6()
Dim n As Integer
For n = 1 To 10 Step 2 '2加算することにより奇数入力になります
Cells(n, 1) = n
Next n
End Sub
結果 ワークシートの1列目の1行目に1 3行目に3 5行目に5・・・9行目に9
●繰り返し処理の強制処理・・・Exit For
例
Sub test7()
Dim n As Integer
Dim x As Integer
x =InputBox("半角数値で10までの数を入力してください")
For n = 1 To x Step 2 '2加算することにより奇数入力になります
if x > 10 then Exit For
Cells(n, 1) = n
Next n
if x > 10 then
MsgBox "数が10を超えていますので処理は中止されました"
End if
End Sub
●配列を利用した繰り返し処理・・・For Each 〜 Next
配列内の各要素に順に値を代入したり、あるいはオブジェクトに対して
処理を実行したいときに使用します
For Each 変数 In 配列名 又は オブジェクトコレクション名
処理
Next 変数(省略可)
例 配列の場合
x(9)の配列に1〜10の数値を代入し、その合計を求めるプログラムを
作ります。答えが55になれば正解ですね^^
Sub Test8()
Dim x(9) As Integer
Dim i As Integer
For i = 0 To 9
x(i) = i + 1
Next
i = 0
For Each n In x
i = i + n
Next
MsgBox "合計は" & i & "でした"
End Sub
例
.ブジェクトコレクションの場合
Dim myCtrl As Controls
For Each myCtrl In Controls
If TypeName(myCtrl) = "ComboBox" Then _
myCtrl.Value = vbNullString
Next
◆ ワークシートで使う場合
セルA1〜A10まで連続した1〜10までの数を代入し
セルA10で合計を求めるプログラムをつくります
Sub Test9()
Dim MyR As Range
Dim i As Integer
Dim n As Integer
Range("A1:A11").ClearContents
n = 0
i = 0
For Each R In Range("A1:A10")
i = i + 1
R.Value = i
n = n + i
Next
Range("A11") = n
End Sub
●実行を制御するステートメント GoTo
プログラムを実行していくうえで、任意の箇所へジャンプしたいとき
これを使います
Goto ジャンプ先名
・
・
・
ジャンプ先名:
プログラムを作成していると、その箇所で条件によっては、ジャンプをして
プログラムの流れをかえたいときが出てきます
そんなときに この Goto ステートメントを使います
Sub Test10()
Dim MyR As Range
Dim i As Integer
Dim n As Integer
Range("A1:A10").ClearContents
n = 0
i = 0
For Each R In Range("A1:B11")
i = i + 1
R.Value = i
If i = 5 Then GoTo 途中経過
戻る:
n = n + i
GoTo junp
途中経過:
R.Offset(, 1) = n
GoTo 戻る
junp:
Next
Range("A11") = n
End Sub
Gotoステートメントを使うと、プログラムが複雑になりやすいので
よく流れを掴んで使いましょ^^
●GoSub...Return ステートメントの使用例
次の例は、GoSub ステートメントを使って、Sub プロシージャの中でサブルーチンを
呼び出します。サブルーチンの中に記述された Return ステートメントは、
Sub プロシージャに制御を戻し、GoSub ステートメントの直後のステートメントから
処理を再開します。
Exit Sub ステートメントは、制御が再びサブルーチンに渡されるのを防ぎます。
Sub GosubDemo()
Dim Num
' ユーザーに数値を入力させます。
Num = InputBox("2 で除算する正の数を入力してください。")
' ユーザーが正の数値を入力した場合のみ、サブルーチンに分岐します。
If Num > 0 Then GoSub MyRoutine
Debug.Print Num
Exit Sub ' Exit Sub でエラーを防止します。
MyRoutine:
Num = Num/2 ' 除算を実行します。
Return ' GoSub ステートメントの直後の
End Sub ' ステートメントに制御を戻します。
その他のステートメント
●Withステートメント
このステートメントは、オブジェクトの再指定を省略するときに使います
次の例は自動マクロの色の設定したときの抜粋ですが、
Range("A1:A5").Select
With Selection.Interior
.ColorIndex = 6
.Pattern = xlSolid
End With
Withステートメントが使用されています。
ただし、対象となるオブジェクトはかならずひとつです。
このステータスを使用することにより、記述も楽に、スッキリした感じに
なりますね
With ○○
With △△
End With
End With
こういうネスト的使用はOKです ^^)
●Optionステートメント
Option Base(ヘルプからの抜粋)
このステートメントは、配列のインデックスの最小値を0にするか1にするか
を決定するステートメントです。
通常は 0 が設定されていますので1にしたいときだけ
Option Base 1
と記述します
※注意
Option Base ステートメントを使用する場合は、このステートメントを
モジュール内のどのプロシージャよりも前に記述する必要があります。
Option Base ステートメントは、モジュール内で一度だけ、次元を含む
配列の宣言よりも前に記述します。
Option Explicit(ヘルプからの抜粋)
モジュール内のすべての変数に対して、明示的な宣言を強制します。
モジュール レベルで使用します。
Option Explicit ステートメントを使う場合は、モジュール内のどの
プロシージャよりも前に記述する必要があります。
モジュールで Option Explicit ステートメントを記述する場合、
変数は、Dim、Private、Public、ReDim、Static などの各ステートメントで
明示的に宣言する必要があります。宣言されていない変数名を使うと、
コンパイル時にエラーが発生します。
Option Explicit ステートメントを使わない場合、Deftype ステートメントで
既定のデータ型が指定されていないと、明示的に宣言されていない変数のデータ型は、
すべてバリアント型 (Variant) になります。
メモ Option Explicit ステートメントを利用して、既存の変数名の入力ミスや、
変数の適用範囲 (スコープ) がわかりにくいコード内で変数名の競合を
避けることができます。
Option Private ステートメント(ヘルプからの抜粋)
複数のプロジェクト間で参照可能なホスト アプリケーションにおいて
Option Private Module ステートメントを使うと、プロジェクトの外部から
モジュールの内容が参照できなくなります。
記述は Option Private Module です
Option Private ステートメントを使用する場合、モジュール レベル内の
どのプロシージャよりも前に記述します。
モジュールに Option Private Module ステートメントが含まれている場合でも、
モジュール レベルで宣言されているパブリックな要素、
たとえば、変数、オブジェクト、およびユーザー定義型は、モジュールを含む
プロジェクト内で使用できます。
ただし、ほかのアプリケーションまたはプロジェクトでは、使用できません。
Microsoft Excel では、複数のプロジェクトの読み込みが可能で、
Option Private Module ステートメントを使用してプロジェクト間の参照を
制限できます。
Visual Basic では、複数のプロジェクトの読み込みは可能ですが、
プロジェクト間での参照は許可されていません。
● On Error ステートメント
エラー処理ルーチンを有効にし、プロシージャ内でのエラー処理ルーチンの位置を
指定します。エラー処理ルーチンを無効にするときに使うこともできます。
構文
On Error GoTo line
On Error Resume Next
On Error GoTo 0
On Error ステートメントの形式は次のとおりです。
ステートメント 内容
On Error GoTo line 引数 line に指定した行から始まるエラー処理ルーチンを有効にします。
引数 line は必ず指定します。
引数 line には任意の行ラベルまたは行番号を指定します。実行時エラーが生成されると、
ここで設定したエラー処理ルーチンにプログラムの制御が移り、エラー処理ルーチンが
アクティブになります。
引数 line に指定する行は、On Error ステートメントと同じプロシージャ内に
存在しなければなりません。この制限に従わなければ、コンパイル時エラーが発生します。
On Error Resume Next 実行時エラーが発生してもプログラムを中断せず、
エラーが発生したステートメントの次のステートメントから実行を継続します。
オブジェクトを操作する場合は、On Error GoTo ステートメントではなく、
このステートメントを使ってください。
On Error GoTo 0 現在のプロシージャに含まれる使用可能なエラー処理ルーチンを
無効にします
To be Continued …
05/12/16 作成
06/01/09 その他のステートメント追加^^
【HOME】 【INDEX】 【第1回】 【第2回】 【第3回】 【第4回】【第5回】 第6回