5/20/2021

Excel。VBA。日報など原版シートから月の日数分コピーしてシート名も日付に変更したい【Sheets name】

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でマクロをつくったらどうなるのかな?と考えてみるといいかもしれませんね。