Loop

今回は反復処理について説明します。

反復処理とは

繰り返し処理」または「ループ処理」とも呼ばれ、指定した条件が成立するまであるいは満たしている間、同じ処理を繰り返します。前回、条件分岐の一種と書きましたが、別種とみなされることもあります。私は「条件に応じて処理を行う」という意味で、同種と考えています。

反復処理は、次の2つに分けられます。

  • For~Next:条件が成立するまで(指定した回数だけ)処理を繰り返します。
  • Do~Loop:条件を満たしている間、処理を繰り返します。

For~Next

書式は次のとおりです(グレーの箇所は省略可能)。

For カウンター変数 = 開始値 To 終了値 Step ステップ値
     処理
Exit For
     処理

Next 変数

  • カウンター変数:現在の回数を保持するカウンターです。整数値(Integer型)が一般的です。
  • 開始値:カウンターの初期値
  • 終了値:カウンターの終了値。この値に達すると処理が終了します。
  • ステップ値:通常、カウンターは1ずつ増加されます(整数の場合)。ステップ値を指定すると、指定した値の分だけ増加されます。また負の値をしていすると、カウントダウンさせることができます。
  • Exit For:繰り返し処理を中断し、ループを抜けることができます。

* Nextの後にカウンター変数を記述することもありますが、これはコードが入り組んでいる場合などに「For~Next」の範囲を明確にするためで、記述の有無は処理に影響しません。各人の好みです(私は省略しています)。

例)文字と文字の連結を4回実行します。

Public Sub test()

Dim strMojiA As String
Dim strMojiB As String
Dim intCount As Integer

intCount = 0    'カウンターを0に初期化
strMojiA = "あ" '最初の文字を「あ」にする
strMojiB = "た" '加える文字を「た」にする

For intCount = 1 To 4  '4回繰り返す
   strMojiA = strMojiA + strMojiB
Next

End Sub

(Public は不要です)

以前説明したVBエディターのウォッチウィンドウで、値の変化を確認します。1行ずつF8キーを押しながら、特にintCountの値を確認してください。

1回目の処理

Screen021401

4回目の処理の終了時

Screen021402

初期設定「0」の値が「For」の行で「1」増加し、4回目の処理が終わった後、「For」の行で「5」になると処理を終了します(For~Nextの間の処理は行われない)。

このように「For~Loop」は、「行数」や「文字数」の分だけ処理を繰り返す場合など、繰り返す回数が分かっている場合に有効な処理です。

回数が不明の場合は、次の「Do~Loop」を使います。

Do~Loop

書式は次のとおりです。

Do While/Until 条件
     処理
Exit Do
     処理

Loop

  • While:条件がTrue(真)の間(False(偽)になるまで)、処理を繰り返します。
  • Until:条件がTrue(真)になるまで(Faule(偽)の間)、処理を繰り返します。
  • Exit Do:処理を中断し、ループを抜けます。

文書内にある特定の文字列すべてに対して(見つかる間は)同じ処理を繰り返すなど、処理を何度繰り返すか不明な場合に使用します。

例:変数が20を超えるまで処理を繰り返す

Sub TestDoLoop()

Dim intNum As Integer

intNum = 1

Do While intNum < 20
     intNum = intNum * 3
Loop

End Sub

今回はスクリーンショットを載せません。値を変えたり、条件や式を変更して、実際にどう処理され値が変化するかを自分で確認してみてください。
また、上の例で、WhileをUnitlに変え、条件を「intNum > 20」とすると、値が20未満の間は処理を繰り返す」という意味になります。

条件について

条件は正しく指定する必要があります。
間違った条件を指定した場合、反復処理が行われなくなったり、ループから抜けられなくなる(無限ループ)ことがあります

上記の例で、次のように変えてみます。

Do While intNum > 20:反復処理が行われません。最初から条件がTrueのため。
Do Until intNum = 20: 無限ループ。「= 20」にはならないため(オーバーフローのエラー)。

以外とミスりやすいので、注意してください。

入れ子について

For~NextDo~Loopも入れ子構造を取ることができます。

While/Untilの省略

条件が単純な場合、「Do While/Until 条件」と1行で記述することができますが、複数行にわたる複雑な条件を使用したい場合、以下のような記述も可能です。

Do
     処理
     If ~ Then Exit Do
Loop

とはいえ、できる限り処理はシンプルになるように心懸けてください。

強制終了(Exit For/Do)

例外処理やエラー処理など、繰り返し処理を強制的に抜け出す場合に使用します。単純な処理ではあまり使用されませんが、上手に使用することで効果的なプログラムを書くことができます。最初は、そのようなものがあるということを覚えておくだけで良いと思います。

その他の反復処理

反復処理には上記の2つ以外に次のものがあります。
For Each ~ In ~ Next
While ~ Wend

これらは例文で使用する機会があれば説明したいと思います。

以上で、プログラムの基本的な話は終わりです。
当然、配列やオブジェクトなど、説明していないこともたくさんあります。これらはこれから説明していきますので、まずは基本的なことをしっかりと理解して欲しいと思います。特に、VBEの機能(ウォッチやイミディエイトウィンドウ)を活用して、簡単なプログラムを書いてみたり、他人が書いたマクロを分析するなど、処理がどう為されているのか調べてみてください。理解を深めるとともに面白い発見があると思います。

次回からは、VBAに特化した話をしていきたいと思います。ステートメント、プロパティ、メソッドなどなど。
私自身の頭の整理も必要ですので、ちょっと間を空けるかもしれません。

では、また。

Wordマクロ その7 – 反復処理
タグ:         

コメントしてみる

%d人のブロガーが「いいね」をつけました。