【VBScript】Windows メモ帳プログラミング入門(第4回)ループ処理

Windows PC

こんにちは、プログラマーのふみです。みなさんはコンピューターでプログラミングができますか?

日本の小学校では、2020年度からプログラミング教育の全面実施が始まります。
そこで、 VBScript(ブイビースクリプト)という言語を Windows 10 に標準搭載されているアクセサリの「メモ帳」に記述して使う、超簡単なプログラミングを4回に分けて紹介しています。

過去の記事はこちら:
【VBScript】Windows メモ帳プログラミング入門(第1回)プログラムの作成と実行
【VBScript】Windows メモ帳プログラミング入門(第2回)命令の順番
【VBScript】Windows メモ帳プログラミング入門(第3回)条件分岐

実行中のVBScriptプログラムを強制終了させる

プログラムを実行すると、コードの打ち間違えや設計ミスによって止まらなくなってしまう事が多々あります。ループ処理で特に起こりやすいです。
そんな時はプログラムを手動で強制的に終了させる必要があります。

サンプルプログラムを起動して待機させる

プログラムの強制終了のしかたは、第2回で紹介した「Hello world」プログラムを使って説明します。
VBScriptのコードは次のとおりです。

MsgBox "こんにちは、世界!"
MsgBox "Hello, world!"

上記のプログラムのvbsファイルが完成したら、早速実行してみましょう。

1回目は日本語のメッセージが表示されます。

この時、プログラムは「OK」を押されるまで1行目で待機状態になっています。
これを強制終了させます。

強制終了の手順

Windows 10 のタスクバーを右クリックして、「タスク マネージャー(K)」をクリックします。

タスク マネージャーの「プロセス」タブが表示されます。
「アプリ」の項目に「Microsoft ® Windows Based Script Host」があるので、これを選択して「タスクの終了(E)」をクリックすると、実行中のVBScriptのプログラムが強制終了します。(「こんにちは、世界!」のメッセージが消え、英語のメッセージ「Hello, world!」は表示されません。)

タスク マネージャーのウィンドウは右上の「×」をクリックして閉じます。

For~Nextを使ったプログラム

まずは、「For ~ Next」でループ処理する方法をサンプルプログラムで紹介します。
「For ~ Next」は有名なループ処理の構文です。

次のコードのプログラムを作成して実行してみましょう。

Option Explicit '変数宣言の強制
Dim lngCNT 'ループカウンターの変数
Dim strTXT 'テキストの変数

For lngCNT = 1 To 3
    strTXT = strTXT & "こんにちは、世界!"
Next

MsgBox strTXT

このプログラムを実行すると、「こんにちは、世界!」が3つつながったメッセージが表示されます。

「For」の後ろの変数lngCNTは1から始まり、1ずつ増えて、3になったときまで「For~Next」の処理が実行されます。(ループを抜けたとき、変数lngCNTは4になっています。)
「For ~ Next」の処理が3回繰り返された為、変数strTXTに「こんにちは、世界!」の文字が3回追加され、最後のMsgBox関数で変数strTXTの内容がメッセージで表示されます。

「For ~ Next」はVBAでも同じ記述のしかたです。

テキストの改行

先ほどのプログラムは3つ横につながったメッセージが表示されましたが、長文になるとメッセージが読みづらくなります。
そこで、テキストを改行する方法を紹介します。

次のコードのプログラムを作成して実行してみましょう。

Option Explicit '変数宣言の強制
Dim lngCNT 'ループカウンターの変数
Dim strTXT 'テキストの変数

For lngCNT = 1 To 3
    If lngCNT = 1 Then '1回目の処理
        strTXT = "こんにちは、世界!"
    Else '2回目以降の処理
        strTXT = strTXT & vbCrLf & "こんにちは、世界!"
    End If
Next

MsgBox strTXT

このプログラムを実行すると、「こんにちは、世界!」が3つ、改行されてメッセージが表示されます。

vbCrLf
改行文字列です。
正確にはキャリッジ リターン「Chr(13)」とライン フィード「Chr(10) 」の組み合わせで、「Chr(13) & Chr(10) 」の記述に置き換えることができます。
VBAでも使用できます。

Do~Loopを使ったプログラム

次は、「Do ~ Loop」でループ処理する方法をサンプルプログラムで紹介します。
「Do ~ Loop」も有名なループ処理の構文です。

次のコードのプログラムを作成して実行してみましょう。

Option Explicit '変数宣言の強制
Dim lngCNT 'ループカウンターの変数
Dim strTXT 'テキストの変数

Do Until lngCNT = 3
    lngCNT = lngCNT + 1
    If lngCNT = 1 Then '1回目の処理
        strTXT = "こんにちは、世界!"
    Else '2回目以降の処理
        strTXT = strTXT & vbCrLf & "こんにちは、世界!"
    End If
Loop

MsgBox strTXT

このプログラムを実行すると、「テキストの改行」で紹介したサンプルプログラムと同じ動作をします。
「Do」の後ろ、「Until」はループを終了する条件で、指定された条件(lngCNT = 3)に合致すると「Loop」の次の処理に移ります。
このサンプルプログラムでは、変数lngCNTは0から始まり、1ずつ増えて、2まで「Do~Loop」の処理が実行されます。Untilの条件(lngCNT = 3)は処理しません。

ちなみに、「Until」を「While」に変えると、ループを継続する条件に代わります。
ループの条件は「Loop」の後ろに記載することもできます。

テキストに含まれる改行を数える

条件を上手に設定すると、ループカウンターを使わないでループを制御することもできます。

次のコードのプログラムを作成して実行してみましょう。

Option Explicit '変数宣言の強制
Dim strTXT 'テキストの変数

Do
    If strTXT = "" Then '1回目の処理
        strTXT = "こんにちは、世界!"
    Else '2回目以降の処理
        strTXT = strTXT & vbCrLf & "こんにちは、世界!"
    End If
Loop Until Ubound(Split(strTXT, vbCrLf)) = 2

MsgBox strTXT

このプログラムを実行すると、先ほどのサンプルプログラムと同じ動作をします。
ここではLoopの後ろに条件を記述しています。
「Split(strTXT, vbCrLf)」は変数strTXTを改行の数で区切って分割(配列化)しています。
「Ubound(~)」は配列の最大値を返す関数です。2つを組み合わせる事で、変数strTXTの改行文字列の数を返しています。
つまり、ループの終了条件は「変数strTXTにvbCrLf(改行)が2個含まれる」になっています。
ループの終了条件を変えることによって、同じ動作でもループカウンターを不要にしています。

今回使用した関数について

今回使用した関数はVBAでも使用できます。

Split関数

構文
Split( Text, Separator )

テキスト「Text」を配列化するときに使う関数です。「Separator」に設定した文字で区切って分割、配列化します。
Split関数で作られる配列の次元は1です。
配列の最大値は「Separator」に設定した文字で分割できなかったときは「0」、1回分割できたときは「1」、以降は分割が増える毎に「2, 3, …」と増えていきます。

UBound関数

構文
UBound( arrayname, [dimension] )

配列「arrayname」の最大値を返す関数です。次元の上限「dimension」を省略すると1に設定されます。
Split関数で分割した配列を arrayname に設定すると、Split関数の「Separator」に設定した文字の数を返します。

まとめ

  • タスク マネージャーから「Microsoft Windows Based Script Host」を終了させるとVBScriptプログラムは強制終了する。
  • 「For~Next」の最終条件「To」は処理される。
  • 「Do~Loop」のUntil条件は処理されない。
  • 「Ubound(Split( Text, Separator ))」で、テキスト「Text」に含まれる特定の文字「Separator」の数を取得できる。

おわりに

VBScriptのメモ帳プログラミング入門はこれで終了です。
第1回~第4回までご理解いただけましたでしょうか。
すべて理解できたあなたは、すでに優秀なプログラマーです。

これまで、命令の順番(逐次処理)、条件分岐ループ処理について説明しました。
VBScriptだけでなく、多くのプログラムはこの3つの処理の組み合わせで動いています
コンピューター言語によって、記述のしかたが異なるだけです。

オブジェクトの指定等の細かい記述のしかたについては、プログラムを作りながら覚えていけば良いと思います。
コードの記述のしかたがわからない場合、私が学生の頃は書籍で調べるしか方法がありませんでしたが、今はGoogle検索ですぐに調べられます。

会社の定型業務等の単調な作業はすべてVBScriptで処理できるようにプログラミングして、時間を有効活用しましょう。(私が会社員だった頃は、会社のPC起動するだけでプログラムが動作するよう、スタートアップフォルダの中にvbsファイルを保存して定型業務を自動化していました。)

ありがとうございました。

他言語のプログラミング入門の記事はこちら:
【JavaScript】Windows Webプログラミング入門(第1回)プログラムの作成と実行
【JavaScript】Windows Webプログラミング入門(第2回)命令の順番
【JavaScript】Windows Webプログラミング入門(第3回)条件分岐
【JavaScript】Windows Webプログラミング入門(第4回)ループ処理

コメント

タイトルとURLをコピーしました