ワークシート全体の行数と列数
VBAでシート全体の行数や列数を取得したいことがあります。
コードでは以下のようにRows.CountとColumns.Countの1行でそれぞれ取得できます。
1 2 3 4 5 6 7 8 9 10 11 12 |
Sub GetRowColumnCount() Dim iMaxRow Dim iMaxColumn '// シートの行数を取得 iMaxRow = Rows.Count '// シートの列数を取得 iMaxColumn = Columns.Count Debug.Print "シート全体の行数=" & iMaxRow Debug.Print "シート全体の列数=" & iMaxColumn End Sub |
RowsとColumnsはWorksheetオブジェクトの子になります。
そのため、一番左のシートを対象としたい場合には、Rows.とColumns.の左にWorksheets(1).と加えて書いても同じ意味になります。
1 2 |
Worksheets(1).Rows.Count Worksheets(1).Columns.Count |
親のシートオブジェクトを省略した場合はアクティブシートが対象になります。
もちろんアクティブシートであることを明示して以下のように書いても構いません。
1 2 |
ActiveSheet.Rows.Count ActiveSheet.Columns.Count |
取得は事前に1回だけにする
ワークシートの行数と列数はOfficeのバージョンで決まっています。
Office2003までは行数は65536、列数は256、Office2007からは行数は1048576、列数は16384です。
この値は変わらないため、VBA処理の初期処理として1度だけ取得して変数に入れておき、あとはその全体行数と全体列数の変数を必要なときに使うようにすれば、少しではありますが処理速度の向上につながります。
行数の取得を1回で済むようにする
例えば、シートの一番下の行に到達したかどうかの判定などをしたい場合は以下のような感じのコードにします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
Sub LoopMaxRow() Dim iMaxRow '// シート全体の行数 Dim iNowColumn '// 現在列位置 Dim i '// ループカウンタ Dim r As Range '// 処理中セル '// シートの行数を取得 iMaxRow = ActiveSheet.Rows.Count '// 現在列位置を取得 iNowColumn = ActiveCell.Column '// 現在セルの行位置を取得 i = ActiveCell.Row '// ループ Do '// 最終行に到達した場合 If (i > iMaxRow) Then '// ループを抜ける Exit Do End If '// 現在ループ位置のセルのRangeオブジェクトを取得 Set r = Cells(i, iNowColumn) '// 次行用に加算 i = i + 1 Loop End Sub |
列数の取得を1回で済むようにする
終端行ではなく終端列かどうかの判定をしたい場合は、Rows.Countの個所とループカウンタを列単位にすると上と同じように終端列への到達の判定が可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
Sub LoopMaxColumn() Dim iMaxColumn '// 終端列 Dim iNowRow '// 現在行位置 Dim i '// ループカウンタ Dim r As Range '// 処理中セル '// シートの列数を取得 iMaxColumn = Columns.Count '// 現在行位置を取得 iNowRow = ActiveCell.Row '// 現在セルの列位置を取得 i = ActiveCell.Column '// ループ Do '// 終端列に到達した場合 If (i > iMaxColumn) Then '// ループを抜ける Exit Do End If '// 現在ループ位置のセルのRangeオブジェクトを取得 Set r = Cells(iNowRow, i) '// 次列用に加算 i = i + 1 Loop End Sub |