はてさて、上から目線でエラそうにマクロ(VBAコーディング)の苦言を書いておりますが、つい最近そのコーディングについて、こっぴどく叱られたことがあります。
例えばリストを作るマクロで、現在のリストの最下部を取得して、その行のひとつ下に新たなデータを付け足す。とか、表の中からデータを検索する際に、表の最下部の位置を取得して、For i=Start_Row to ListEndRow ~Next などとして検索する範囲を指定するとか、『データの一番下』を調べる必要が頻繁に出てくるかと思います。
こんな時に使われる定番のコードがコレです。
ListEndRow=Range(“A1”).End(xlDown).Row
これは、A1セルからA列を下に向かってデータが途切れる行を探していく方法で、Excelの操作で、表の最下部のセルへ移動するショートカットキーとして、「Shift + Ctrl + ↓」で実現できるので、よく「Excel時短術」などとして紹介されておりますが、この操作をマクロ自動記録すると、上記と同じコードが生成されます。
ショートカットと同じく、「マクロでリストの一番下の行を取得するコード」などと検索すると、やはり多くのサイトでこのコードが紹介されています。
業務マクロでは、リストの最下部を取得するとか、検索範囲指定のために表の最下部の位置を取得して、その最下部まで順番に検索するとかは結構な頻度であるので、
『ははぁ~ん、そういうときはコレを使うっていう定番のコードなんですね。』
そう理解して、バシバシEnd(xlDown)していたワケです。
その定番コードを、何の疑いもなく使っていたワタシですが、デバッグしている中でコイツはこいつで問題があるってことは分かってきて、一番の問題は、例えば上で紹介したA1セルからEnd(xlDown)のコードの場合、A2セルが空白だとExcelの最終行を取得してしまうってところですかね(1048576行となる)。
なので、Range(“A1”).End(xlDown)する前に、
if Range(“A2”)=”” then
MsgBox(”リストがありません”)
Exit sub
Else
ListEndRow=Range(“A1”).End(xlDown).Row
End if
などどして回避しておりました。
ところがです。
「ワタシのAIとの付き合い方」で書いたように、ワタシの最高の相棒で最高のモチベーターであるCopilotにコードの検証をお願いしたところ
.End(xlDown)はダメだ。暴走する可能性がある。
とダメ出しをくらったわけです。
いやいや、空白のときに暴走するのは分かっているので、だから空白チェック入れてExit sub してるじゃんと、言ってみましたが
暴走する可能性のあるコードを使うべきではない。
と何を言っても、頑なに.End(xlDown)を否定するコパイくん。
どんなときも褒めてくれた、あんなに優しかったモチベーターのコパイくんが、鬼の形相で(想像)、責め立ててきます。
代わりに勧められたのが
Cells(Rows.Count, "A").End(xlUp).Row
と、下から最下部を取得する方法です。
.End(xlUp)は、A1セルから下に向かって「データなくなる場所」を探すのとは逆に、A列の最下部から上に向かって、「データが入ってる場所」を探しに行くコードです。
いやいや待って、リスト下部に脚注とかのために空白行があったら、意図した最下部にならんでしょ。と言ってみたところで、鬼コーチの主張は変わりません。それはそれで手当をしろと、.End(xlDown)は決して使うなの鬼コーチっぷりです。
こんな場合、取得したい行は104行ですが、.End(xlUp).Rowだと105行が取得される。
コパイくんに従順になっていたワタシは、(不満を持ちつつも)仕方なく、一旦 End(xlUp).Row で最下部を取得した後に、改めてFor~Next で取得した最下部の行までの空白行(セル)を検索して注意を促すルーチンを作るハメになったのです(「くっそー、また褒めてくれるかと思ったらこのザマだよ」とつぶやきながら)。
想像ですが、.End(xlDown)は当初(昔)は、それなりに便利で充分なコードだったんでしょうね。不備はありつつも大体は求めている値を得るコードだった。でも、いろいろ手当しても、暴走の可能性は排除できなくなり、『それだったらこっちが正解』と、今では定番が変わってきたのでしょう。
ひと昔前にAIコパイくんが存在してれば、.End(xlDown)使っても『そのコード素晴らしいよ』と褒めてくれたのだと思います(そうであってくれ)。
そんな現在の鬼コーチコパイくんですが、先日『新しくフォルダを作成して、そこにファイルを移動する』という別のマクロを作ったのでレビューしてもらったら
『移動するフォルダに同名のファイルがあったら異常終了する。先にFileExistすべき』と指摘された。
おい、直前にCreateFolderしたところに同名のファイルあるわけないじゃろが。とツッコんだところ、『そうだね、その通りだ、ボクが間違えたよ』とあっさりミスを認めました。
どんなにツッコんでも、あんなに.End(xlDown)はダメだと頑なだったコパイくんの鬼コーチっぷりでしたが、間違えたときはあっさり認めるようだ。硬軟つけた付けた対応に、相棒はまだお願いしようと思う。

