make is.dev make it simple. development.
2024年11月20日

行操作

EXCEL VBAでの行操作で、よく使うものチートシート。

使用環境

・Windows11
・EXCEL 2019

選択

' 単一行選択
ThisWorkbook.Worksheets("[シート名]").Rows(1).Select

' 連続した複数行選択
ThisWorkbook.Worksheets("[シート名]").Rows("1:5").Select

' 離れた複数行選択
ThisWorkbook.Worksheets("[シート名]").Range("1:1,3:3,5:6").Select
VBA

行を選択する場合、シートがアクティブ状態にないとエラーになるので注意。

追加

' 指定行の前に1行追加する
ThisWorkbook.Worksheets("[シート名]").Rows(4).Insert

' 指定行の前に1行追加し、書式をクリアする
ThisWorkbook.Worksheets("[シート名]").Rows(4).Insert
ThisWorkbook.Worksheets("[シート名]").Rows(4).ClearFormats

' 指定行の前に複数行追加する
ThisWorkbook.Worksheets("[シート名]").Rows("4:5").Insert
VBA

行を追加する場合、上か下の行の書式が引き継がれる。
(デフォルトは上で、CopyOrigin:=xlFormatFromRightOrBelowを指定した場合は下)

それをクリアするには、ClearFormatsで行を追加した後で書式をリセットする必要がある。

複製

Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("[シート名]")

' 1行を1行に複製
ws.Rows(3).Copy ws.Rows(4)

' 1行を複数行に複製
ws.Rows(3).Copy ws.Rows("4:5")

' 複数行を複製
ws.Rows("4:5").Copy ws.Rows(6)
VBA

Copyメソッドを使って、複製先の行を指定する。
複数行を複製する際、複数先は最初の1行を指定すれば必要行数分複製される。

Copyメソッドを使うとクリップボードの内容が書き換わるので注意。

削除

' 1行を削除
ThisWorkbook.Worksheets("[シート名]").Rows(3).Delete

' 連続した複数行を削除
ThisWorkbook.Worksheets("[シート名]").Rows("3:5").Delete

' 離れた複数行を削除
ThisWorkbook.Worksheets("[シート名]").Range("1:1,3:3,5:6").Delete
VBA

高さ取得/変更

' 高さを取得
Dim height As Double
height = ThisWorkbook.Worksheets("[シート名]").Rows(1).rowHeight

' 高さを変更
ThisWorkbook.Worksheets("[シート名]").Rows(1).rowHeight = 40

' 全行の高さを変更
ThisWorkbook.Worksheets("[シート名]").Rows.rowHeight = 40
VBA

取得、変更、共に指定した複数行をまとめて操作することも出来る。
ただ、取得については1行分の高さしか返らず、高さが一致していないとNULLが返されるので注意。

複数行の高さについて、合計を取得したい場合は以下で取得出来る。

Dim height As Double
height = ws.Rows("2:4").height
VBA

高さ自動設定

入力されている内容に合わせて、高さを自動調整する。

ThisWorkbook.Worksheets("[シート名]").Rows(1).AutoFit
VBA

その後入力内容を変更した際もその内容に応じて高さが変わる点に注意。

末尾行番号取得

Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("[シート名]")

' シート最終行から見てA列に値がある最終行を取得
Dim lastRow As Long
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
VBA

ただこれだけだと、シートの最終行に値がある場合は正しい行を取得出来ない。
(レアケースだとは思われるが)

最終行に値があることを想定する場合は、以下のように条件判定を挟む。

Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("[シート名]")

' シート最終行から見てA列に値がある最終行を取得
Dim lastRow As Long
If ws.Cells(ws.Rows.Count, 1).Value <> "" Then
    lastRow = ws.Rows.Count
Else
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
End If
VBA

上記では、最終行に値がある列が必要だが、それが分からない場合はUsedRange(使用している範囲)から最終行を取得することも可能。

Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("[シート名]")

' シートの使用範囲から最終行を取得
Dim lastRow As Long
lastRow = ws.UsedRange.Rows(ws.UsedRange.Rows.Count).Row
VBA

ただ、UsedRangeは意図しない範囲まで含むことがあるので注意が必要。
たとえば、罫線や書式などが個別に指定されているだけでも使用範囲として扱われたりする。

データがある行を取得したい場合に意図せず取得値が不安定になるケースがあるので、なるべくは前述の方法で最終行を特定出来た方が良い。

非表示/再表示

' 非表示
ThisWorkbook.Worksheets("[シート名]").Rows(1).Hidden = True

' 再表示
ThisWorkbook.Worksheets("[シート名]").Rows(1).Hidden = False
VBA