【閲覧くださっている皆様へ】URLが変わりました。一部転送が完了していない内部リンク先があります。「404 Not Found お探しのページは見つかりませんでした。」という表示になる場合は、"https://bits-lifestyle.com/jigaku-study/●●"から、"https://study.bits-lifestyle.com/●●"へ書き換えてアクセスくださいますよう、お願いいたします。ご迷惑をおかけいたします。

 
スポンサーリンク

プログラミング初心者が練習しながら理解するエクセルマクロ④繰り返し処理の間違い発見(F8キー)

ExcelVBA(エクセルマクロ)

こんな方に書いた記事です。

  • プログラミングを勉強するのはマクロ(エクセル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 sht_1 As Worksheet ‘①

答えをクリック

sht_1はワークシート型として変数を定義します。

Dim i As Long ’②

答えをクリック

iは整数型として変数を定義します。

Set sht_1 = ThisWorkbook.Sheets(1) ‘③

答えをクリック

sht_1 はこのエクセルワークブックの1番目のシートのことです。(代入します)

i = 2 ‘④

答えをクリック

iは2です。整数型の変数にするときは、必ずはじめの数を何にするのか明記します。そうしないとエラーになります。

また、i=1でなく2から始める理由ですが、この処理では前の行の数字と今の行の数字を足し算するので、 i=1 だと前の行がないためエラーになります。

そのため、i=1のときだけは繰り返し処理から外し、別途計算しています。
(はじめはよく間違えました。)

With sht_1 ‘⑤

答えをクリック

以下のコードで、 sht_1 は省略します。

With ●●
With ●●をつかうと、以下のコードで、●●は省略することができます。変数も省略可能なので、何度も出てくる要素は省略しましょう。 範囲は、「End With」までなので、書くのを忘れずに。

.Cells(1, 2) = .Cells(1, 1) ‘⑥

答えをクリック

B1はA1と等しいです。
※1行目は、前の行がないので。

Do Until .Cells(i, 2) >= 10 ‘⑦

答えをクリック

B列のセルが10以上になるまで、以下の処理を繰り返します。

.Cells(i, 2) = .Cells(i-1, 2) + .Cells(i, 1) ‘⑧

答えをクリック

B列のセル1つ上の行のB列のセルその行のA列のセル


i = i + 1 ‘⑨

答えをクリック

iに1を足します。

Loop ‘⑩

答えをクリック

Do ~に戻って繰り返します。

End With ‘⑪

答えをクリック

⑤がWithで始まっていたので、End Subの前までに必ず書きます。書き忘れないように、Withを書いたら同時にEnd Withも書いてしまうのがよいでしょう。

やりたい処理はわかりましたか?B列が10以上になったら終了なので、5行目が10になって終了となるはずです。(頭で考えたほうが早いやつです。(笑))

F5で、マクロをすべて実行

ご存じの通り、エディター上でF5を押すと、書いたマクロを実行することができます。(もちろん、開発タブ→ マクロ → マクロ名を選択 でもできます。)

F5でなんの反応もしない場合は、Fnキーを押しながらF5を押してください。

見事に、無限ループになるはずです。。。

F8で、1行ずつ実行

やっと本題に入れます。苦笑

今、こんな画面です。左にエクセル、右にVBEを並べてあります。両方みくらべながら、1行ずつゆっくり見ていきましょう。

F8を一回押す。(またはFn+F8)

黄色くなっているのが現在処理される行です。

F8を一回押す。(またはFn+F8)

先程黄色だったコードの処理が完了し、次に処理されるコードが黄色くなります。

Dim ~ やSet ~はただの宣言なので、飛ばされます。(処理ではないため)

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) に数字が入力されます。

答えをクリック
Do Until .Cells( i-1 , 2) >= 10 にすると、無限ループにならずに、5行目に10が入力された時点で処理が完了します!

マクロが処理され、エクセルに反映するタイミングを覚えておきましょう。

コメント

WP Twitter Auto Publish Powered By : XYZScripts.com
タイトルとURLをコピーしました