Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$A$1" Then
Nyuryoku_Calendar
End If
End Sub
Dim bFrg As Boolean
Sub Nyuryoku_Calendar() ' ひと月分のカレンダーを作成する
Dim dDay As Date
Dim c As Long
dDay = Range("A1").Value
Range("A1").NumberFormatLocal = "yyyy" & "年" & "m" & "月"
Range("B1:AF2").ClearContents 'B1:AF2の値を削除する
Range("B1").Value = dDay
Range("B2").Value = WeekdayName(Weekday(dDay), True)
Do While Month(dDay + 1) = Month(Range("A1").Value) 'A1に入っている月と同じ間はloopする。
Range("C1").Offset(0, c).Value = DateAdd("d", 1, dDay) '日付
Range("C1").Offset(0, c).NumberFormatLocal = "d" '書式をd
Range("C1").Offset(1, c) = WeekdayName(Weekday(DateAdd("d", 1, dDay)), True) '曜日
dDay = Range("C1").Offset(0, c).Value
c = c + 1
Loop
End Sub
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim dt As Date
If IsDate(Target.Value) Then '日付と解釈しうる値が入ったときだけ対処。
dt = Target.Value
If Target.Row >= 10 Then ' = 10 だと11行目以降をいきなり編集されたときにハマるので >= にした
Exit Sub
Else
Target.Offset(1).Value = DateAdd("d", 1, dt)
End If
End If
End Sub
受講生さんの投稿
(投稿ID: 2846)
いつもお世話になっております。
現在、イベントの連鎖のところで頭がこんがらがっています(+_+)
練習でカレンダーを作成するマクロを作ってみたのですが、
一体どこにフラグを立てたらよいのかわからず困っています。
コードのチェックをお願いいたします。
☆マクロの内容☆
Sheet1にA1の日付の値が変更されたら
標準ジュールのNyuryoku_Calendarマクロが実行されるWorksheet_Changeイベントを作成しています。
Nyuryoku_Calendarは次の月になるまでB1に日付、B2に曜日が横方向に入っていくマクロです。
ゲストさんのコメント
(コメントID: 4304)
そもそもイベントの連鎖でこれをやろうという発想が間違いかと。
イベントの連鎖について学ぶ方法としては題材が不適切です。
普通に、「Do Loopで、翌月になったら処理を終了」でいいんじゃないかな。
つまり、セルA1の値が変更されたら、以下のページで紹介するようなマクロをそのまま実行する。
Nyuryoku_Calendar の実装については、以下の動画がビンゴなので見直してください。
「1枚のシートに1年分または所定の月の分だけのカレンダーを作成する」
https://forum.pc5bai.com/lesson/page/857
受講生さんのコメント
(コメントID: 4306)
F8で動きを確認していて、動きが気になったのでフラグでなんとかしたほうがよいのかなぁとおもってました(^_^;)
今回の場合はイベントの連鎖を制御する必要がなかったんですね。
小川先生のヒントと動画の見直しでコードも書き直してみます!
いつもありがとうございます(*^^*)
ゲストさんのコメント
(コメントID: 4308)
受講生 さん:
よく考えたら、先日のコメント、「フラグの練習」としては不適切だけど、イベントの連鎖の勉強というだけなら、以下の書き方ができました。
ということで、すいません。サンプルコードを書いてみたのでこちらも参考にしてください。
以下では、1行目-9行目の任意のセルに日付を入れるとイベント連鎖で10行目までの各セルに値を投入します。
>今回の場合はイベントの連鎖を制御する必要がなかったんですね。
というか、DoLoopでも、上記の書き方でも、どちらでも行けます。
僕ならDoLoopでやりますが。