- ベストアンサー
EXCEL VBA----ユーザーフォーム 入力もれ防止
ユーザーフォームで入力画面を作成し 項目入力後、実行ボタンでEXCELファイルにデーターを転記 →ユーザーフォームの全表示データを空白にする。 →終了ボタンで、ユーザーフォームを閉じる と言う処理で ユーザーフォームに入力段階で、必須項目に入力(選択)漏れがあると メッセージを表示させて入力を促したいのですが Private Sub Combobox19_Exit(ByVal Cancel As MSForms.ReturnBoolean) If Combobox19 = "" Then msgbox "処理区分を選択して下さい。" Cancel=True End If 上記のようにすると、最後に終了ボタンを押した時にも メッセージが出てしまいます。 Exitを Keydownにすると、うまく行ったのですが メッセージ表示後、Combobox19にフォーカスしたいのですが 次のboxにフォーカスしてしまいます...。 何か良い方法がありましたら、お教え下さいませ。 わかりづらいかもしれませんが、よろしくお願いします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
> マウスでフォーカスを移した場合でも検知してくれるやり方って、 > ありますか? #3 は元々のロジックを重視していたのですが、視点をかえて、 ロジックそのものを考えてみます。 一例をあげるなら、ComboBox に値がないと 次のコントロールに 入力できなくするとか? 新規フォームに以下のものを配置して、確認してみて下さい。 ・ComboBox 1つ ・TextBox 2つ ・CommandButton 1つ Private Sub UserForm_Initialize() Dim i As Integer For i = 0 To 10 Me.ComboBox1.AddItem "ITEM " & Format(i, "00") Next i Me.CommandButton1.Caption = "初期化" Call CTRL_INIT End Sub Private Sub ComboBox1_Change() Dim FLAG As Boolean FLAG = Not (ComboBox1.Text = "") With Me.TextBox1 'ComboBoxの値が必須のコントロール .Enabled = FLAG If FLAG Then .Text = "" Else .Text = "(処理区分を選択して下さい)" End If End With End Sub Private Sub ComboBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean) If Me.ComboBox1.Text = "" Then Cancel = True End If End Sub Private Sub CommandButton1_Click() Call CTRL_INIT End Sub Private Sub CTRL_INIT() With Me .ComboBox1.Text = "" .TextBox1.Text = "" .TextBox2.Text = "" End With Call ComboBox1_Change Me.ComboBox1.SetFocus End Sub
その他の回答 (5)
- KenKen_SP
- ベストアンサー率62% (785/1258)
#3 です。ちょっと気になっていたのですが、、 > Combobox19の区分によって表示させる内容や計算式が変わって > くるんです・・・。 KeyPress イベントだと Combobox19 に入力しなくてもマウスで フォーカスを移した場合、それを検知できないのだけれども、 それは大丈夫なのですか?
お礼
KenKen_SPさん、フォローありがとうございます。 そうなんですねー。 私もNo.4のWendy02さんに教えて頂いた方法を試してみてそのことに気がついたのですが そのこと以外は、私がやりたかったことが全て嘘のように解決したので、その感動の方が大きくて そのことは「まっ、いっか!」なんて、適当なヤツになってしまっていました。 もしかして、今の条件で、マウスでフォーカスを移した場合でも検知してくれるやり方って、ありますか? 聞いておいて大変申し訳ないのですが 大掛かりな変更とかになるのでしたら、この件はあきらめます… もし、簡単に(例えばKeyDownを○○に変えればいいだけとか)出来ることでしたら 教えて下さいませ。 わがままですみません!
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。Wendy02です。 私は、以下のようなコードを使っています。 入力確定に何キーをお使いになるか、という問題のような気がします。通常は、Enter キー =13 ですね。他には、Tabキー =9 がありますね。必要に応じて、最初の除外部分をお決めになったらいかがでしょうか?それを入れないと、全てのキーのイベント・チェックが入ってしまいますね。 Private Sub ComboBox19_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) If KeyCode <> 13 Then Exit Sub If ComboBox19.Value = "" Then MsgBox "処理区分を選択して下さい。" KeyCode = 0 End If End Sub
お礼
Wendy02さん!!!涙ものでございますぅ! 私めなど、KeyCodeが何者かさえわからず、よくもこんなレベルで VBAなどと言う物に手を出しているものだわと、ホントにお恥ずかしい限りです。 今回KeyDownを使うにあたっても、一覧からそれらしき物を順にやってみて なんとなくこれが近いかなぁーなんて具合で…。 でも、Wendy02さんを筆頭に、ここの親切な方々のおかげ様を持ちまして こんな私が、少しずつ、ホントに少しずつですが進歩(と言えるかどうか?!)している気がしています。 私の質問に対してWendy02さんが よく 「私はこうしています」 と言う風に書いて下さることが、ホッとします… 私のやりたいことって、全く無謀なことではなく そのような場面は、皆さんにも有り得ることなんだと思わせてもらえます。 これでも、本を見たり、自分なりに「あーでもない、こーでもない」とTRYしてみて それでもどうにもならない時に、ここを利用させて頂くことにしているつもりです。 なんでもかんでも、「聞けばいいや」と言う風な考えではありませんので 「また、こいつ!」なんて、お思いにならず、今後とも色々助けて下さいませ! 長くなってしまい、申し訳ありませんでした。 本当にありがとうございました!!!
- Wendy02
- ベストアンサー率57% (3570/6232)
fk_sapさん、こんばんは。Wendy02です。 >Keydownにすると、うまく行ったのですが それで、いいのだと思います。 そして、 >If Combobox19 = "" Then >msgbox "処理区分を選択して下さい。" >Cancel=True のCance = True の代わりに、KeyCode = 0 にしてみてください。
お礼
Wendy02さん、おはようございます! 3日~6日まで休みだったので、ご回答を見せて頂くのが今朝になってしまいました。 Wendy02さんが教えて下さるのは、いつも私にとっては初めて教わることなので 「どれだけ考えても絶対にそこに行き着く訳ないよねー」と言うようなことで それでいて、とっても単純明快で、わかりやすいですねー。 なのでいつも、まず感動、それから歓心、そして最後にやっと「勉強になったわー」って具合です! 余談が長くなってすみません! よろしければ、もう1つお教え下さいますでしょうか? 教えて頂いたようにするとうまく行ったのですが これは、Combobox19の▼から選択した場合のみ大丈夫なのですよねー。 これを、Combobox19に直接入力した場合や、そこにカーソルを合せて↓キーを押して選択した場合でも メッセージが出ないようにはできませんでしょうか? 欲張りを言ってすみません。 よろしくお願いします。
- KenKen_SP
- ベストアンサー率62% (785/1258)
こんにちは。KenKen_SP です。 QueryClose イベントでモジュールレベル変数のフラグを立てます。 こんな感じ。 'モジュールレベル変数のフラグ Dim CLOSE_FLAG As Boolean Private Sub Combobox19_Exit(ByVal Cancel As MSForms.ReturnBoolean) 'CLOSE_FLAG = False のときだけ入力チェックを行う If CLOSE_FLAG = False And ComboBox19.Value = "" Then MsgBox "処理区分を選択して下さい。" Cancel = True End If End Sub Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) CLOSE_FLAG = True End Sub
お礼
KenKen_SPさん、早速ご回答頂いたのにお礼が遅くなってしまい、申し訳ありません。 今、教えて頂いたコードを試してみたのですが 私の書き方(書く場所?)が間違っているのか、うまく行ってくれませんでした。 でも、私の少ない能力でこのコードを読んだ限りでは なんかすごーく納得してしまっています! またゆっくりと、このコードの意味をもっとしっかり理解して 書き方を勉強したいと思います。 ありがとうございました!
- hana-hana3
- ベストアンサー率31% (4940/15541)
いくつがの方法がありますが・・・。 実行ボタンの処理ではいけませんか? If Combobox19 = "" Then msgbox "処理区分を選択して下さい。" Combobox19.SetFocus exit sub End If
お礼
hana-hana3さん、早速ご回答頂いたのにお礼が遅くなってしまい、申し訳ありません。 なるほど、それでも処理は通るのですが 実行ボタンに行くまでに、他の入力部分が Combobox19の区分によって表示させる内容や計算式が変わってくるんです・・・。 説明が不十分でした。 でも、他の場面で使えるかもしれないので覚えておきます。 ありがとうございました!
お礼
KenKen_SPさん!どうもありがとうございました! 魔法のようにうまく出来ました!! (KenKen_SPさんにとっては普通のことなのかもしれませんが 私のような初心者にとっては、本当に魔法のようです。) 新規フォームでの確認方法まで教えて頂いたので、とてもわかりやすかったです。 実際の物に置き換えて試すとなると、頭がごちゃごちゃしてわからなくなってしまいそうになるところでしたので 本当に大助かりです! 本当に、本当に、ご親切にありがとうございました!!