プロが教えるわが家の防犯対策術!

エクセルのVBAで簡単なデータ登録のマクロを作成しています。
フォームのテキストボックスに入力した値を、エクセルシートに展開する程度の機能です。

製品コードを必須にしており、製品コードが入っていない時はエラーメッセージを表示します。
製品コードが入力されていないときは、製品コードのテキストボックスにフォーカスがあたったままにしたく、ネットで調べてExitイベントに以下の処理を作成しました。

Private Sub mySeiCD_Exit(ByVal Cancel As MSForms.ReturnBoolean)

Dim myMsgBoxValue As String

If Len(mySeiCD.Value) = 0 Then
myMsgBoxValue = MsgBox("製品コードは入力必須です。" ,vbOKOnly, "製品コード未入力")
Cancel = True
End If
End Sub

製品コード未入力の際にフォーカスはそのままになりましたが、フォームを閉じることができなくなりました。
閉じるボタンを押しても、Exitイベントにひっかかてしまいます。
当然の動きと思いますが、回避する方法はありませんでしょうか?

Exitイベントを使わずに、SetFocus を使った場合は、どうしても、次のテキストボックスにフォーカスが移動してしまいました。

以上、長くなりましたが、よろしくお願い致します。

A 回答 (3件)

Unloadステートメントを記述しているCommandButtonの


TakeFocusOnClickプロパティをFalseに設定してください。

プロパティウィンドウで設定してもいいし、
UserForm_Initializeイベントで設定してもいいです。
Private Sub UserForm_Initialize()
  Me.CommandButton1.TakeFocusOnClick = False
End Sub

あとはmySeiCD_Exitの冒頭に下記1行を追記すると良いかと。

If Not Me.Visible Then Exit Sub
    • good
    • 1
この回答へのお礼

私がやりたいと思っていた動作が実現できました。
If Not Me.Visible Then Exit Sub の振る舞いがいまひとつ理解できていませんが、勉強したいと思います。

ありがとうございました。

お礼日時:2012/01/07 12:01

ユーザーフォームのアクティベイトイベントで始めのテキストボックスをセットフォーカス。



2番目のテキストボックスではエンターイベントを使って、1番目のテキストボックスが空だったら1番目にセットフォーカス。そうでなかったら2番目にセットフォーカスと書く。

3番目も2番同様だけれど、いきなり3番目を選択するとエラーを起こすかもなので、3番目は1番目も確認するように書く。

出来ますよ。
    • good
    • 0
この回答へのお礼

ご回答頂きありがとうございました。
今後のプログラミングの参考に致します。

お礼日時:2012/01/07 14:42

VBで同様のことを行いました。


VBAのイベント順序の仕様でExitでは不可能で、Enter側でエラーチェックするしかないと考えます。

汎用的には以下のような処理を作りこむ必要があります。
(1)Exit側
 当該コントロールを記録する。
 どのようなチェックを行うかの情報を記録する。
 チェックする値を記録する。
(2)Enter側
 (2)-1 エラーチェックが不要のコントロール(キャンセルボタン等)
  記録されている情報チェックせず、当該コントロールの処理を行う。
 (2)-2 エラーチェックが必要な場合(普通のテキストボックス等)
  記録されているチェック情報に従い値をチェックする。
  エラーがあれば記録されているコントロールに制御を移す。
  エラーが無ければ当該コントロールの処理をする。

結構面倒です。
私の場合、VB4でソースを編集することが出来たので、プリプロセッサを作って、LostFocus、GotFocusに必要なコードを自動生成させました。開発量が大きかったので選択できた方法です。


質問者殿の開発規模が不明なのでこの方法がよいのか分かりません。

Exit等でダイナミックにチェックする必要がないのであれば、

「確認ボタン」を新たに設け、この確認ボタンをクリックした時、全てをチェックし、エラーのコントロールに制御を移す、

というのが楽なのではないでしょうか。
    • good
    • 0
この回答へのお礼

ご回答頂きありがとうございました。
今後のプログラミングの参考に致します。

お礼日時:2012/01/07 14:43

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A