• VBAでデータの種類・項目ごとにシートを追加するにはどうすればいいの?
  • 追加したシートの名前はデータに合わせて変えたい
  • コピペで作業できるようにしてほしい

多くのExcel作業を自動化できるExcelVBAですが、基本的な作業は簡単にコピペで実現できるといいですよね。

そこで、この記事ではExcelVBAで「データの種類ごとにシートを追加し、シート名をデータに合わせて変更するコード」をコピペできるように紹介します。

ここでいう「データの種類」とは、どんな種類のデータでも対応可能です。

商品のグループや顧客のグループはもちろん、性別や年齢層などといったデータでもOK。

それぞれのデータ種類ごとに、新しいシートを追加するVBAのサンプルコードをまとめました。

 

この記事に掲載しているサンプルコードは、そのままコピペすることで利用可能です。

ご参考までに、それではどうぞ!

データの種類ごとに新しいシートを追加して名前を変更する

'データの数だけループ処理
Dim i As Long
Dim flg As Boolean
Dim trgtShName As String
For i = 1 To 4
    flg = False
    trgtShName = ThisWorkbook.Worksheets("DATA").Cells(i, 1).Value
    'すでに同名のシートがあるかどうか判定
    Dim ws As Worksheet
    For Each ws In ThisWorkbook.Worksheets
        If ws.Name = trgtShName Then
            flg = True
            Exit For
        End If
    Next ws
    If flg = False Then
        '現在あるワークシートの枚数をカウントして、その後ろ(末尾)に新しいシートを作成する
        Worksheets.Add After:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count)
        '追加したシートはActiveになるため「ActiveSheet」で指定し名前を変更する
        ActiveSheet.Name = trgtShName
    End If
Next i

▼実行前

 

▼実行後

データの種類ごとに新しいシートを追加して名前を変更するコードの解説

どんな処理をしているのかもう少し詳しく解説してくれ!

…という方のために、もう少し詳しく解説していきますね。

今回のコードでは画像のようにデータ順にシートが追加されていきます。

これらの処理は少々複雑ですので、順々にコードを解説していきます。

繰り返し処理「For Next」

はじめに、今回の処理でメインとなる「For Next」について解説します。

重要になるソースは以下の通りです。

'データの数だけループ処理
Dim i As Long
Dim flg As Boolean
Dim trgtShName As String
For i = 1 To 4
    ~~~
    trgtShName = ThisWorkbook.Worksheets("DATA").Cells(i, 1).Value
    'すでに同名のシートがあるかどうか判定
    ~~~
Next i

 

ポイントは、上記の「シートからデータを取得する」処理です。

「For Next」では、カウンターに設定した変数がループするごとに変化していきます。ここでは変数「i」がカウンターとなっており「1 To 4」つまり「1」から「4」まで変化していきます。

つまり、画像のセルから順番にデータを取得することになります。

  • ThisWorkbook.Worksheets("DATA").Cells(1, 1)
  • ThisWorkbook.Worksheets("DATA").Cells(2, 1)
  • ThisWorkbook.Worksheets("DATA").Cells(3, 1)
  • ThisWorkbook.Worksheets("DATA").Cells(4, 1)

 

こうして取得したデータを変数「trgtShName」に定義し、シートを追加、名前を変更する処理を繰り返しています。

繰り返し処理「For Each」

続いても繰り返し処理ですが少し違った書き方となります。

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

「For Each」は指定した範囲内の全ての要素に対して処理を行います。

ここでは「ThisWorkbook.Worksheets」内の全ワークシート「ws」に対して処理を行っています。

そして、シートの名前「ws.Name」が「For Next」で取得した「trgtShName」と同じであったら「flg = True」として「Exit For」で繰り返し処理を抜けています。

この処理で、コピーしようとしているデータ名のシートがすでにワークブック内に存在しているかどうかを確認することができます。

この判定をいれずシート名の重複を確認しないと、同一のデータがあった場合、画像のエラーが出てマクロが止まってしまうので注意しましょう。

シートの数取得「ThisWorkbook.Worksheets.Count」

最後にシートを追加する部分で使われている「ThisWorkbook.Worksheets.Count」について解説します。

Worksheets.Add After:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count)
    '追加したシートはActiveになるため「ActiveSheet」で指定し名前を変更する
    ActiveSheet.Name = trgtShName

ここでは処理実行時点でワークブック内にいくつワークシートがあるかを確認しています。例えば画像の状態なら「ThisWorkbook.Worksheets.Count」は「2」となります。

 

つまり「ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count)」で、一番右(末尾)のシートを取得することができます。

取得したシートを「Worksheets.Add」の位置指定「After」に指定することで、新しいシートを末尾に追加しています。

また、追加直後のシートは「ActiveSheet」で取得できるので、事前に取得した「trgtShName」にシート名を変更しています。

 

以上、コピペでできるExcelVBAでの「データごとにシートを追加し、シート名をデータに合わせて変更する」方法の紹介でした。

コード内で解説した繰り返し処理やシート数を数える処理もコピペでできますので、試してみてください。

 

Excel最強時短仕事術