【PR】を含みます。

プログラミング

【Excel VBA】シートのデータをクリアする方法とシートを初期化する方法

Excel VBAを使って「シートのデータをクリアしたい」「初期化したい」と思ったことはありませんか?

この記事では、業務でよく使われるVBAのテクニックとして、シートのデータを簡単にクリア・初期化する方法をわかりやすく解説します。

Excel VBAでシートのデータをクリアする方法

Excel VBAを使えば、簡単にシート内のセルの値や書式などをクリアすることができます。

Cells.Clearは、セルの値、数式、書式、コメントなどをすべて削除します。

ただし、セルの位置やサイズ(列幅や行の高さ)は保持されたままなので、レイアウトを維持したまま中身だけを初期化したい場合に便利です。

VBAではCells.Clear以外にも、目的に応じて使い分けられる「Clear系メソッド」が用意されています。

以下に代表的なメソッドをまとめました。

メソッド説明
ClearCommentsコメントを削除
ClearContentsセルの値や数式だけを削除し、書式は残す
ClearFormats値はそのままで、書式だけ削除したい場合に便利
ClearOutlineアウトラインを削除

【実装コード】シートのデータをクリアする

以下のVBAコードは、Sheet1のデータをクリアしています。

VBA
Copy
Sub sample()
    'シートのデータを削除
    Sheets("Sheet1").Cells.Clear
End Sub

【実装コード】シートのデータを範囲指定してクリアする

範囲を指定してデータをクリアする方法として、業務でよく使う見出し以外をクリアする方法を紹介します。

以下のVBAコードは、1行目に見出しがあることを想定して、2行目以降を削除しています。

VBA
Copy
Sub sample()
    '見出し以外を削除
    Sheets("Sheet1").Rows("2:" & Sheets("Sheet1").Cells.Rows.Count).Clear
End Sub

【コピペOK】シートのデータをクリアする関数(clear_sheet_data)

VBA
Copy
Public Function clear_sheet_data(ByVal sheetNames As Variant, Optional ByVal heading As Boolean = False, Optional ByVal clearRowNum As Long = 2)
    If IsArray(sheetNames) Then
        ' sheetNamesが配列の場合の処理
        Dim sheetName As Variant
        For Each sheetName In sheetNames
            If heading Then
                ' headingがTrueの場合の処理
                Sheets(sheetName).Rows(clearRowNum & ":" & Sheets(sheetName).Cells.Rows.Count).Clear
            Else
                ' headingがFalseの場合の処理
                Sheets(sheetName).Cells.Clear
            End If
        Next sheetName
    End If
    If Not (IsArray(sheetNames)) Then
        ' sheetNamesが配列でない場合の処理
        If heading Then
            ' headingがTrueの場合の処理
            Sheets(sheetNames).Rows(clearRowNum & ":" & Sheets(sheetNames).Cells.Rows.Count).Clear
        Else
            ' headingがFalseの場合の処理
            Sheets(sheetNames).Cells.Clear
        End If
    End If
End Function

clear_sheet_data関数の使い方

第一引数のsheetNamesにシート名を指定することで、指定したシートのデータをクリアできます。

第二引数のheadingと第三引数のclearRowNumは、必要に応じて指定します。

各引数について

  1. sheetNames (必須)
    クリアしたいデータがあるシート名を指定します。
    複数のシート名を指定する場合、配列で指定します。
    指定するシートが1つの場合、配列か文字列で指定します。

  2. heading (省略可)
    見出しを削除したくない場合、Trueを指定します。
    引数を省略orFalseを指定した場合、シート全体がクリア対象になります。

  3. clearRowNum (省略可)
    何行目からクリアするかを指定することができます。
    clearRowNumを指定する場合、第2引数のheadingTrueを指定する必要があります。

    例として3を指定した場合、1,2行目は削除されず、3行目以降が削除されます。

【サンプルコード】VBAでシートのデータをクリアする実例

以下のVBAコードは、Sheet1のデータをクリアしています。

VBA
Copy
Sub sample()
    Call clear_sheet_data("sheet1")
End Sub
Public Function clear_sheet_data(ByVal sheetNames As Variant, Optional ByVal heading As Boolean = False, Optional ByVal clearRowNum As Long = 2)
    If IsArray(sheetNames) Then
        ' sheetNamesが配列の場合の処理
        Dim sheetName As Variant
        For Each sheetName In sheetNames
            If heading Then
                ' headingがTrueの場合の処理
                Sheets(sheetName).Rows(clearRowNum & ":" & Sheets(sheetName).Cells.Rows.Count).Clear
            Else
                ' headingがFalseの場合の処理
                Sheets(sheetName).Cells.Clear
            End If
        Next sheetName
    End If
    If Not (IsArray(sheetNames)) Then
        ' sheetNamesが配列でない場合の処理
        If heading Then
            ' headingがTrueの場合の処理
            Sheets(sheetNames).Rows(clearRowNum & ":" & Sheets(sheetNames).Cells.Rows.Count).Clear
        Else
            ' headingがFalseの場合の処理
            Sheets(sheetNames).Cells.Clear
        End If
    End If
End Function

【サンプルコード】VBAで行数を指定してシートのデータをクリアする実例

以下のVBAコードは、Sheet1とSheet2の2行目以降のデータをクリアしています。

VBA
Copy
Sub sample()
    Dim sheetList As Variant
    sheetList = Array("sheet1", "sheet2")
    Call clear_sheet_data(sheetList, True, 2)
End Sub
Public Function clear_sheet_data(ByVal sheetNames As Variant, Optional ByVal heading As Boolean = False, Optional ByVal clearRowNum As Long = 2)
    If IsArray(sheetNames) Then
        ' sheetNamesが配列の場合の処理
        Dim sheetName As Variant
        For Each sheetName In sheetNames
            If heading Then
                ' headingがTrueの場合の処理
                Sheets(sheetName).Rows(clearRowNum & ":" & Sheets(sheetName).Cells.Rows.Count).Clear
            Else
                ' headingがFalseの場合の処理
                Sheets(sheetName).Cells.Clear
            End If
        Next sheetName
    End If
    If Not (IsArray(sheetNames)) Then
        ' sheetNamesが配列でない場合の処理
        If heading Then
            ' headingがTrueの場合の処理
            Sheets(sheetNames).Rows(clearRowNum & ":" & Sheets(sheetNames).Cells.Rows.Count).Clear
        Else
            ' headingがFalseの場合の処理
            Sheets(sheetNames).Cells.Clear
        End If
    End If
End Function

Excel VBAでシートを初期化する方法

Cells.Deleteを使用することでシートを初期化することができます。

ショートカットキー「Ctrl + A」で全セルを選択し、「Ctrl + -」で削除した場合と同じ挙動になります。

そのため、セルの幅、高さも初期化されます。

【実装コード】シートを初期化する

以下のVBAコードは、Sheet1を初期化しています。

VBA
Copy
Sub sample()
    'シートを初期化
    Sheets("Sheet1").Cells.Delete
End Sub

【実装コード】範囲指定して初期化する

以下のVBAコードは、1行目に見出しがあることを想定して、2行目以降のセルを初期化しています。

VBA
Copy
Sub sample()
    '見出し以外のセルを初期化
    Sheets("Sheet1").Rows("2:" & Cells.Rows.Count).Delete
End Sub

【コピペOK】シートのデータを初期化する関数(delete_sheet_data)

VBA
Copy
Public Function delete_sheet_data(ByVal sheetNames As Variant, Optional ByVal heading As Boolean = False, Optional ByVal deleteRowNum As Long = 2)
    If IsArray(sheetNames) Then
        ' sheetNamesが配列の場合の処理
        Dim sheetName As Variant
        For Each sheetName In sheetNames
            If heading Then
                ' headingがTrueの場合の処理
                Sheets(sheetName).Rows(deleteRowNum & ":" & Sheets(sheetName).Cells.Rows.Count).Delete
            Else
                ' headingがFalseの場合の処理
                Sheets(sheetName).Cells.Delete
            End If
        Next sheetName
    End If
    If Not (IsArray(sheetNames)) Then
        ' sheetNamesが配列でない場合の処理
        If heading Then
            ' headingがTrueの場合の処理
            Sheets(sheetNames).Rows(deleteRowNum & ":" & Sheets(sheetNames).Cells.Rows.Count).Delete
        Else
            ' headingがFalseの場合の処理
            Sheets(sheetNames).Cells.Delete
        End If
    End If
End Function

delete_sheet_data関数の使い方

第一引数のsheetNamesにシート名を指定することで、指定したシートを初期化することができます。

第二引数のheadingと第三引数のdeleteRowNumは、必要に応じて指定します。

各引数について

  1. sheetNames (必須)
    初期化したいシートのシート名を指定します。
    複数のシート名を指定する場合、配列で指定します。
    指定するシートが1つの場合、配列か文字列で指定します。

  2. heading (省略可)
    見出しを削除したくない場合、Trueを指定します。
    引数を省略orFalseを指定した場合、シート全体が初期化対象になります。

  3. deleteRowNum (省略可)
    何行目から初期化するかを指定することができます。
    deleteRowNumを指定する場合、第2引数のheadingTrueを指定する必要があります。

    例として3を指定した場合、1,2行目は初期化されず、3行目以降が初期化されます。

【サンプルコード】シートのデータを初期化する実例

以下のVBAコードは、Sheet1を初期化しています。

VBA
Copy
Sub sample()
    Call delete_sheet_data("sheet1")
End Sub
Public Function delete_sheet_data(ByVal sheetNames As Variant, Optional ByVal heading As Boolean = False, Optional ByVal deleteRowNum As Long = 2)
    If IsArray(sheetNames) Then
        ' sheetNamesが配列の場合の処理
        Dim sheetName As Variant
        For Each sheetName In sheetNames
            If heading Then
                ' headingがTrueの場合の処理
                Sheets(sheetName).Rows(deleteRowNum & ":" & Sheets(sheetName).Cells.Rows.Count).Delete
            Else
                ' headingがFalseの場合の処理
                Sheets(sheetName).Cells.Delete
            End If
        Next sheetName
    End If
    If Not (IsArray(sheetNames)) Then
        ' sheetNamesが配列でない場合の処理
        If heading Then
            ' headingがTrueの場合の処理
            Sheets(sheetNames).Rows(deleteRowNum & ":" & Sheets(sheetNames).Cells.Rows.Count).Delete
        Else
            ' headingがFalseの場合の処理
            Sheets(sheetNames).Cells.Delete
        End If
    End If
End Function

【サンプルコード】行数を指定してシートのデータを初期化する実例

以下のVBAコードは、Sheet1とSheet2の2行目以降を初期化しています。

VBA
Copy
Sub sample()
    Dim sheetList As Variant
    sheetList = Array("sheet1", "sheet2")
    Call delete_sheet_data(sheetList, True, 2)
End Sub
Public Function delete_sheet_data(ByVal sheetNames As Variant, Optional ByVal heading As Boolean = False, Optional ByVal deleteRowNum As Long = 2)
    If IsArray(sheetNames) Then
        ' sheetNamesが配列の場合の処理
        Dim sheetName As Variant
        For Each sheetName In sheetNames
            If heading Then
                ' headingがTrueの場合の処理
                Sheets(sheetName).Rows(deleteRowNum & ":" & Sheets(sheetName).Cells.Rows.Count).Delete
            Else
                ' headingがFalseの場合の処理
                Sheets(sheetName).Cells.Delete
            End If
        Next sheetName
    End If
    If Not (IsArray(sheetNames)) Then
        ' sheetNamesが配列でない場合の処理
        If heading Then
            ' headingがTrueの場合の処理
            Sheets(sheetNames).Rows(deleteRowNum & ":" & Sheets(sheetNames).Cells.Rows.Count).Delete
        Else
            ' headingがFalseの場合の処理
            Sheets(sheetNames).Cells.Delete
        End If
    End If
End Function

-プログラミング
-,