Q1:数式で空白("")が入っているのに、End(xlUp)を使うと最終行として拾われてしまいます。回避策は?
A1:End(xlUp)は数式そのものをデータとして解釈するため正常な挙動です。数式による空文字を完全に除外したい場合は、本稿で紹介した「Findメソッド(LookIn:=xlValues, LookAt:=xlPart)」を用いて後方検索を行ってください。値としての文字列が存在する真の最終行のみを正確に取得できます。
Q2:オートフィルターで絞り込まれている状態でも、隠れているデータを含めた本当の最終行を取得できますか?
A2:可能です。最も手堅い方法は、処理開始時にIf ws.FilterMode Then ws.ShowAllDataを実行して絞り込みを一時的に全解除することです。画面表示を変更できない制約がある場合は、Findメソッドを使用すれば非表示セルに隠されたデータも検知可能です。
Q3:A列、B列、C列でそれぞれ入力されている行数が異なります。表全体の中で「最も長い列の最終行」を取得するには?
A3:FindメソッドをSearchOrder:=xlByRowsで実行してシート全体を走査するか、各列に対してEnd(xlUp)を実行してApplication.WorksheetFunction.Maxで最大行番号を比較・抽出するロジックを実装するのが一般的です。
Q4:最終行取得の結果が「1」になってしまい、データが書き込めません。
A4:基準に指定した列が完全に空であるか、参照先のシートが意図したシートになっていない(非アクティブな別の空白シートを参照している)可能性が極めて高いです。ActiveSheetへの暗黙的依存をやめ、ThisWorkbook.Sheets("対象シート名")と明記されているかコードを確認してください。