こんな方に書いた記事です。
- プログラミングを勉強するのはマクロ(エクセルVBA)が初めて
- 初級本を読んで途中からわからなくなった
- まずはルーティン業務の時短が主な目的である(本格プログラミングというよりは、ざっくりと理解しすぐ使いたい)
「プログラミング初心者が練習しながら理解するエクセルマクロ」を初めて読まれる方はこちら
本日のコード&問題
問題①さて、今回は始めから問題です。こんなエクセルがあります。 下記のコードでマクロを実行するとどうなるでしょうか。
(すぐ分かった方は、この記事は読む必要のない方です。(笑))
Sub 足し算()
Dim sht_1 As Worksheet
Dim i As Long
Set sht_1 = ThisWorkbook.Sheets(1)
i = 2
With sht_1
.Cells(1, 2) = .Cells(1, 1)
Do Until .Cells(i, 2) >= 10
.Cells(i, 2) = .Cells(i-1, 2) + .Cells(i, 1)
i = i + 1
Loop
End With
End Sub
早速答えです。
はい、答えは「無限ループ」になります。
このコードは、実行するとずっと待機中(クルクル回り続けます)となります。このまま放っておくと、ずっとPCさんが永久に計算し続けようとし、最終的にはエラーかフリーズになると思われます。
上記のような簡単なマクロでしたら、正しくコードを書けば、あっという間に処理が完了するはずなので、クルクルなった時点で、強制終了しましょう。
(慣れると、クルクルを見てすぐに、あーやっちまったと思うようになります。慌てなくても大丈夫です。)
Ctrl+Alt+Delete → タスクの終了(エクセル)
初心者が間違いを発見するには…
このエラーは、私が初心者本を終え、職場で実践し始めた辺りに起こりました。原因が分からず、1日中エラーの原因は何か、調べまくった覚えがあります。(今でもエラーはしょっちゅうありますが、大体予測がつくので対応が早くなりました)
そこで、今回は「F8」キーの使い方を紹介します。なぜなら、私がそのとき解決したきっかけが 「F8」キー で1個1個コードを確認したことだったからです。
とにかく、やってみましょう。この記事は電車の中等でも読めるようにしていますので、実際のマクロは、後ほど家や職場で動かしてみればよいと思います。
問題①まず、コードを1文ずつ日本語にして、どんな処理をしようとしているのか確認してください。
Sub 足し算()
Dim sht_1 As Worksheet '①
Dim i As Long '②
Set sht_1 = ThisWorkbook.Sheets(1) '③
i = 2 '④
With sht_1 '⑤
.Cells(1, 2) = .Cells(1, 1) '⑥
Do Until .Cells(i, 2) >= 10 '⑦
.Cells(i, 2) = .Cells(i-1, 2) + .Cells(i, 1) '⑧
i = i + 1 '⑨
Loop '⑩
End With '⑪
End Sub
Dim i As Long ’②
Set sht_1 = ThisWorkbook.Sheets(1) ‘③
i = 2 ‘④
With sht_1 ‘⑤
.Cells(1, 2) = .Cells(1, 1) ‘⑥
Do Until .Cells(i, 2) >= 10 ‘⑦
.Cells(i, 2) = .Cells(i-1, 2) + .Cells(i, 1) ‘⑧
i = i + 1 ‘⑨
Loop ‘⑩
End With ‘⑪
やりたい処理はわかりましたか?B列が10以上になったら終了なので、5行目が10になって終了となるはずです。(頭で考えたほうが早いやつです。(笑))
F5で、マクロをすべて実行
ご存じの通り、エディター上でF5を押すと、書いたマクロを実行することができます。(もちろん、開発タブ→ マクロ → マクロ名を選択 でもできます。)
F5でなんの反応もしない場合は、Fnキーを押しながらF5を押してください。
見事に、無限ループになるはずです。。。
F8で、1行ずつ実行
やっと本題に入れます。苦笑
今、こんな画面です。左にエクセル、右にVBEを並べてあります。両方みくらべながら、1行ずつゆっくり見ていきましょう。
F8を一回押す。(またはFn+F8)
黄色くなっているのが現在処理される行です。
F8を一回押す。(またはFn+F8)
先程黄色だったコードの処理が完了し、次に処理されるコードが黄色くなります。
F8を一回押す。(またはFn+F8)
F8を一回押す。(またはFn+F8)
B1はまだ空欄です。
F8を一回押す。(またはFn+F8)
ここで、ようやくB1に数字が入りました!次の行に移ったタイミングで、エクセルに書き出されます。このタイミングを覚えておきましょう。
また、現在変数iになんの数字が代入されているのか調べることができます。
カーソルを、変数のところにもっていってください。すると、上の図の赤で囲んだ箇所のように、変数の下に、代入されている数字が表示されます。便利!
F8を一回押す。(またはFn+F8)
いよいよループに入ります。
この時点ではまだエクセルのB2セルには数値は入っていません。
F8を一回押す。(またはFn+F8)
ここで、エクセルのB2セルに数値が入りました。
F8を一回押す。(またはFn+F8)
Loopまで行ったので次はDoに戻るはず。
F8を一回押す。(またはFn+F8)
はい、戻りました。
ここで、変数iに何がが代入されているのかを見てみましょう。iのところにカーソルを合わせると、i=3と表示されました。
ここで、もう一度コードの意味をよく考えてみます。
Do Until .Cells(i, 2) >= 10
今はi=3なので、Cells(i, 2) は3行目のB3セルのことです。もし「B3セルが10以上」だったら、繰り返しは終了といつことですよね。
では、エクセルのB3セルを見てください。
おや?B3セルにはまだ空欄ですね。試しに、F8をもう一度押します。
F8を一回押す。(またはFn+F8)
はい、ここでやっとB3に数字が入りました。
なぜ無限ループになるか、もう分かりましたか?
Do Until .Cells(i, 2) >= 10 の時点では、まだCells(i, 2)は空欄なのです。だから、このコードのiに何が代入されてもこの時点では10以上にならなくて、無限に繰り返されてしまうのです。
問題③では、コードをどう修正すれば正しく処理されるでしょうか?
ヒント
Do Until .Cells(i, 2) >= 10 の時点: Cells(i, 2) は空欄
i=i+1の時点: Cells(i, 2) に数字が入力されます。
マクロが処理され、エクセルに反映するタイミングを覚えておきましょう。
コメント