(質問が2点あります)
今度ExcelVBAのエキスパート資格を取ろうかと考えてExcelVBAの勉強をしている最中です。
そこで今回、表の最終行を取得するコードを書いているのですが、
最終行を取得するには色々な方法があることを知りました。
特に
- :表の中に空白がある場合
- :罫線が引いてある表の場合
この2点は注意が必要だということも分かりました。
そして今回お聞きしたいのは、2についてです。
2について、表に罫線が引いてあると、以下のコードを使っても最終行を取得できないことがあります。
[質問1]---------
例えば、以下の図だと
列3番目のところで最終行の結果は7となるようにしたいのですが、
VBA
1Cells(3, Columns.Count).End(xlToLeft).Column
このコードだと、結果は「4」です。
ですが、
VBA
1Range("C65536").End(xlUp).Row
このコードだと、結果はちゃんと「7」が返ってきます。
ここで、Cellsの場合だとなぜ結果が「4」となり正しく返ってこないのかが分かりません。
ちなみに全体のコードは
VBA
1Option Explicit 2 3Sub test() 4 5Const stroutput_FName As String = "練習.xlsb" 6Const stroutput_SheetName As String = "テスト" 7 8Dim wboutput As Workbook 'アウトプットファイル格納 9Dim wboutput_Sheet As Worksheet 'アウトプットファイルのシート 10Dim endcol As String 11 12 'アウトプットファイルのファイルパスを取得 13 Workbooks.Open ThisWorkbook.Path & "\" & stroutput_FName 14 Set wboutput = ActiveWorkbook 15 Set wboutput_Sheet = ActiveWorkbook.Worksheets(stroutput_SheetName) 16 17 '最終行をチェック 18' endcol = wboutput_Sheet.Range("A1").End(xlDown).Row 19 20 endcol = Cells(1, Columns.Count).End(xlToLeft).Column 21 endcol = Cells(2, Columns.Count).End(xlToLeft).Column 22 endcol = Cells(3, Columns.Count).End(xlToLeft).Column 23 endcol = Cells(4, Columns.Count).End(xlToLeft).Column 24 25 endcol = Range("A65536").End(xlUp).Row 26 endcol = Range("B65536").End(xlUp).Row 27 endcol = Range("C65536").End(xlUp).Row 28 endcol = Range("D65536").End(xlUp).Row 29 30End Sub
です。
(テストなのでステップインで1行ずつテストをして確かめています)
どこかが間違っているのでしょうか?
(なお、Celssで取得している行で最初の1行以外全て間違った結果が返ってきています)
[質問2]------
今回、Range("C65536").End(xlUp).Row というコードでうまく取得できることが
分かりました。
しかし、65536と直接入れて今は動かせていても、
今後例えばExcelのバージョンが変わった時にExcelの最終行が変わったりすることも
あるかもしれませんし、または例えば業務で大量のデータを扱う時などは
もしかしたら65536行以上のデータが入ることだってあるかもしれませんし・・・
なので、これでいいのかな?と思っています。
何か良い置き換えというか、そういうコードはありますでしょうか?
以上よろしくお願いいたします。


回答2件
あなたの回答
tips
プレビュー