Excel VBA でシートを複製、名称変更、セルの値(日付)を変更・その2

この記事の続きになります。
Excel VBA でシートを複製、名称変更、セルの値(日付)を変更・その1 - プログラミングお勉強記録

前回のコードを先生に添削してもらい、
修正をしました。

先に修正コード。
最初は29行だったコードが添削入って21行になりました。

Option Explicit
'---------- 基本仕様 ----------
' シートを末尾にコピーする
' シート名を変える
' A2の日付を変える
' 31日までループする

Sub 予定表作成()
    
    Dim firstDay As Date
    firstDay = InputBox("何月のシートを作成しますか?1日から1ヵ月分作成します。", "指定してください", Date)    'デフォルトで今日の日付が入る
    Worksheets("1日").Range("A2") = firstDay
    
    Dim i As Integer
    For i = 1 To 30
        Worksheets("1日").Copy after:=Worksheets(Worksheets.Count)      '1日のコピーを末尾に作る
        Worksheets(Worksheets.Count).Name = i + 1 & "日"                'コピーしたシートの名前を変える
        Range("A2").Value = DateAdd("d", i, firstDay)                   '日付を一日ずつ足していく
    Next i
    
End Sub

先生の指摘事項をまとめます。

変数の宣言の位置

まず最初に変数の宣言を"Sub 〜"のすぐ下にまとめて記載していましたが、
変数を使用する直前に宣言した方が、見失わないので、
たとえばループの直前とかに書き直しましょう。
というわけで、firstDay と i の位置を変更。

変数 myDate はよくない

何を表しているのかが一目見てわからない変数はよくない。
変数名を決める時はそのあとの保守のこと等を考えて、誰が見ても何を意味しているのかわかる言葉を選ぶこと。

参考文献

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

myDateを入れたのはほんとに何も考えていなくて、
今読んでいる教科書で処理中の日付を myDate としていたのでそのまま流用してしまいました。反省。

というわけで myDate にかわる変数を考えてみましたが、
そもそもその変数を使用しているところのコード、ひとつにまとめてしまえば変数いらない…との指摘。
ほ、ほんとだ…

'変更前
myDate = DateAdd("d", i, firstDay)                              '日付を1日足して
Range("A2").Value = myDate                                      'A2にいれこむ



'変更後
Range("A2").Value = DateAdd("d", i, firstDay)                   '日付を一日ずつ足していく

書いたり足したり消したりを繰り返しているうちに、重複してしまうこともあるので、
こまめに整理しないといけないですね。。

開始日をユーザーが入力できるようにする

最初、定数で開始日を指定するようにしていましたが、
マクロを実行したユーザーが開始日を入力するようにして、
定数を削除しました。
入力した日付は今のところ1日にしないとうまく動きません。
ただ、これで今のところはいつどの月の分も作れます。
(ただし31日分は必ず作ってしまいますが…)

課題

開始日、終了日が指定できるようにすること。
開始日、終了日がカレンダーから指定できるようにすること。

今カウンタ変数を1から31で固定しているので、
たとえば2月とかを作成すると、シート名が31日でA2の日付が3月3日、、みたいなのが出来てしまうのです。

よかったこと

1行目、 Option Explicit と入れるのはとてもよいこと。
変数名の入力間違いに気づいてくれる。

やっぱり1から一人で作ってみると力になるなぁ!
しかも、動いただけで満足しないで、もっとよくするために添削してもらうと、すごく勉強になる。