VBAでの変数の使用と繰り返しについて3

スポンサーリンク

Do Until~Loop構文の続き

前回はDo Until~Loop構文を記述しました。今回はDo Until~Loop構文の問題点と解決法を記載します。

前回作成したコード

前回作成したコードは「B列の値が80以上だった場合に、横のA列のセルを黄色に塗る操作」を「1行目からA列が空欄になる行まで繰り返す」操作です。

Sub 繰り返し実行2

Dim i’①変数としてiを使う
i = 1’②iが1からスタートすることを記載
Do Until Cells(i,1).Value=””’③Cells(i,1)が空欄になるまで続ける
If Cells(i,2) >= 80 Then’(i,2)セルが80以上なら
Cells(i,1).Interior.ColorIndex = 6 ’(i,1)セルを黄色に塗る。
End If’Ifの作業を終了する。

i = i +1’⑤iを1つずつ増やす
Loop’繰り返す

End Sub

スポンサーリンク

前回のコードがうまく動かないケース

A列が空になるまで作業を続けるVBAは使い勝手がよく、便利なのですがうまく動いてくれない場合もあります。

代表的な例は、処理を継続したい行のうち、「A列が途中で空欄になっている行がある場合」です。
Excelのシートの場合空欄があることも多いので注意が必要です。

別のコードの記載方法

途中でA列が空欄になっている場合、「A列が空欄になるまで」という繰り返しの条件を少し変更する方法があります。
主に以下のような対応が考えられます。

①Excelのシートで一番下から数えて、セルに何か記載されている行までコードを続ける

多分一番メジャーな対応です。
使えるようになるのに必要な知識は3点です。

(1)Excelでは2003以前のバージョンの一番下の行は65,536行目、2007以降は1,048,576行目です。

自分が扱うファイルで絶対に文字が書かれていない行を起点とする必要があり、最終行を超えるとエラーになります。
私はよく60,000行からスタートのコードを書きます。(どちらのバージョンのExcelでも使えるようにしたいのと、60,000行を超えるデータを扱うことがあまりないため)

(2)下から上に進んで一番最初に何か記載されているセルの選択は「.End(xlUp)」のコードを使います。

このコードを覚えておくとかなり便利です。すごく使えるやつです!
手で操作するとき、マクロを記録するときは、記録を開始して「Ctrl + ↑」で記録されるので覚えてなくても思い出せます。

(3)セルの行の位置を数字にして表すのに「.Row」を用いる。

普通にセルを選択する際に使うことはないですが、「.End(xlUp)」などのコードを用いて、対象とするセルを移動した場合に、
そのセルが何行目かを表すのは「.Row」を使います。

よって例えば、何行目まで処理を行うかを上記の方法で進める場合、終了の行は以下のコードで表せます。

Cells(60000 , 1) .End(xlUp) .Row
’Cells(60000,1)から上に向かって、最初にA列に何か文字が書かれているセルの行

繰り返しのコードはFor~Next構文を用いて以下のように変更します。

For i = 1 to Cells(60000 , 1) .End(xlUp) .Row
~~~繰り返したい処理を書いたコード~~~
Next i

②A列の他の列も同時に空欄になるまで処理を継続するコードに書き換える

繰り返しを中断する条件を厳しくします。他の列も同時に空欄になっていないと終了しないという記述です。

Do Until Cells(i,1).Value=”” And Cells(i,3).Value=””
’Cells(i,1) とCells(i,3)が両方空欄になるまで続ける

これでA列とC列が同時に空欄になるまで処理が続きます。
もちろんC列でなくても空欄になりにくい列を数字で表せば大丈夫です。

③A列の次の行も空欄になるまで繰り返しを続けるコードに書き換える

②と似ていて条件を厳しくしますが、A列の中で処理を行うものです。

Do Until Cells(i,1).Value=”” And Cells(i+1,1).Value=””
’Cells(i,1) とCells(i+1,1)が両方空欄になるまで続ける

VBA(マクロ)の繰り返しコードを作るときの注意点

それぞれのコードの書き方にも一長一短があり、どれが一番優れているかはなんとも言いにくいです。
色んなコードを書けるようにしておくのが一番ですが、まずは「For i = 1 to Cells(60000 , 1) .End(xlUp) .Row」のコードを把握しておくと便利だと思います。

おすすめ書籍 (広告)

コメント