[PR]馳凡g\
g選


【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回