Excel。VBA。大量のシート名を指定したシートのコピーを手早く行いたい
<Excel VBA>
単純な作業ほど、繰り返して処理をするとなると、面倒に感じます。
そこで、Excel VBAでマクロをつくって実行させる方が作業効率としても改善できるし、面倒な作業から解放されるわけですね。
そこで、今回は、次のようなケースの対応方法をExcel VBAで対応していきます。
シート店舗一覧には、店舗一覧が用意されています。
シート原版は、テンプレシートのシートです。
やりたい処理は、シート原版をコピーします。
コピーしたシートは、A1とシート名をシート店舗一覧から設定します。
作成するシート数は、シート店舗一覧の横浜店から強羅店までです。
作業としては、簡単ですが、店舗数分繰り返すとなると、面倒ですね。
そこで、Excel VBAでプログラミングをつくって対応したいというわけです。
Sub シート作成()
Dim i As Long
Dim sheet_name As String
Dim lastrow As Long
sheet_name = ""
lastrow = Worksheets("店舗一覧").Cells(Rows.Count, "a").End(xlUp).Row
For i = 2 To lastrow
sheet_name = Worksheets("店舗一覧").Cells(i, "a")
ThisWorkbook.Sheets("原版").Copy after:=Sheets(Sheets.Count)
ActiveSheet.Name = sheet_name
Range("a1").Value = sheet_name
Next
End Sub
実行してみましょう。
店舗一覧の店舗シートを作成することができました。
では、プログラミング文を確認していきましょう。
お馴染み変数宣言ですね。
Dim i As Long
Dim sheet_name
Dim lastrow As Long
sheet_nameは、店舗名を代入して使用する変数です。
lastrow = Worksheets("店舗一覧").Cells(Rows.Count, "a").End(xlUp).Row
繰り返し処理のために、シート店舗一覧の店舗数を代入しているのが、lastrowです。
For i = 2 To lastrow
sheet_name = Worksheets("店舗一覧").Cells(i, "a")
ThisWorkbook.Sheets("原版").Copy after:=Sheets(Sheets.Count)
ActiveSheet.Name = sheet_name
Range("a1").Value = sheet_name
Next
For i = 2 To lastrow~Next
For To Next文をつかって、繰り返し処理をします。
2から開始しているのは、見出し行を除いたデータがA2にあるからです。
sheet_name = Worksheets("店舗一覧").Cells(i, "a")
シート店舗一覧のA列の店舗名をsheet nameに代入します。
ThisWorkbook.Sheets("原版").Copy after:=Sheets(Sheets.Count)
シート原版をシートの最後尾にコピーします。
「after:」とすることで、そのシートの右側にコピーすることができます。
「Sheets.Count」はシート数を算出します。
例えば、シート数が3枚の場合だと、
「after:=Sheets(Sheets.Count)」は、Sheet(3)の右側にシートをコピーするという意味になります。
ActiveSheet.Name = sheet_name
コピーしたシート名を、代入した名前に置き換えます。
Range("a1").Value = sheet_name
A1に店舗名を設定します。
このように、比較的シンプルなプログラム文で、作業効率を改善することができます。
日頃行っている作業で、面倒なものなどがあれば、Excel VBAをつかって、マクロをつくってみるというのもいいかもしれませんね。