Rich Richer Richest

カメラ / レンズ / 写真 / 名古屋 / ライフハック / 思い付き / 猫 ライフログで暮らしをRichに!

【備忘録】Excel VBA マクロで テキストフィルター使用時に .End(xlUP).Row ではうまくいかなかった時の解決法

f:id:mocchipa:20201203190631p:plain

 

.End(xlUP).Rowではバグりました、、、

CSVファイルをインポートして新規データーのみ最終行にデーターを追加処理みたいなVBAマクロを組んだんのですけどうまく動かないことがありました。

テキストフィルターを使うと問題が発生することがわかって、同じ問題で困っている人も居るかなとシェアです。

 

結論から申し上げると、こちらの記事の方法でうまく行きました!

www.excellovers.com

最終行を取得するときに最も良く使われる方法は .End(xlUP).Row とか xlDown だと思います。

 

Private Sub CommandButton1_Click()
Dim lastRow As Long

lastRow = Range("$A$" & 1048576).End(xlUp).Row

MsgBox ("最終行は [" & lastRow & "]です!")

End Sub

A列に入っているデーターの最終行を取得します。

Excelの論理最終行である 1048576行からずーっと上がってデーターが入ってるレンジの行番号を返してくれます。

 

下の例だと、13行目を返してくれます。

 

f:id:mocchipa:20201203191657p:plain

 

ところが、テキストフィルターでフィルターをかけると、意図する最終行を返してくれないことがあります。

 

メーカー SONYでフィルタリングして実行すると 最終行を 12行目として処理します。

f:id:mocchipa:20201203192127p:plain

 

実際には13行目ににCanonのデーターが入ってます。

.End(xlUP).Row では表示されているデーターでしか処理してくれないようです。

 

これはこちらの方法で意図したい最終行が取得できました。

 

Worksheets(1).AutoFilter.Range(Worksheets(1).AutoFilter.Range.Count).Row

 

Private Sub CommandButton2_Click()
Dim lastRow As Long

lastRow = Worksheets(1).AutoFilter.Range(Worksheets(1).AutoFilter.Range.Count).Row

MsgBox ("正しい最終行は [" & lastRow & "]です!")

End Sub

f:id:mocchipa:20201203192840p:plain

 

詳しい解説は元記事を参照にして下さい。

 

www.excellovers.com

ただしこういうケースは使えません!

例えば、表にプリセットで式が組み込んである場合です。

例では、価格評価という項目を追加しました。

D列には =IF(C5>100000,"高すぎる!","") という式を埋め込みました。C列の値が¥100,000をオーバーしている時に、高すぎる!と表示させます。

それ以外は空白を返します。

これを D20 のレンジまで埋め込みました。

f:id:mocchipa:20201203194410p:plain

 

このケースだと、上記の方法だと、式が埋め込んである最終行を取得してしまうので最終行は20行目という結果になります。

f:id:mocchipa:20201203194841p:plain

 

その場合は別の方法を考えなくてはいけないので注意です!

 

あと、もう1点だけ!

データーが多いと処理時間がちょっとかかります。

一つの解決方法ではありますけど、場合によっては別の手を考えたほうがいい時もあるかも知れません。

 

同じ件でお困りの方は参考にして下さい。