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

列操作

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

使用環境

・Windows11
・EXCEL 2019

選択

' 単一列選択(列名で指定 or 列番号で指定)
ThisWorkbook.Worksheets("[シート名]").Columns("A").Select
ThisWorkbook.Worksheets("[シート名]").Columns(1).Select

' 連続した複数列選択
ThisWorkbook.Worksheets("[シート名]").Columns("A:C").Select

' 離れた複数列選択
ThisWorkbook.Worksheets("[シート名]").Range("A:A,C:D").Select
VBA

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

追加

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

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

' 指定列の前に複数列追加する
ThisWorkbook.Worksheets("[シート名]").Columns("C:E").Insert
VBA

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

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

複製

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

' 1列を1列に複製
ws.Columns("C").Copy ws.Columns("D")

' 1列を複数列に複製
ws.Columns("C").Copy ws.Columns("D:E")

' 複数列を複製
ws.Columns("C:E").Copy ws.Columns("H")
VBA

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

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

削除

' 1列を削除
ThisWorkbook.Worksheets("[シート名]").Columns("C").Delete

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

' 離れた複数行を削除
ThisWorkbook.Worksheets("[シート名]").Range("A:A,C:C,E:G").Delete
VBA

幅取得/変更

' 幅を取得
Dim width As Double
width = ThisWorkbook.Worksheets("[シート名]").Columns("A").ColumnWidth

' 幅を変更
ThisWorkbook.Worksheets("[シート名]").Columns("A").ColumnWidth = 40

' 全列幅を変更
ThisWorkbook.Worksheets("[シート名]").Columns.ColumnWidth = 40
VBA

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

幅自動設定

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

ThisWorkbook.Worksheets("[シート名]").Columns("A").AutoFit
VBA

実行時の内容で調整されるので、その後入力内容を変更しても幅は変わらない点に注意。

末尾列番号取得

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

' シート最終列から見て1行目に値がある最終列を取得
Dim lastColumn As Long
lastColumn = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column
VBA

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

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

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

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

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

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

' シートの使用範囲から最終列を取得
Dim lastColumn As Long
lastColumn = ws.UsedRange.Columns(ws.UsedRange.Columns.Count).Column
VBA

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

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

非表示/再表示

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

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