VBAエキスパートの資格を取るため、勉強中です。
今回、ExcelVBAで範囲指定をしてコピーするためのコードを練習しているのですが、以下、1点分からないところがあります。
[やりたいこと]
画像1と2のように、空白がところどころに入っている表をコピーできるようにしたいです。
また、どこに空白があるかは分からないものとします。
この場合、タイトルは除きます。
[考えた方法]
空白がどこにあるか分からない表をコピーする方法としては、まず
- 表の最終行を取得する
- 表の最終列を取得する
- 最終行と最終列を使って範囲指定してコピー
という方法が考えられると思いました。
この場合、まず表の最終行を取得するコードを考えないといけないのですが、
VBA
1'表の最終行を取得(5列目) 2endcol = (Cells(Rows.Count, 5).End(xlUp).Row)
というコードを使って列を指定してその行の最終行を取得するコードがあることを知りました。
ですが、今回の場合はどこで空白があるか分からないため、行を指定してその行の最終行を取得するということは難しいと思います。
そこで、例えば最終行取得ならば1列ごとにその列の最終行を取得し、その中で一番大きな数字を表の最終行とする方法を考えました。
コードは以下の通りです。
VBA
1Option Explicit 2 3'名前の定数===================================================== 4Const stroutput_FName As String = "練習.xlsb" 5Const stroutput_SheetName As String = "テスト" 6Sub test() 7 8Dim wboutput As Workbook 'アウトプットファイル格納 9Dim wboutput_Sheet As Worksheet 'アウトプットファイルのシート 10 11Dim endcol As Integer 12Dim endcol_1 As Integer 13Dim endcol_2 As Integer 14Dim endcol_3 As Integer 15Dim endcol_4 As Integer 16 17Dim endrow As Integer 18Dim endrow_1 As Integer 19Dim endrow_2 As Integer 20Dim endrow_3 As Integer 21Dim endrow_4 As Integer 22 23 24 'アウトプットファイルのファイルパスを取得 25 Workbooks.Open ThisWorkbook.Path & "\" & stroutput_FName 26 Set wboutput = ActiveWorkbook 27 Set wboutput_Sheet = ActiveWorkbook.Worksheets(stroutput_SheetName) 28 29 30 '最終行をチェック 31 endcol_1 = (Cells(Rows.Count, 1).End(xlUp).Row) 32 endcol_2 = (Cells(Rows.Count, 2).End(xlUp).Row) 33 endcol_3 = (Cells(Rows.Count, 3).End(xlUp).Row) 34 endcol_4 = (Cells(Rows.Count, 4).End(xlUp).Row) 35 36 endcol = WorksheetFunction.Max(endcol_1, endcol_2, endcol_3, endcol_4) 37 38 39 '最終列をチェック 40 endrow_1 = Cells(1, Columns.Count).End(xlToLeft).Column 41 endrow_2 = Cells(2, Columns.Count).End(xlToLeft).Column 42 endrow_3 = Cells(3, Columns.Count).End(xlToLeft).Column 43 endrow_4 = Cells(4, Columns.Count).End(xlToLeft).Column 44 45 46 endrow = WorksheetFunction.Max(endrow_1, endrow_2, endrow_3, endrow_4) 47 48 Range(Cells(1, 1), Cells(endcol, endrow)).Copy 49 50 51End Sub 52 53コード
ですが、この方法だと、行や列がたくさんある時はその都度変数をたくさん作っていかねばならず効率がとても悪いです。
そこで他にももっと良いコードがないか色々と調べましたが分かりませんでした。
今回のように、空白がどこにあるか分からない表の範囲を取得してコピーする良いコードはありますでしょうか?
ご教示よろしくお願いいたします。

