Excel。VBA。日報など原版シートから月の日数分コピーしてシート名も日付に変更したい
<Excel VBA>
日報シートを4月なら30シート。
2月だったら28シートをコピーしてしかも、0401のようなシート名に変更するという作業は、単純ではありますが、面倒以外のなにものでもありません。
次のような原版シートがあります。
これをベースとして、月の日数分コピーしたいわけです。
さらに、コピーしたシート名を、B1の営業日である日付と連動させたいわけですね。
しかもシート名は、「0401」のようにゼロ付で表示したいわけです。
これを手動で行うとしたら、そして、毎月発生するとしたら、「キツイ」「アキル」「ダルイ」作業でしかありません。
そこで、Excel VBAでマクロを作ったらどうなるのか、確認してみましょう。
すごく長いプログラム文になると思いきや、結構短いプログラム文で作ることが出来ます。
Sub 原版コピーシート名日付()
Dim i As Integer
Dim sheet_name As String
Dim month_count As Integer
Dim day_count As Integer
Dim eigyou_day As Date
eigyou_day = Range("b1")
month_count = Month(eigyou_day)
day_count = Day(DateSerial(Year(eigyou_day), month_count + 1, 1) - 1)
sheet_name = Right("0" & month_count, 2) & "01"
For i = 2 To day_count + 1
Worksheets("原版").Copy after:=Sheets(Sheets.Count)
ActiveSheet.Name = sheet_name
ActiveSheet.Range("b1") = eigyou_day
sheet_name = Right("0" & month_count, 2) & Right("0" & i, 2)
eigyou_day = eigyou_day + 1
Next i
End Sub
これを実行すると、原版を利用して、月ごとの日数分のシートが挿入されたことが確認できます。
プログラム文を確認していくことにしましょう。
お馴染みの宣言文ですね。
Dim i As Integer
Dim sheet_name As String
Dim month_count As Integer
Dim day_count As Integer
Dim eigyou_day As Date
「sheet_name」には、コピーした後のシート名で使用する変数です。
eigyou_day = Range("b1")
eigyou_dayには、B1の営業日を代入します。
month_count = Month(eigyou_day)
month_countには、B1の日付から「月」を抽出して代入しています。
day_count = Day(DateSerial(Year(eigyou_day), month_count + 1, 1) - 1)
これは、該当付きの末日の数値を算出しday_countに代入しております。
ポイントがあって、翌月1日を
「DateSerial(Year(eigyou_day), month_count + 1, 1」で、求めます。
そして、「-1」すると、先月の月末を算出することができます。
こうすることで、月末が何日なのか問題に対応することができます。
4月だったら、30日というような算出方法を用いると、うるう年に対応することが大変になってしまうので、「翌月-1」というのは、よく使う方法です。
sheet_name = Right("0" & month_count, 2) & "01"
「0401」というように「0付」で桁数を揃えたシート名を作るために、Rightをつかっています。
例えば、10月だったら、「010」として、その右から2文字分を採用するので「10」となるわけです。
ここでは、最初のシートである、「一日目」に対応させています。
For i = 2 To day_count + 1 ~ Next i
繰り返し処理を行います。
これは、原版シートがあるので、原版をコピーするので、2枚目が1日目にあたるので、2からスタートさせています。
そのため、day_countで月末の数値では1つ足らないので、「+1」して多く繰り返し処理をします。
Worksheets("原版").Copy after:=Sheets(Sheets.Count)
「after:=Sheets(Sheets.Count)」で最後尾という指定ができるので、原版シートをシートの最後尾にコピーさせます。
ActiveSheet.Name = sheet_name
ActiveSheet.Range("b1") = eigyou_day
シート名とB1の値を、変更します。
sheet_name = Right("0" & month_count, 2) & Right("0" & i, 2)
次のシート名を準備しています。
「i」を日付で使うことで、1日ずつ増やしたシート名にすることができます。
eigyou_day = eigyou_day + 1
B1に挿入する営業日も「+1」させます。
このように、単純処理でしかも繰り返し同じことをするような場合には、Excel VBAでマクロをつくったらどうなるのかな?と考えてみるといいかもしれませんね。