Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(指定なし : 指定なし)
Re: 「関数が入っているセルを最終行として取得する回避方法」
投稿日時: 21/04/26 15:23:09
投稿者: simple

「関数が入っているセルを最終行として取得する回避方法」
https://www.moug.net/faq/viewtopic.php?t=80491
について、補足説明します。
 
> xlPrevious:一致する前の値を検索
表現だけの問題かもしれませんが、
これは、検索する方向を指します。
行や列が若くなる方向に検索していくということです。
 
(1)

lastRow = Columns("A").Find("*", , xlValues, xlPart, , xlPrevious).Row
とすると、
After引数は省略されているので、
「対象セル範囲の左上端のセル」が検索の開始点になります。
 
xlPreviousということは、
A1セルから、後方に向かってということなので、
最初にワープしてA列最終行に行き、
そこからさらに、行が若くなる方向に検索せよ、
ということになります。
 
(2)
こういうケースもありますね
 
     A列   B列   C列
 1    a     a     a
 2    a     a     a
 3    a     a 
 4          a
 5          a
などというデータで、どの列が最下行か予め定まっていないというケースがあります。
 (割とあるシチュエーションですね。)これで、最終行を求めたい、と。
  
この場合、
lastRow = Columns("A:C").Find("*", , xlValues, xlPart, , xlPrevious).Row
とする場合、
SearchOrder引数は省略できず、xlByRowsに設定する必要があります。
そうすると、正しくB5にヒットします。(C列最終行から、行毎に遡って検索します)
 
もし仮に、 xlByColumnsとすると(または、省略して、直前の検索がxlByColumnsだったりすると)、
C2がヒットして、目的に沿わない結果となってしまいます。
(この場合、C列の最終行から、列ごとに検索していくので。)
 
(3)
そう言う意味では、
lastRow = Columns("A").Find("*", , xlValues, xlPart, xlByRows, xlPrevious).Row
とxlByRowsに決め打ちしておいたほうが、複数列にも対応できるので、汎用的かもしれません。
(単一列を対象にしたとき、検索効率が悪くなるとも思えないので(確認していませんが)。)
 
頭の片隅に置かれたらよろしいかと思います。

投稿日時: 21/04/27 08:34:58
投稿者: simple

閉じます。