• VBAで取引先ごとにシートを追加するにはどうすればいいの?
  • シートの名前は取引先の名前にしたい
  • 取引先シートごとに取引金額を転記したい
  • コピペで作業できるようにしてほしい

この記事ではExcelVBAで「取引先ごとにシートを追加し、シート名を取引先名に変更、取引金額を転記する」サンプルコードを紹介します。

この記事内のサンプルコードをコピペして設定するだけで、作業の自動化が可能です。

また、このサンプルコード中の処理についても、詳しく解説しています。

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

取引先ごとに取引先名のシートを追加して取引金額を転記する

'DATAシートを変数「dataSh」に定義
Dim dataSh As Worksheet
Set dataSh = ThisWorkbook.Worksheets("DATA")
'データの数だけループ処理
Dim i As Long
Dim flg As Boolean
Dim trgtShName As String
For i = 2 To 5
    flg = False
    trgtShName = dataSh.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
        '取引金額を変数「buf」に定義
        Dim buf As Double
        buf = dataSh.Cells(i, 2).Value
        'コピーしたシートを変数「trgtSh」に定義
        Dim trgtSh As Worksheet
        Set trgtSh = ThisWorkbook.Worksheets(trgtShName)
        'コピーしたシート上の任意のセル(A1)に取引金額を書き込む
        trgtSh.Range("A1").Value = buf
    End If
Next i

▼実行前

 

▼実行後

取引先ごとに取引先名のシートを追加して取引金額を転記するコードの解説

今回のコードでは画像のようにデータ順にシートが追加され、各シートのA1セルに取引金額が転記されます。

少々複雑なので順にコードを解説していきますね。

繰り返し処理「For Next」

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

'DATAシートを変数「dataSh」に定義
Dim dataSh As Worksheet
Set dataSh = ThisWorkbook.Worksheets("DATA")
'データの数だけループ処理
Dim i As Long
Dim flg As Boolean
Dim trgtShName As String
For i = 2 To 5
    ~~~
    trgtShName = dataSh.Cells(i, 1).Value
    ~~~
Next i

 

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

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

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

  • ThisWorkbook.Worksheets("DATA").Cells(2, 1)
  • ThisWorkbook.Worksheets("DATA").Cells(3, 1)
  • ThisWorkbook.Worksheets("DATA").Cells(4, 1)
  • ThisWorkbook.Worksheets("DATA").Cells(5, 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
'取引金額を変数「buf」に定義
Dim buf As Double
buf = dataSh.Cells(i, 2).Value
'コピーしたシートを変数「trgtSh」に定義
Dim trgtSh As Worksheet
Set trgtSh = ThisWorkbook.Worksheets(trgtShName)
'コピーしたシート上の任意のセル(A1)に取引金額を書き込む
trgtSh.Range("A1").Value = buf

ここでは処理実行時点でワークブック内にいくつワークシートがあるかを確認しています。

例えば画像の状態なら「ThisWorkbook.Worksheets.Count」は「2」となります。

 

つまり「ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count)」で、一番右(末尾)のシートを取得することができます。取得したシートを「Worksheets.Add」の位置指定「After」に指定することで、新しいシートを末尾に追加しています。

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

続いて、「DATA」シートに記載されている取引金額を変数「buf」に定義して新しく追加したシート「trgtSh」に転記しています。

変数「buf」に追加すつ取引金額は、繰り返し処理「For Next」のカウンター「i」を使って画像のように定義しています。

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

以上、コピペでできるExcelVBAでの「取引先ごとにシートを追加し、シート名を取引先名に変更、取引金額を転記する」方法の紹介でした。

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

 

Excel最強時短仕事術