PRIMG0001
 毎週金曜日、プログラミングのちょっとした講座を記しています。
 ここでは、小学校から「プログラミング」が必須項目になってしまったため、お父さん・お母さん・おじいちゃん・おねえちゃんが子供に「プログラミング」教えることができるように、ここでこっそりと勉強してしまおうという企画です。
 今週は「処理の移動」と「繰り返し処理」を説明します。
まずはいつも使用しているプログラムを使って説明していきます。

Sub 表示1()
 dim moi01 as string
 moji01 = "Hallo word!"
 MsgBox moji01

 dim moi02 as string
 moji02 = "Hallo japan!"
 MsgBox moji02

End Sub

 このプログラムは「Hallo word!」と「Hallo japan!」を表示させるプログラムです。このプログラムで、「Hallo word!」を飛ばして、「Hallo japan!」を表示させるためにはどうしたら良いでしょうか?

 dim moi01 as string
 moji01 = "Hallo word!"
 MsgBox moji01

の部分を消せば良いのですが、この部分も後から使うために、一時的に飛ばしたいといった場合はさてどうしましょう?
 その場合「goto」という命令を使用します。使用方法は「goto ラベル」です。このラベルというのは飛ばしたい場所の頭に「ラベル」というものを付けます。ラベルの名前は何でも良いです。ラベルの書き方は「ラベル:」とラベルの後ろに半角の「:」を付けます。

 つまり
 goto Label1


label1:
ということになります。これを使って上記のプログラムから先ほどの場所を飛ばしてみましょう。


Sub 表示1()
 dim moi01 as string

 goto label1

 moji01 = "Hallo word!"
 MsgBox moji01

 label1:
 dim moi02 as string
 moji02 = "Hallo japan!"
 MsgBox moji02

End Sub

 となります。ラベルは「goto」の上でも下でも良いです。ラベルを付けることによって処理を上にも下にも移動できます。また、「goto」の命令に「On Error GoTo ラベル名」というのがあります。これはエラーが起こった場合にラベルに移動するという使い方になります。
 例えば、一番最初のプログラムにエラーが起こった場合「エラー」と表示させる場合をご紹介します。
 エラーの場合の処理のモジュール(部分)に「err01」というラベルを付けて次のようにします。

 err01:
 dim moi03 as string
 moji03 = "エラー"
 MsgBox moji03

これをプログラムに組み込みます。

Sub 表示1()
 dim moi01 as string
 moji01 = "Hallo word!"
 MsgBox moji01

 dim moi02 as string
 moji02 = "Hallo japan!"
 MsgBox moji02

 err01:
 dim moi03 as string
 moji03 = "エラー"
 MsgBox moji03

End Sub

 そして、エラーが起こった場合に表示させたいので「On Error GoTo」を組み込みますが、この場合はプログラムのどこでエラーが起きてもいいように、プログラムの一番最初に入れます。

Sub 表示1()

On Error GoTo err01
 dim moi01 as string
 moji01 = "Hallo word!"
 MsgBox moji01

 dim moi02 as string
 moji02 = "Hallo japan!"
 MsgBox moji02

 err01:
 dim moi03 as string
 moji03 = "エラー"
 MsgBox moji03

End Sub

 これで一見良いように見えますが、このまま実行させると、プログラムは順番に処理しますので、エラーが起きていなくても「エラー」が表示されてしまいます。そこで、「err01」の前に処理を終了させる必要があります。その場合は「exit sub」という命令を使用します。これは「ここで強瀬的にプログラムを抜け出しますよ」という命令です。これを「err01」の前につけます。
Sub 表示1()

On Error GoTo err01
 dim moi01 as string
 moji01 = "Hallo word!"
 MsgBox moji01

 dim moi02 as string
 moji02 = "Hallo japan!"
 MsgBox moji02
 
 exit sub
 
 err01:
 dim moi03 as string
 moji03 = "エラー"
 MsgBox moji03

End Sub

となります。また、「exit sub」を使わない方法として、「exit sub」のところに「goto」文を入れて、「End Sub」に強制的に飛ばすという方法もあります。その場合は次の通りです。

On Error GoTo err01
 dim moi01 as string
 moji01 = "Hallo word!"
 MsgBox moji01

 dim moi02 as string
 moji02 = "Hallo japan!"
 MsgBox moji02
 
 goto label02
 
 err01:
 dim moi03 as string
 moji03 = "エラー"
 MsgBox moji03

 label02:
End Sub


これが処理の移動になります。

 次に「繰り返し処理」を説明します。「繰り返し処理」はプログラムの中では「ループ」といった言葉で表現されることがあります。このループの方法は3つの方法があります。その方法は「条件が成立している間」と「条件が成立するまで」と「指定回数」という3つの方法があります。

 まずは、「条件が成立している間」のループは「do while」という命令です。「Do While 条件」という使い方で、ループ間の最後に「Loop」を付けます。

Sub 表示1()
 dim moi01 as string
 moji01 = "Hallo word!"
 MsgBox moji01

 dim moi02 as string
 moji02 = "Hallo japan!"
 MsgBox moji02

End Sub

 このプログラムで、最初の3回は「Hallo word!」を表示させ、その後、「 Hallo japan!」を表示させる場合を考えてみましょう。
 まずは、回数を数えなければならないので、カウントする変数をこれに挿入します。このカウントする変数を「cnt01」とします。「cnt01」はカウントするので「整数」で良いです。これを挿入します。

Sub 表示1()
 dim cnt01 as integer

 dim moi01 as string
 moji01 = "Hallo word!"
 MsgBox moji01

 dim moi02 as string
 moji02 = "Hallo japan!"
 MsgBox moji02

End Sub

 そして、「cnt01」に初期値を入れます。カウントは「1」から数えますので、「cnt01」に「1」を入れましょう。

Sub 表示1()
 dim cnt01 as integer
 cnt01 = 1

 dim moi01 as string
 moji01 = "Hallo word!"
 MsgBox moji01

 dim moi02 as string
 moji02 = "Hallo japan!"
 MsgBox moji02

End Sub

 次に、3回「Hallo word!」を表示させるためにループの命令を組み込みます。3回というのが4より小さい場合になりますので、次のようになります。
Sub 表示1()
 dim cnt01 as integer
 cnt01 = 1

 dim moi01 as string
 moji01 = "Hallo word!"

 do while cnt01 < 4
  MsgBox moji01
 loop

 dim moi02 as string
 moji02 = "Hallo japan!"
 MsgBox moji02

End Sub

 ここで実行してしまうと、実は大変なことになります。「cnt01」の値が変わることがないので、ループの中をぐるぐる回り続け、ループから抜け出せなくなります。これを「無限ループ」と呼びます。ループの処理で一番怖いのがこの「無限ループ」です。今回は分かりやすい状態ですが、プログラムが複雑になると、意図もしない無限ループが発生してしまう場合があります。この場合強制的にプログラムを終了させるにはCtrl + Breakキーを押すと終了します。
 このループの中で、「cnt01」でカウントしなければならないので、「cnt01」の値をひとつ増やさなければなりません。その場合は、「cnt01 = cnt01 + 1」といった小技を使います。これをループに組み込みます。つまり、
Sub 表示1()
 dim cnt01 as integer
 cnt01 = 1

 dim moi01 as string
 moji01 = "Hallo word!"

 do while cnt01 < 4
  MsgBox moji01
  cnt01 = cnt01 + 1
 loop

 dim moi02 as string
 moji02 = "Hallo japan!"
 MsgBox moji02

End Sub

となります。

 次に「条件が成立するまで」と「指定回数」を説明したいと思いましたが、ちょっと長くなりそうなので、次の週で説明します。ではまた来週