.End(xlUP).Rowではバグりました、、、
CSVファイルをインポートして新規データーのみ最終行にデーターを追加処理みたいなVBAマクロを組んだんのですけどうまく動かないことがありました。
テキストフィルターを使うと問題が発生することがわかって、同じ問題で困っている人も居るかなとシェアです。
結論から申し上げると、こちらの記事の方法でうまく行きました!
最終行を取得するときに最も良く使われる方法は .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行目を返してくれます。
ところが、テキストフィルターでフィルターをかけると、意図する最終行を返してくれないことがあります。
メーカー SONYでフィルタリングして実行すると 最終行を 12行目として処理します。
実際には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
詳しい解説は元記事を参照にして下さい。
ただしこういうケースは使えません!
例えば、表にプリセットで式が組み込んである場合です。
例では、価格評価という項目を追加しました。
D列には =IF(C5>100000,"高すぎる!","") という式を埋め込みました。C列の値が¥100,000をオーバーしている時に、高すぎる!と表示させます。
それ以外は空白を返します。
これを D20 のレンジまで埋め込みました。
このケースだと、上記の方法だと、式が埋め込んである最終行を取得してしまうので最終行は20行目という結果になります。
その場合は別の方法を考えなくてはいけないので注意です!
あと、もう1点だけ!
データーが多いと処理時間がちょっとかかります。
一つの解決方法ではありますけど、場合によっては別の手を考えたほうがいい時もあるかも知れません。
同じ件でお困りの方は参考にして下さい。