ACCESS2000を使用しております。
フォームのボタンを押すとレポートが開くようになっています。
フォームのフィールド「終了日」がうるう年の2/28だったら、ボタンを押した時に警告のメッセージが出るようにしたいです。
現在は以下の通り、「終了日」を更新した時にメッセージが出るようにしています。
---
Private Sub 終了日_BeforeUpdate(Cancel As Integer)
Const cMsg = "うるう年ですけど、2/29じゃなくて大丈夫ですか?"
If Format(Me.終了日.Text, "mdd") = "228" And _
IsLeapYear(Year(Me.終了日.Text)) Then
If MsgBox(cMsg, vbYesNo) = vbNo Then
Cancel = True
End If
End If
End Sub
---
これをボタンの方にも流用しようと思い、(終了日を更新しない状態でもボタンを押すことがある為、その時点でもチェックを掛けたい)
以下を「マウスボタン解放時」に入れてみましたが、エラーが出てしまいました。
---
Private Sub Ctl_新_証書新規_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
Const cMsg = "うるう年ですけど、2/29じゃなくて大丈夫ですか?"
If Format(Me.終了日.Text, "mdd") = "228" And _
IsLeapYear(Year(Me.終了日.Text)) Then
If MsgBox(cMsg, vbYesNo) = vbNo Then
Cancel = True
End If
End If
End Sub
---
エラー内容は以下の通りです。
実行時エラー'2185'
コントロールがフォーカスを取得していない時に、コントロールのプロパティまたはメソッドを参照することはできません。
そのままコピペしたので、値の更新をするとかしないとか、
ボタンを押した場合では関係ないので、その辺がエラーになっているのだと思うのですが、
どこを直したら良いのか分からず、お知恵をお貸し下さい。
要は、ボタンを押した時に警告メッセージを出し、「はい」であればレポートを開き(クリック時に開くマクロが入ってます)、「いいえ」であれば、開かずに元の画面のままが良いです。
宜しくお願いいたします。
http://www.accessclub.jp/property/event/Click.html
上記にボタンをクリックするときのイベント順序が
かいてあります。つまり、
MouseDown ⇒ MouseUp ⇒ Click ⇒ DblClick ⇒ MouseUp ⇒ Click
の順序で起りますから、MouseUp ⇒ Click なので、
先にMouseUpが拾われてClickイベントが無視されてしまいます。
したがって、No2のような方法か、あるいは、
Call Ctl_新_証書新規_Click
をマクロの呼び出しのかわりに入れます。以下のように。
Private Sub Ctl_新_証書新規_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
Const cMsg = "うるう年ですけど、2/29じゃなくて大丈夫ですか?"
Me.終了日.SetFocus
If Format(Me.終了日.Text, "mdd") = "228" And _
IsLeapYear(Year(Me.終了日.Text)) Then
If MsgBox(cMsg, vbYesNo) = vbNo Then
Exit Sub
Else
MsgBox "レポートを開きます"
Call Ctl_新_証書新規_Click
End If
End If
End Sub
以下ではどうですか。
Private Sub Ctl_新_証書新規_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
Const cMsg = "うるう年ですけど、2/29じゃなくて大丈夫ですか?"
Me.終了日.SetFocus
If Format(Me.終了日.Text, "mdd") = "228" And _
IsLeapYear(Year(Me.終了日.Text)) Then
If MsgBox(cMsg, vbYesNo) = vbNo Then
Exit Sub
Else
MsgBox "レポートを開きます"
'ここにレポートを開くマクロ名を記述
End If
End If
End Sub
>コントロールがフォーカスを取得していない時に、
>コントロールのプロパティまたはメソッドを参照することはできません。
ならば、フォーカスを移せばいいのでは。
Me.終了日.SetFocus
If Format(Me.終了日.Text, "mdd") = "228" And _
それから、
>Cancel = True
これはエラーが出ます。プロシージャの引数にCancelが
設定されていません。変数扱いになります。変数宣言も
されていないのでエラーが出る、ということになります。
If MsgBox(cMsg, vbYesNo) = vbNo Then
'Cancel = True
End If
>Cancel = True
のかわりに、
Exit Sub
あるいは、
Me.Undo
Exit Sub
のような感じですか。
お礼
解決しました。ありがとうございます! マクロを呼び出すというのがヒントとなりました。 ボタンを押してレポートを開くマクロの中に、”終了日にフォーカスを移動する”を追加し、 終了日の方はフォーカス喪失時にセットしたらうまくいきました。 基本的にうるう年なのに2/28になることは”ほぼ”ありえないので、この挙動で大丈夫でした。 ありがとうございました。