Excelについて詳しく解説します
- 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での「取引先ごとにシートを追加し、シート名を取引先名に変更、取引金額を転記する」方法の紹介でした。
コード内で解説した繰り返し処理やシート数を数える処理もコピペでできますので、試してみてください。