Excel VBAでテーブル内の既存の行の内容を新しい行として複製する

ソフトウェア
マクロ実行後のテーブル

まとめ

Excel VBAで、テーブル上の選択しているセルが属している既存の行の内容を、新しい行として複製するマクロを作りたい。この時、不要な列はコピーしないようにしたり、連番の列では数字を加算したりしたい。そうなるようなコードを、標準モジュール上に書いてみた。すると、意図した通りのマクロができた。

やりたいこと

Excel VBAで、テーブル上の選択しているセルが属している既存の行の内容を、新しい行として複製するマクロを作りたい。この時、不要な列はコピーしないようにしたり、連番の列では数字を加算したりしたい。
このとき、このテーブルの一番左の列は数字の連番である。

環境

Microsoft Excel for Microsoft 365 MSO (バージョン 2409 ビルド 16.0.18025.20030) 64 ビット

やったこと

標準モジュールに以下のコードを書いてみた。

Option Explicit

Sub DuplicateSelectedRow()

'使う変数を宣言
Dim ws As Worksheet
Dim tbl As ListObject
Dim selectedRow As ListRow
Dim newRow As ListRow
Dim i As Integer

' アクティブなシートをオブジェクト変数に入れる
Set ws = ActiveSheet

' 選択しているセルがテーブル内にあるか確認する準備
On Error Resume Next 'ここでエラーが出ても次に行く。
Set tbl = ws.ListObjects(Selection.ListObject.Name)

'選択しているセルがテーブル内にあれば実行しなければ実行しない。
If Not tbl Is Nothing Then

    ' 選択しているセルが属している行を取得
    Set selectedRow = tbl.ListRows(Selection.Row - tbl.DataBodyRange.Row + 1)

    ' 新しい行を追加
    Set newRow = tbl.ListRows.Add

    ' 選択している行の内容を新しい行にコピー。ただし、ここで指定した列はコピーしない。
    For i = 1 To tbl.ListColumns.Count
        If i = 3 Then 'コピーしない列の番号を指定
            GoTo NextIteration
        End If
        newRow.Range.Cells(1, i).Value = selectedRow.Range.Cells(1, i).Value
        NextIteration:
    Next i

    ' 新しい行の一番左のセルの値を1行上のセルの値に1加算したものに設定
    If newRow.Index > 1 Then
        newRow.Range.Cells(1, 1).Value = tbl.ListRows(newRow.Index - 1).Range.Cells(1, 1).Value + 1
    End If

Else
    MsgBox "対象セルはテーブル内にありません。", vbExclamation
End If

End Sub

結果

意図した通りのマクロができた。

マクロ実行後のテーブル

タイトルとURLをコピーしました