スポンサーリンク

【初心者向け】Excel VBA(マクロ)繰り返し処理入門、Do 文の使い方


どのプログラミング言語であれ、はじめてプログラミングを勉強している方が挫折しやすいのが、繰り返し(ループ)処理です。

同じことを何回も繰り返すというのはプログラミング独特の概念なので、

最初はなかなか分からず慣れるのに時間がかかります。

さて、今日は Excel VBA(マクロ)での繰り返し処理入門ということで、Do 文の使い方についてじっくりと解説します!

こちら↓の記事では同じく繰り返し処理である For 文について解説しています。

For 文と Do 文 合わせて基礎を身に付けて、「繰り返し処理の壁」を突破して頂きたいと思います。

それでは行ってみましょう!

スポンサーリンク

1.繰り返し処理の題材

Do 文を使うための題材を用意します。

次のように、最初セル A1 ~ A10 に 10、20、30、、、、と数字が入力してあるものとします。

題材

VBA を使って、セル B1 ~ B10 に次のように数字を並べたいと思います。

アウトプット

さて、さっそくはじめたいと思います。

Alt + F11 を押してVBE(エディタ)を開いてから、Alt → I →  M を押して標準モジュールを挿入しましょう!

VBE(エディタ)f

ここ↑ に VBA コードを書き込んでいきます。

2、Do 文の使い方

さて、上記の題材のとおりに B1 ~ B10 に数字を並べる VBA コードは以下のようになります↓

プロシージャ名は test としました。

Do 文のルールを覚えましょう。

Do 文は次のように記述して使います。

Do While 条件
  繰り返したい処理
Loop

最初の行に Do を記述し、最後の行を Loop で締めます。

そして、Do と Loop の間に繰り返したい処理を書き込みます。

Do 文を理解するために必要なポイントをあげると以下のようになります↓

ポイント1: Do 文よりも前で変数を指定する
ポイント2: どういう場合に処理を繰り返すか? をはっきりさせる
ポイント3: 繰り返し処理の法則を見つけ出す
ポイント4: 変数を忘れずに増やす

ポイント1: Do 文よりも前で変数を指定する

Do 文を使う場合、繰り返し処理のために変数を使わなければいけません。

そのための変数としてよく使われるのは i、j、k あたりです。

今回は i を使いました。

*はじめての方は、この時点では何をやろうとしているのか訳が分からないかも知れませんが、順番に説明していきますのでお付き合い下さい(^^)

さて、まず Do 文がはじまる前で必ず変数 i を指定しておきます。

i = 1 とします。

変数iの指定

i は必ず 1 にしておかなければならないわけではありません。

ただ、1 にしておいた方が色々と使いやすいんです。

とりあえず、最初に変数 i = 1 とすると覚えてしまって下さい!

そして、この i が後々繰り返し処理をするごとに 1つずつ増えていきます(2、3、4、5、、、、と)。

ポイント2: どういう場合に処理を繰り返すか? をはっきりさせる

次にどういう場合に処理を繰り返すか? という繰り返し処理の条件をはっきりさせます。

For 文の場合は何回処理を繰り返すか回数を決めますが、Do 文の場合は回数を決めることはできません

繰り返しの条件

さて、どういう場合に処理を繰り返すか? を表しているの上記の赤枠の中になるわけです。

While は日本語にすると「~する間」という意味になります。

While Cells(i, 1) <> “”

で「Cells(i, 1) <> “” である間」ということになるわけですね!

そして、これ↑ が繰り返し処理の条件となります。

「Cells(i, 1) <> “” である間」は処理を繰り返すという意味になります。

Cells(i, 1) は A列(1列目)のセルを表しており、i の値によって行番号が変わってきます。

繰り返す

Cells(i, 1) <> “” というのは、A列が空白ではないことを表します(<> はノットイコールの意味)。

今回、A列をしらべるために i を 1 つずつ増やしていき、A列が空白ではない間は処理を繰り返しています。

なお、先にお話ししましたように Do の行と Loop の行はワンセットで使います。

最初に

Do While Cells(i, 1) <> “”

と記述したら、すぐ後に

Loop

と書いてしまいましょう!

これで最後に Loop と記述することを忘れずにすみますので。

ポイント3: 繰り返し処理の法則を見つけ出す

さて、Do と Loop の間に繰り返したい処理を書いていきます。

Do While Cells(i, 1) <> “”
  繰り返したい処理
Loop

今回の繰り返し処理は以下の赤枠の部分になります。

繰り返し処理

さて、今回繰り返し処理をなぜ上記のようにしているか説明しますね。

今回は B1 ~ B10 に以下のように数字を並べたいわけですね。

5、10、15、20、25、、、、と

どのようにすれば i を使ってそれを実現できるか考えます。

最初 A列の数字しかないわけですが、その A列の値 Cells(i, 1) を2分の1すれば良いことが分かりますでしょうか。

以下のように割り算をすることで、B列にA列の値を2分の1した値を表示できます。

Cells(i, 2) = Cells(i, 1) / 2

このように、変数 i をどう使えばやりたいことを達成できるか? 元の題材を見て考えて、法則を見つけ出すようにしましょう!

ポイント4: 変数を忘れずに増やす

さて、上記の繰り返し処理に含まれる以下の部分を忘れないようにしましょう!

i = i + 1

これを記述し忘れると、無限ループになって処理が終わらなくなってしまいます。

って言われてもよく分からないですよね(^^)

順を追って説明します。

まず、i = i + 1 という記述がよく分からないと思います。

左辺が i で右辺が i + 1 って等しくないのに、なぜ =(イコール)なんだろう?

って思いますよね。

この記述の仕方はプログラミング独特のもので、これで i を 1つずつ増やすという意味になるのです。

プログラミングの世界では、左辺の i と右辺の i は別物なのです。

●左辺は 次の i

右辺は 今の i

という意味になるんですね。

i = i + 1 を書きかえると以下のようになります。

i(次の i) = i(今の i) + 1

ですので、i = i + 1 の意味するところは「次の i 今の i に 1足したもの

言い換えれば、i を 1つずつ増やしていくということになるのです。

i = 1 からはじまって i が1つずつ増えていくと Cells(i,1) で表される A列を1行目から順番に見ていくことになるわけです。

そして空白になるまで、1行1行処理を繰り返していきます。

1行ずつ処理

さて、i = i + 1 の記述がもしなかった場合、i は最初に指定した 1 のままということになりますよね。

そうなると、どういう場合に処理を繰り返すか? を表す条件は「While Cells(1, 1) <> “”」となり、Cells(1, 1) が空白でない限り処理を繰り返すという意味になってしまうんですね。

Cells(1, 1) すなわちセル「A1」には 10 が入っているので空白ではありません。

ずっと、Cells(1, 1) だけを見て処理を永遠に繰り返すことになってしまいます。無限ループです。

こうなってしまったら Ctrl + Alt + Delete でタスクマネージャーを起動して強制終了するほか無くなってしまいます(><)

Do と Loop の間に i = i + 1 の記述を忘れないようにしましょう!

3、まとめ

Do 文の基礎的な使い方について説明しました。

For 文もあわせて参考にして下さい↓

なお、今回は「Do While」と書くことで「~の間」処理を繰り返すというコードにしましたが

While 以外にも Until(~になるまで)を使うこともできます。

これについては今回は詳しくは説明しません。

While の方がピンとくると思うので、まずは基礎の基礎として「Do While」と記述する場合を覚えて下さい。

Excel VBA についてのメニューも提供させて頂いておりますのでよろしければ ↓

◆Excel シートのオーダーメイド
◆Excel、マクロ(Excel VBA) のマンツーマンレッスン

編集後記

この週末(9/29 ~ 30)は、未開封だったガジェットをいくつか使い始めました。

まずはこれ↓ Logicool 製のトラックボールマウスです。

効率化アイテムとして色んな人が勧めているので使ってみることにしました。

マウスのカーソルの位置を手の動きではなく、親指でボールをコロコロ回して動かすことができるものです。

トラックボールマウス

とりあえず画面の左端から右端に一瞬でカーソルを移動できるところは便利かなと思いますね。

そしてこれ↓ ELECOM 製の USB ハブです。

今の PC Surface Laptop は USB ポートが1つしかないのでたまに不便でした。これでUSB ポートを4つに増やすことができました。

USBHUB