VBAで使用範囲を正しく求める[UsedRange]

なぜかいつもど忘れするので、まとめとく。
ThisWorkbook.Worksheets(“対象シート名”).UsedRange
対象シートの「使用範囲」を示すUsedRange。
まず、新規シートを作成した直後の状態ではUsedRangeはA1セルのみを示します。
逆に言えば、まだ何もしていないはずなのに1セルは使用済みとみなされるってことなので注意しましょう。

そして、適当にどこかのセルを使い始めると、A1セルはUsedRangeから除外され、本当に使用しているセル範囲がUsedRangeに適用されます。
そしてこの「使用」っていうのは、「書式のみを設定している」も使用されているものとみなします

そして使用している「セル範囲」ですが、例えばB2とE1セルに値を設定すると、範囲は「B1:E2」になります。
使用していないC1~D2セルもUsedRangeに含まれる点に注意しましょう。
そう、「B1:E2」です。
A1セルは使っていなければ、当然UsedRangeに含まれません。
なぜか解説サイトは「A1~どこかのセル」をUsedRangeとみなして解説しているサイトが多いので注意。

使用開始列・行と終了行・列

本題ですが、使用範囲の4隅を求めます。

With ThisWorkbook.Worksheets("対象シート名").UsedRange
    左上の行番号 = .Row
    左上の列番号 = .Column

    右上の行番号 = .Row
    右上の列番号 = .Column + .Columns.Count - 1

    左下の行番号 = .Row + .Rows.Count - 1
    左下の列番号 = .Column

    右下の行番号 = .Row + .Rows.Count - 1
    右下の列番号 = .Column + .Columns.Count - 1
End With

これを利用して、利用範囲の全セルをなめるループ文ならこうなりますかね。

With ThisWorkbook.Worksheets("対象シート名")
    For row = 0 To (.UsedRange.Rows.Count - 1)
        For col = 0 To (.UsedRange.Columns.Count - 1)
            Debug.Print .Cells(.UsedRange.Row + row, .UsedRange.Column + col).Value
        Next col
    Next row
End With

他にもニッチなIT関連要素をまとめていますので、よければ一覧記事もご覧ください。

返信を残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)