- ベストアンサー
SpinButtonを使ったプログラム
日めくりカレンダーのようなものを作っております。 仕様 TextBox1は月、TextBox2は日。初期値は現在月日。 SpinButton2を押すと、日が変わる。 ただし、月またぎでは月日両方が変わる。 で、以下のようなプログラムを作ると ***のところのSpinButton2_Change()が 反応してしまうらしく、上手く動きません。 対策の方を教えてください。 また、SpinButton2の上側ボタンを押すと 数が減るような方法も併せて教えて くださいましたら幸いです。 Private 月 As Variant Private Sub UserForm_Initialize() 月 = Month(now) SpinButton2.Value = Day(Now) End Sub Private Sub SpinButton2_Change() 日 = SpinButton2.Value If 日 = 0 Then 月 = 月 -1 日 = 月末日(月 - 1) ElseIf 日 = 月末日(月) + 1 Then 月 = 月 +1 日 = 1 End If UserForm1.TextBox1.Value = 月 UserForm1.TextBox2.Value = 日 SpinButton2.Value = 日 ’*** End Sub Private Function 月末日(月) MyStr1 = Format(Year(Now) & "/" & 月, "yyyy/m") MyFDate = DateValue(MyStr1 & "/1") MyLDate = DateAdd("m", 1, MyFDate) - 1 月末日 = Format(MyLDate, "d") End Function
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
質問のコードの意味合いを書き直してみましたが、下のようになりました。 何も書いていないに等しい?SpinButtonの増減分を初期日付に加算し、TextBox1・TextBox2に書いています。 質問で書かれている、SpinButtonと日の関係<SpinButton2.Value = Day(Now)>は使っていません。 SpinButtonと今日の日付を同じにしているのが処理を複雑にしている原因でしょう。 SpinButton2のプロパティはMax=1000、Min=-1000にしています。(今日の前後3年位) その他の設定は変更せず、上向きボタンで日付の増、下向きボタンで日付が減ります。 Dim intYMD As Date 'フォームを開いた時の日付 Private Sub UserForm_Initialize() intYMD = Now() '今日をセット TextBox1 = Month(intYMD) '今日の月をセット TextBox2 = Day(intYMD) '今日の日をセット End Sub Private Sub SpinButton2_Change() 'SpinButton2の増減した日付をセット TextBox1 = Month(intYMD + SpinButton2) TextBox2 = Day(intYMD + SpinButton2) End Sub
その他の回答 (1)
- Hayashi_Trek
- ベストアンサー率44% (366/818)
Changeイベントの中でコントロールの値を変更するので 再度Changeイベントが発生しているわけです。 イベント処理中のフラグを使ってはどうでしょうか? つまり Private DoFlag AS Variant ' 処理中フラグ Private Sub SpinButton2_Change() IF DoFlag=True THEN Exit Sub '処理中なら再処理しない DoFlag=True '処理中フラグ開始 ・・・ Changeイベントの処理 ・・・ DoFlag=False '処理中フラグ解除 End Sub という具合です。