Sub Nyuryoku_Calendar() ' ひと月分のカレンダーを作成する
Dim d As Date
Dim c As Long
Dim m As Long
m = Month(Range("A1").Value)
Range("A1").NumberFormatLocal = "yyyy" & "年" & "m" & "月"
d = Range("A1").Value
c = 0
Range("A1").CurrentRegion.Offset(0, 1).ClearContents 'データーを削除
Do While m = Month(d)
Range("B1").Offset(0, c).Value = Day(d)
Range("B2").Offset(0, c) = WeekdayName(Weekday(d), True)
c = c + 1
d = DateAdd("d", 1, d)
Loop
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$A$1" And IsDate(Target.Value) Then
If Day(Target) = 1 Then ’A1セルに入った日付が1日だったら
Nyuryoku_Calendar
Else
MsgBox "日付を1日にして入力し直してください"
Exit Sub
End If
End If
End Sub
Sub CreateFirstDateValue() '[2]
Dim d As Date
Dim c As Long
c = 3
d = "2017/" & c & "/1"
Debug.Print d
d = CDate("2017/" & c & "/1")
Debug.Print d
d = CDate(Year(Date) & "/" & c & "/1")
Debug.Print d
End Sub
Sub WhileThisMonth() '[3]
Dim d As Date
Dim m As Long
Dim c As Long
d = #3/1/2017#
m = Month(d)
c = 0
Do While Month(d) = m
Debug.Print d
d = DateAdd("d", 1, d)
Loop
End Sub
受講生さんの投稿
(投稿ID: 2852)
サンプルコードを書いてくださってありがとうございます(*^^*)
いろんなコードを見て、動かしてみることはとても勉強になりますね。
「1枚のシートに1年分または所定の月の分だけのカレンダーを作成する」の
動画を見直して、Nyuryoku_Calendarをつくりなおしてみました。
小川先生がくださったヒントで
'[2] その月の月初日を日付型変数に格納。
'[3] DateAdd関数で一日づつ翌日の日付を調べる。
のところをどう書けばよいかわからず・・・
(調べてみてDateSerial関数を使うのかもしれないと思い試行錯誤したものの・・・
うまくつかいこなせずでした(+_+))
でも、このままではA1セルに1日以外の日付が入った場合、
カレンダーが月の途中からになってしまうので
イベントの方にも手を加えました(;^_^A
小川慶一さんのコメント
(コメントID: 4312)
[3]は頂いたコードで問題なさそうだけど。。何か問題でしょうか?
以下、今テキトーに書いてみたサンプルです。研究してみてください。
はっきりしないことがあるときは、その機能だけを試すサンプルを自作してみることも大切です。学習目的でなく、実務でマクロを書く際でも。
>でも、このままではA1セルに1日以外の日付が入った場合、
>カレンダーが月の途中からになってしまうので
>イベントの方にも手を加えました(;^_^A
利用者からすると面倒かな。。と感じます。
「その月のいつの日付が与えられても、その月の1日からのカレンダーを作る」てするのがスマートじゃないかな。
僕が書いた CreateFirstDateValue を少し直せばいけるはずなので、挑戦してみてください。