---topics:変数、ループ処理---

VBA編其ノ5 i = i + 1 ?

今回は、VBAをやってる人にはおなじみなんだけどそうじゃない人にとっては全然そうじゃない、i = i + 1って数式を扱います。
「i = i + 1」って、おかしいですよね? ………えーっと、まず、「i = i + 1は、変だ」って感覚を共有したいんですよ。 世の中には、数式を見ると反射的に思考停止するってタイプの人がいることは僕もなんとなくわかっています。 自分にも心当たりあります。 自分の場合は、なんとかついていけるのは中学生レベルの数式まで。 全然褒められたものではありません。 それ以上はもうお手上げです。 あと、家電の説明書とかもダメ。 アレね、読んでもつまんないし、カタイし、理解できないし。 あとは…、試験要項とかの類もそうですね。 昔、センター試験の願書提出のとき、書き方がわからなくて(というか、読んでも理解できなくて)、イイ年して親に書いてもらった、っていう話は今となっては良い思い出。 だからね、数式の話をしても響かないこともあるってことは重々承知なんだけど、とにかく、i = i + 1はなんです。 だってそうでしょ? 「 2 」と「 2 + 1 」がイコールっていうのは、絶対おかしいですよね? …ね?
…だけど、VBAでは「i = i + 1」っていうのを使うんです。 しかも、けっこうな頻度で。 今回は、この謎の数式「i = i + 1」について触れていきしょう。 この章が終わる頃には…、いや、それだとちょっと早すぎるな…。 でも、まあ、そのうちに、「i = i + 1」が普通になっていると思いますので。

ループ処理

今回扱う題材は、前々回(→其ノ3)やったこのマクロ↓※1。 カラーインデックス表を作るヤツです。思い出してください。

色番号20までの一覧を作るマクロ 一度やりましたね
※1 色番号20までの一覧を作るマクロ 一度やりましたね

コイツのマクロの中身は、こんなんでしたね↓※2

色番号20までの一覧を作るマクロの中の人
※2 色番号20までの一覧を作るマクロの中の人

コレ↑書くの、大変だったでしょう。
…他人事みたいに言ってスミマセン(笑)。 でも、大変だったと思うんですよ。 20コもあるし
 ・
 ・
そう、だけど、たしかに20行処理するんだけど、やってることは一緒なんだよね。 値が「1」違うだけで※3

+1されてるだけで、あとは一緒
※3 +1されてるだけで、あとは一緒

であれば、何とかならないものか…。 同じようなマクロを2×20行も書くの、苦痛でしかないもんね。
こういうときに活躍するのが、「ループ処理」なんです。 ためしにまず、下記のマクロを新しく書いてみてください。 解説は後でしますので、とりあえず書き写す感じで※4

Dim i As Integer

i = 1

Do Until i > 20

Cells(i, 1).Value = i
Cells(i, 2).Interior.ColorIndex = i

i = i + 1

Loop

ループ処理を使って書き直した
※4 ループ処理を使って書き直した

これで出来上がりです。先日2×20行をちまちま書いていたのが、これでできちゃうんです。 その分、初登場のワードもたくさん出てきましたけど…。
なにはともあれ、コイツ↑を動かしてみましょう。 一旦Excelをまっさらにして…※5

結果がわかるよう、一度まっさらな状態に
※5 結果がわかるよう、一度まっさらな状態に

今書いたマクロを動かすと…※6

マクロ起動
※6 マクロ起動

こないだと同じ、色番号20までの一覧が出来上がります※7

こないだと同じ結果になる
※7 こないだと同じ結果になる

うまくいきました?
画面のようにならないときは、マクロをスペルミスしてる可能性が高いので、 もう一度チェックしてみてください。

変数

さて、問題はこのマクロの中身ですよね。
このマクロのキモが記号「 i 」にあることは、なんとなくわかっていただけると思います。 …そう。このマクロの全体像をかんたんに説明すると、 「 i が1から20まで1コずつ増えるので、そのあいだこれこれの処理をしてください」 ということなんです※8

このマクロの全体像
※8 このマクロの全体像

要するに、「1から20まで」の部分を、記号「 i 」が担当してくれる、ってワケ。 このときの「 i 」を「変数」と言います。
なので、前々回のマクロで「1~20」と増えていった部分を、「 i 」に置き換えてやります※9

命令を、変数iを使って書き換える
※9 命令を、変数iを使って書き換える

そうそう、「Cells(i, 1).Value = i」の列番号「1」は、変数に置き換えなくて良いですよ。数字のまんまで※10ここは増加しなくて良い(というか、増加しちゃまずい)ですもんね。
同様に、列番号「2」も数字のまま。 オケイ?

列番号は「1」「2」のママ
※10 列番号は「1」「2」のママ

ハイ。では次に、「変数 i の値が1コずつ増える」という命令を書きます※11。 その部分にあたるのが、例の「i = i + 1」です。

i = i + 1 を書き足した
※11 i = i + 1 を書き足した

i = i + 1」…、うーん、やっぱり、何となく違和感のある式ですね(笑)。 VBAの世界ではこの式で「変数 i の値が1増える」って意味なんですが…、えーと、こんなふうに考えてみてください。 右辺の「 i 」は「これまでの i 」、左辺の「 i 」は「これからの i 」。 新しい「 i 」は、古い「 i 」に1足した値なんだ、と※12

i = i + 1 を解説してみた
※12 i = i + 1 を解説してみた

…うーん、あんまりうまい説明ではなかったですね(笑)。 まあ、とりあえず、「i = i + 1」で覚えちゃってください。

Do...Loopステートメント

次に、今書いた式、すなわち

Cells(i, 1).Value = i
Cells(i, 2).Interior.ColorIndex = i

i = i + 1


が、20まで繰り返し動いてくれれば良いんですよね。 なので、この式を、「Do」と「Loop」ではさんでやります※13。 そうすると、この「Do」と「Loop」のあいだをプロシージャはぐるぐるしてくれます。

くるぐる使い
※13 くるぐる使い

つまり、こうなるってワケ※14

くるくる少女
※14 くるくる少女

ループ処理の仕組みができました。
…だけどね、このままだと、このプロシージャはどこで終わっていいかわからない。 終点を決めてやらないと、延々とループし続けることになってしまいます。
終わりは「20まで」でしたね。 だから、「until i > 20」と書いてやります。 書く場所は、「do」のとなりです※15

20まで、と指示してやる
※15 20まで、と指示してやる

これで、おしりが決まりました。 「until」は「~まで」って意味でしたね。

…ですが、さらに。
実は、このままだと、変数「 i 」のスタート地点もわからないんですよ。 i は「1」から始めたいので、はじめに「 i = 1 」と書いてやってください※16
おおっと! Do...Loop」の中に書いちゃダメですよ。 外です、外。

i は「1」から始まるんでしたね
※16 i は「1」から始まるんでしたね

「Do...Loop」の内側に「 i = 1 」って書いちゃうと、 ループしたときに「 i 」がその都度「1」に戻っちゃうので、外側で。

以上で、マクロのからくり部分はできました。

Dim:変数の宣言

…ですが。 さらにさらに、もう一点だけ。
われわれはこのマクロにおいて、「 i 」という記号を使いたい、と企てました。
変数「 i 」の機能というのは、方程式でつかう「 x 」のことを思い浮かべてもらえればちょうど良いかと思います。 ほら、アレね、「 y = x + 1 」とかのアレ。
だから、使う文字は「 i 」でなくても良いのであって、実は「 m 」でも「 p 」でも何でも良いんです。 さらに、VBAのキーワードとして使われていなければ、2文字以上のことば、例えば「 suuji 」とかでもアリ。 「 i 」というのはわれわれの方で自由に設定したものなんです。 …ですが。
ですが、いきなり使うと、マクロが悩んじゃうんですよ。 「え? " i "って何?」って。 だから、「 i 」という文字を勝手に使うわけにはいかないんです。 そこで、「これから" i "という文字を使いますよ」という宣言をしてやります※17。 それが、このマクロの一番初めに書いた、「dim i as integer」です。
「dim」は「dimension」の略、みたいなんですけど、宣言するときの決まり文句だと思ってください。 「as」は「~として」、「integer」は「整数」という意味です。 だから、「dim i as integer」で、 「" i "を整数として使うことを宣言します」ぐらいの意味になります。

変数を宣言する
※17 変数を宣言する

もちろん、変数の記号として「 m 」を使いたい場合は「 dim m as integer」に、 「 suuji 」を使うときは「dim suuji as integer」になりますからね。

挙動追跡

これで、今度こそ、マクロ記述は完成です。 では、マクロの挙動を、順を追って見ていきましょう。

まず、「変数 i を使う」という宣言がされます。 これによって、「 i 」という記号を使うことが許されます。
次に、「 i = 1 」によって、 i に1が格納されます※18

i に 1 が格納 i = 1
※18 i に 1 が格納 i = 1

なので、差し当たりこれ以後は「 i = 1 」として進行します。
そうして、1回目のループ。 「 i = 1 」として、「セルに値を入れる」「色を塗る」という処理がなされます。
そして例の「 i = i + 1 」のところで、 i に「 2 」が上書きされます※19

i が 2 となり、次のループへ
※19 i が 2 となり、次のループへ

「 i = 2 」となったところで、 「Loop」とぶつかるので、プロシージャは一旦「Do」まで戻ります。 そして、「セルに値を入れる」「色を塗る」という処理を、今度は「 i = 2 」として進めます。
最後に、再び+1されて※20、またまた「Do」のところにループします。

2回戦目はこんな感じ
※20 2回戦目はこんな感じ

以降、3、4、5…と同様の繰り返しです。

ターニングポイントになるのは、 i が20のときです。 「セルに値を入れる」「色を塗る」は無事に完了するんですが、 プロシージャの最後で i が「 21 」になります※21

i = 20 のとき
※21 i = 20 のとき

ここで一旦「Do」に戻る、のですが、「Until i > 20」という規定にそぐわないため、ここでループ処理は終了。 以降の処理は行われません※22
つまり、「Do...Loop」くるくるは、これでおしまい、ってワケ。

20を0.01でもオーバーすると、はじかれる
※22 20を0.01でもオーバーすると、はじかれる

以上!今回のマクロの説明終了! 我ながら長かった…。

ハイ!では、課題。
「色番号56までの一覧」を作ってみてください。 今となっては、もうかんたんですね。

 ・
 ・
そう。「56まで」にしてやれば良い※23 ※24

となりの列に入れるようにしてみました
※23 となりの列に入れるようにしてみました
スクショ小っさいけど、こうなります
※24 スクショ小っさいけど、こうなります

…そうそう。 i = i + 1のところの、「 + 1」を「 + 2 」にしてやると、こんな感じになります※25 ※26

i = i + 2 とすると…
※25 i = i + 2 とすると…
1段飛ばしになる
※26 1段飛ばしになる

…いかがでしたでしょうか。
これまで、正直マウスでもできるような操作ばっかりでしたので、「VBAってつまらないな…」という印象をもたれかねない感じでしたが、今回はマクロっぽい話だったと思います。
次回は「罫線を引く」をテーマにお送りする予定ですので、お楽しみに。

Copyright(C)森田表計算