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。 カラーインデックス表を作るヤツです。思い出してください。
コイツのマクロの中身は、こんなんでしたね↓※2。
コレ↑書くの、大変だったでしょう。
…他人事みたいに言ってスミマセン(笑)。
でも、大変だったと思うんですよ。
20コもあるし。
・
・
そう、だけど、たしかに20行処理するんだけど、やってることは一緒なんだよね。
値が「1」違うだけで※3。
であれば、何とかならないものか…。
同じようなマクロを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
これで出来上がりです。先日2×20行をちまちま書いていたのが、これでできちゃうんです。
その分、初登場のワードもたくさん出てきましたけど…。
なにはともあれ、コイツ↑を動かしてみましょう。
一旦Excelをまっさらにして…※5
今書いたマクロを動かすと…※6
こないだと同じ、色番号20までの一覧が出来上がります※7。
うまくいきました?
画面のようにならないときは、マクロをスペルミスしてる可能性が高いので、
もう一度チェックしてみてください。
変数
さて、問題はこのマクロの中身ですよね。
このマクロのキモが記号「 i 」にあることは、なんとなくわかっていただけると思います。
…そう。このマクロの全体像をかんたんに説明すると、
「 i が1から20まで1コずつ増えるので、そのあいだこれこれの処理をしてください」
ということなんです※8。
要するに、「1から20まで」の部分を、記号「 i 」が担当してくれる、ってワケ。
このときの「 i 」を「変数」と言います。
なので、前々回のマクロで「1~20」と増えていった部分を、「 i 」に置き換えてやります※9。
そうそう、「Cells(i, 1).Value = i」の列番号「1」は、変数に置き換えなくて良いですよ。数字のまんまで※10。
ここは増加しなくて良い(というか、増加しちゃまずい)ですもんね。
同様に、列番号「2」も数字のまま。
オケイ?
ハイ。では次に、「変数 i の値が1コずつ増える」という命令を書きます※11。 その部分にあたるのが、例の「i = i + 1」です。
「i = i + 1」…、うーん、やっぱり、何となく違和感のある式ですね(笑)。 VBAの世界ではこの式で「変数 i の値が1増える」って意味なんですが…、えーと、こんなふうに考えてみてください。 右辺の「 i 」は「これまでの i 」、左辺の「 i 」は「これからの i 」。 新しい「 i 」は、古い「 i 」に1足した値なんだ、と※12。
…うーん、あんまりうまい説明ではなかったですね(笑)。 まあ、とりあえず、「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」のあいだをプロシージャはぐるぐるしてくれます。
つまり、こうなるってワケ※14。
ループ処理の仕組みができました。
…だけどね、このままだと、このプロシージャはどこで終わっていいかわからない。
終点を決めてやらないと、延々とループし続けることになってしまいます。
終わりは「20まで」でしたね。
だから、「until i > 20」と書いてやります。
書く場所は、「do」のとなりです※15。
これで、おしりが決まりました。 「until」は「~まで」って意味でしたね。
…ですが、さらに。
実は、このままだと、変数「 i 」のスタート地点もわからないんですよ。
i は「1」から始めたいので、はじめに「 i = 1 」と書いてやってください※16。
おおっと!
「Do...Loop」の中に書いちゃダメですよ。
外です、外。
「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 "を整数として使うことを宣言します」ぐらいの意味になります。
もちろん、変数の記号として「 m 」を使いたい場合は「 dim m as integer」に、 「 suuji 」を使うときは「dim suuji as integer」になりますからね。
挙動追跡
これで、今度こそ、マクロ記述は完成です。 では、マクロの挙動を、順を追って見ていきましょう。
まず、「変数 i を使う」という宣言がされます。
これによって、「 i 」という記号を使うことが許されます。
次に、「 i = 1 」によって、 i に1が格納されます※18。
なので、差し当たりこれ以後は「 i = 1 」として進行します。
そうして、1回目のループ。
「 i = 1 」として、「セルに値を入れる」「色を塗る」という処理がなされます。
そして例の「 i = i + 1 」のところで、 i に「 2 」が上書きされます※19。
「 i = 2 」となったところで、
「Loop」とぶつかるので、プロシージャは一旦「Do」まで戻ります。
そして、「セルに値を入れる」「色を塗る」という処理を、今度は「 i = 2 」として進めます。
最後に、再び+1されて※20、またまた「Do」のところにループします。
以降、3、4、5…と同様の繰り返しです。
ターニングポイントになるのは、 i が20のときです。 「セルに値を入れる」「色を塗る」は無事に完了するんですが、 プロシージャの最後で i が「 21 」になります※21。
ここで一旦「Do」に戻る、のですが、「Until i > 20」という規定にそぐわないため、ここでループ処理は終了。
以降の処理は行われません※22。
つまり、「Do...Loop」くるくるは、これでおしまい、ってワケ。
以上!今回のマクロの説明終了! 我ながら長かった…。
ハイ!では、課題。
「色番号56までの一覧」を作ってみてください。
今となっては、もうかんたんですね。
・
・
そう。「56まで」にしてやれば良い※23 ※24。
…そうそう。 i = i + 1のところの、「 + 1」を「 + 2 」にしてやると、こんな感じになります※25 ※26。
…いかがでしたでしょうか。
これまで、正直マウスでもできるような操作ばっかりでしたので、「VBAってつまらないな…」という印象をもたれかねない感じでしたが、今回はマクロっぽい話だったと思います。
次回は「罫線を引く」をテーマにお送りする予定ですので、お楽しみに。