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)
- 作者: Dustin Boswell,Trevor Foucher,須藤功平,角征典
- 出版社/メーカー: オライリージャパン
- 発売日: 2012/06/23
- メディア: 単行本(ソフトカバー)
- 購入: 68人 クリック: 1,802回
- この商品を含むブログ (140件) を見る
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から一人で作ってみると力になるなぁ!
しかも、動いただけで満足しないで、もっとよくするために添削してもらうと、すごく勉強になる。