ボーカルリムーバーオンライン無料
Excel最新版が使える「Microsoft 365」を最安で購入するなら

2024/10/14時点のExcelの最新バージョン2409 18025.20104はMicrosoft 365にて利用可能です。

Microsoft 365は、現在『Amazonのオンラインコード版』が最安購入値となっています。
(Microsoft公式より1,490円お得)

Excelについて詳しく解説します

【コピペでOK】VBAでデータ項目ごとに新シートを作成する方法

  • ExcelVBAでデータごとに新しいシートを自動作成したい
  • シート名をデータに合わせて自動設定したい
  • 簡単にコピペで利用できるVBAコードが欲しい
  • シートの作成位置やエラー処理も考慮したい

ExcelVBAを使えば、データの種類ごとに新しいシートを自動で追加し、効率的なデータ管理が可能になります。

この記事では、データの種類に応じて「自動的に新しいシートを追加し、シート名を設定するVBAコード」を、コピペですぐに使える形でご紹介します。

  この記事はExcel 365の最新版(バージョン 2408 Build 16731.20280)で動作を確認したものをご紹介しています。

記事の内容は2024年11月時点のものとなります。

この記事のポイント!

  • データ項目ごとに新しいシートを自動作成できる
  • シート名の重複チェックでエラーを防止
  • コピペですぐに使えるVBAコード付き

データの種類ごとに新しいシートを作成するVBAコード

まずは、コピペですぐに使えるVBAコードをご紹介します。

'データの種類ごとにシートを追加するマクロ
Sub AddSheetsByCategory()
    '変数の宣言
    Dim i As Long
    Dim flg As Boolean
    Dim targetSheetName As String
    
    '重複確認用の変数
    Dim ws As Worksheet
    
    'エラー処理
    On Error Resume Next
    
    'データの数だけループ処理
    For i = 1 To 4
        flg = False
        'データシートからシート名を取得
        targetSheetName = ThisWorkbook.Worksheets("DATA").Cells(i, 1).Value
        
        'シート名の重複チェック
        For Each ws In ThisWorkbook.Worksheets
            If ws.Name = targetSheetName Then
                flg = True
                Exit For
            End If
        Next ws
        
        '重複していない場合のみシートを追加
        If flg = False Then
            '末尾に新規シートを追加
            Worksheets.Add After:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count)
            '追加したシートの名前を設定
            ActiveSheet.Name = targetSheetName
        End If
    Next i
    
    MsgBox "シートの作成が完了しました。", vbInformation
End Sub

このVBAコードは、以下のような場面で活用できます:

  • 商品カテゴリごとにデータを整理したい
  • 部署別・支社別にシートを分けたい
  • 顧客グループごとにデータを管理したい
  • 月次・年次データを別シートで管理したい

実行結果の確認

▼実行前の状態

 

▼実行後の状態

 

VBAコードの詳細解説

今回のVBAコードを、重要なポイントごとに詳しく解説していきます。

変数の宣言とエラー処理

'変数の宣言
Dim i As Long          '繰り返し処理用のカウンター
Dim flg As Boolean     'シート名重複チェック用のフラグ
Dim targetSheetName As String    'シート名格納用の変数
Dim ws As Worksheet    'ワークシート参照用の変数

'エラー処理
On Error Resume Next

「On Error Resume Next」でエラーが発生しても処理を継続できるようにしています。

  • Long型:大きな数値を扱える整数型の変数
  • Boolean型:True/Falseを格納できる論理型の変数
  • String型:文字列を格納できる変数
  • Worksheet型:Excelのワークシートを参照できる変数

データの読み取りとループ処理

'データの数だけループ処理
For i = 1 To 4
    flg = False    '重複フラグを初期化
    'データシートからシート名を取得
    targetSheetName = ThisWorkbook.Worksheets("DATA").Cells(i, 1).Value

ThisWorkbook.Worksheets("DATA")は現在開いているブックの「DATA」シートを指定します。

Cells(i, 1)はA列の各行を順番に参照します:

  • i = 1の時:A1セル
  • i = 2の時:A2セル
  • i = 3の時:A3セル
  • i = 4の時:A4セル

シート名の重複チェック処理

'シート名の重複チェック
For Each ws In ThisWorkbook.Worksheets
    If ws.Name = targetSheetName Then
        flg = True
        Exit For
    End If
Next ws

For Eachループを使って、ワークブック内の全シートとの重複をチェックします。

重複チェックの仕組み
  • 既存の各シートの名前と比較
  • 一致するシート名があればflgをTrueに設定
  • Exit Forで重複が見つかった時点でループを抜ける

新規シートの追加処理

'重複していない場合のみシートを追加
If flg = False Then
    '末尾に新規シートを追加
    Worksheets.Add After:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count)
    '追加したシートの名前を設定
    ActiveSheet.Name = targetSheetName
End If

重複チェックをパスした場合のみ、新しいシートを追加します。

  • ThisWorkbook.Worksheets.Count:現在のシート数を取得
  • Worksheets.Add After:指定位置の後ろにシートを追加
  • ActiveSheet:直前に追加したシートを参照

完了メッセージの表示

MsgBox "シートの作成が完了しました。", vbInformation

処理完了時に確認メッセージを表示することで、ユーザーに実行完了を通知します。

  vbInformationを指定することで、情報を表すアイコン付きのメッセージボックスが表示されます。

データからシート名を取得する処理

「For Next」構文を使って、データの数だけ処理を繰り返します。

For i = 1 To 4
    flg = False
    targetSheetName = ThisWorkbook.Worksheets("DATA").Cells(i, 1).Value
    '以下処理続く
Next i

この部分では、「DATA」シートのA列から順番にデータを読み取ります。

 

  • 1回目のループ:A1セルの値を取得
  • 2回目のループ:A2セルの値を取得
  • 3回目のループ:A3セルの値を取得
  • 4回目のループ:A4セルの値を取得

シート名の重複チェック処理

既存のシートと名前が重複していないかをチェックします。

Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
    If ws.Name = targetSheetName Then
        flg = True
        Exit For
    End If
Next ws

シート名が重複していると以下のようなエラーが発生するため、この重複チェックが重要になります。

同一データがあった場合、下記の画像のようなエラーが起きるので、注意しましょう。

VBA~実行時エラー'1004'RangeクラスのSelectメソッドが失敗しました。~Excel

 

新規シートの追加処理

重複がない場合のみ、新しいシートを追加します:

If flg = False Then
    Worksheets.Add After:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count)
    ActiveSheet.Name = targetSheetName
End If

「ThisWorkbook.Worksheets.Count」で現在のシート数を取得し、末尾に新しいシートを追加します。

 

まとめ

この記事のポイント!

  • データ項目ごとに新しいシートを自動作成できる
  • シート名の重複チェックでエラーを防止
  • コピペですぐに使えるVBAコード付き

以上、ExcelVBAでデータの種類ごとに新しいシートを作成する方法をご紹介しました。

このVBAコードを使えば、データの整理や管理が格段に効率化できます。ぜひ、ご自身の作業に活用してみてください。

  VBAコードの動作確認は2024年4月時点で行っています。Excelのバージョンによって一部動作が異なる可能性がありますので、ご注意ください。