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

ユーザーフォームで入力画面を作成し
項目入力後、実行ボタンでEXCELファイルにデーターを転記
→ユーザーフォームの全表示データを空白にする。
→終了ボタンで、ユーザーフォームを閉じる

と言う処理で

ユーザーフォームに入力段階で、必須項目に入力(選択)漏れがあると
メッセージを表示させて入力を促したいのですが

Private Sub Combobox19_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If Combobox19 = "" Then
msgbox "処理区分を選択して下さい。"
Cancel=True
End If

上記のようにすると、最後に終了ボタンを押した時にも
メッセージが出てしまいます。


Exitを Keydownにすると、うまく行ったのですが
メッセージ表示後、Combobox19にフォーカスしたいのですが
次のboxにフォーカスしてしまいます...。


何か良い方法がありましたら、お教え下さいませ。
わかりづらいかもしれませんが、よろしくお願いします。

A 回答 (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
    • good
    • 0
この回答へのお礼

KenKen_SPさん!どうもありがとうございました!

魔法のようにうまく出来ました!!
(KenKen_SPさんにとっては普通のことなのかもしれませんが
私のような初心者にとっては、本当に魔法のようです。)

新規フォームでの確認方法まで教えて頂いたので、とてもわかりやすかったです。
実際の物に置き換えて試すとなると、頭がごちゃごちゃしてわからなくなってしまいそうになるところでしたので
本当に大助かりです!

本当に、本当に、ご親切にありがとうございました!!

お礼日時:2005/11/08 08:33

#3 です。

ちょっと気になっていたのですが、、

> Combobox19の区分によって表示させる内容や計算式が変わって
> くるんです・・・。

KeyPress イベントだと Combobox19 に入力しなくてもマウスで
フォーカスを移した場合、それを検知できないのだけれども、
それは大丈夫なのですか?
    • good
    • 1
この回答へのお礼

KenKen_SPさん、フォローありがとうございます。

そうなんですねー。
私もNo.4のWendy02さんに教えて頂いた方法を試してみてそのことに気がついたのですが
そのこと以外は、私がやりたかったことが全て嘘のように解決したので、その感動の方が大きくて
そのことは「まっ、いっか!」なんて、適当なヤツになってしまっていました。

もしかして、今の条件で、マウスでフォーカスを移した場合でも検知してくれるやり方って、ありますか?

聞いておいて大変申し訳ないのですが
大掛かりな変更とかになるのでしたら、この件はあきらめます…
もし、簡単に(例えばKeyDownを○○に変えればいいだけとか)出来ることでしたら
教えて下さいませ。

わがままですみません!

お礼日時:2005/11/07 15:21

こんにちは。

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
    • good
    • 0
この回答へのお礼

Wendy02さん!!!涙ものでございますぅ!
私めなど、KeyCodeが何者かさえわからず、よくもこんなレベルで
VBAなどと言う物に手を出しているものだわと、ホントにお恥ずかしい限りです。

今回KeyDownを使うにあたっても、一覧からそれらしき物を順にやってみて
なんとなくこれが近いかなぁーなんて具合で…。

でも、Wendy02さんを筆頭に、ここの親切な方々のおかげ様を持ちまして
こんな私が、少しずつ、ホントに少しずつですが進歩(と言えるかどうか?!)している気がしています。

私の質問に対してWendy02さんが
よく 「私はこうしています」 と言う風に書いて下さることが、ホッとします…
私のやりたいことって、全く無謀なことではなく
そのような場面は、皆さんにも有り得ることなんだと思わせてもらえます。

これでも、本を見たり、自分なりに「あーでもない、こーでもない」とTRYしてみて
それでもどうにもならない時に、ここを利用させて頂くことにしているつもりです。
なんでもかんでも、「聞けばいいや」と言う風な考えではありませんので
「また、こいつ!」なんて、お思いにならず、今後とも色々助けて下さいませ!

長くなってしまい、申し訳ありませんでした。

本当にありがとうございました!!!

お礼日時:2005/11/07 15:12

fk_sapさん、こんばんは。

Wendy02です。

>Keydownにすると、うまく行ったのですが

それで、いいのだと思います。
そして、
>If Combobox19 = "" Then
>msgbox "処理区分を選択して下さい。"
>Cancel=True

のCance = True の代わりに、KeyCode = 0 にしてみてください。
    • good
    • 0
この回答へのお礼

Wendy02さん、おはようございます!
3日~6日まで休みだったので、ご回答を見せて頂くのが今朝になってしまいました。

Wendy02さんが教えて下さるのは、いつも私にとっては初めて教わることなので
「どれだけ考えても絶対にそこに行き着く訳ないよねー」と言うようなことで
それでいて、とっても単純明快で、わかりやすいですねー。

なのでいつも、まず感動、それから歓心、そして最後にやっと「勉強になったわー」って具合です!

余談が長くなってすみません!
よろしければ、もう1つお教え下さいますでしょうか?

教えて頂いたようにするとうまく行ったのですが
これは、Combobox19の▼から選択した場合のみ大丈夫なのですよねー。
これを、Combobox19に直接入力した場合や、そこにカーソルを合せて↓キーを押して選択した場合でも
メッセージが出ないようにはできませんでしょうか?

欲張りを言ってすみません。

よろしくお願いします。

お礼日時:2005/11/07 09:00

こんにちは。

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
    • good
    • 0
この回答へのお礼

KenKen_SPさん、早速ご回答頂いたのにお礼が遅くなってしまい、申し訳ありません。

今、教えて頂いたコードを試してみたのですが
私の書き方(書く場所?)が間違っているのか、うまく行ってくれませんでした。

でも、私の少ない能力でこのコードを読んだ限りでは
なんかすごーく納得してしまっています!

またゆっくりと、このコードの意味をもっとしっかり理解して
書き方を勉強したいと思います。

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

お礼日時:2005/11/07 08:48

いくつがの方法がありますが・・・。



実行ボタンの処理ではいけませんか?

If Combobox19 = "" Then
msgbox "処理区分を選択して下さい。"
Combobox19.SetFocus
exit sub
End If
    • good
    • 0
この回答へのお礼

hana-hana3さん、早速ご回答頂いたのにお礼が遅くなってしまい、申し訳ありません。

なるほど、それでも処理は通るのですが
実行ボタンに行くまでに、他の入力部分が
Combobox19の区分によって表示させる内容や計算式が変わってくるんです・・・。

説明が不十分でした。

でも、他の場面で使えるかもしれないので覚えておきます。

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

お礼日時:2005/11/07 08:42

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

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