VBコンボボックスのイベントについて

このQ&Aのポイント
  • VBコンボボックスで指定の値をマウス操作やキーボード操作で変更したときに特定の処理を実行する方法について教えてください。
  • keystateを使って情報をクリアさせることができないため、他の方法で実現する方法があれば教えてください。
  • コンボボックスの値の変更を検知するためにKeyUpイベントとClickイベントを組み合わせて使用し、特定の処理を実行することができます。
回答を見る
  • ベストアンサー

vb コンボボックスのイベントについて

こんばんわ。 コンボボックスで、 指定の値をマウス操作でクリックしたときと、 キーボードの上下で、移動後returnを押したときだけ、 MsgBox "処理実行" を実行したいです。 keystateを使ってみたのですが、前の情報が残っているのかうまくいきません。keystateの情報をクリアさせるか、シンプルに上記を動作させる何かよい方法はありますでしょうか。 Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer Dim flg1 As Boolean Private Sub form_load() Combo1.AddItem (11) Combo1.AddItem (22) Combo1.AddItem (33) Combo1.AddItem (44) End Sub Private Sub Combo1_Keyup(KeyCode As Integer, Shift As Integer) If KeyCode = 13 Then 'return flg1 = True Call Combo1_click End If End Sub Private Sub Combo1_click() If (GetKeyState(&H26) <> 0) Or (GetKeyState(&H28) <> 0) Then ' ↑↓ If flg1 = False Then Exit Sub End If End If MsgBox "処理実行" flg1 = False End Sub

質問者が選んだベストアンサー

  • ベストアンサー
  • uruz
  • ベストアンサー率49% (417/840)
回答No.1

APIを使わなくても Private KeyFlag As Boolean Private Sub Combo1_Click() If KeyFlag = True Then Exit Sub ComboEXE End Sub Private Sub Combo1_KeyDown(KeyCode As Integer, Shift As Integer) KeyFlag = True End Sub Private Sub Combo1_KeyPress(KeyAscii As Integer) If KeyAscii = 13 Then KeyAscii = 0 ComboEXE End If End Sub Private Sub Combo1_KeyUp(KeyCode As Integer, Shift As Integer) KeyFlag = False End Sub Private Sub ComboEXE() '************************* 'クリックまたはEnterの処理 '************************* End Sub

ownmart
質問者

お礼

回答少しおそくなってしまいました。すみません。 ありがとうございます! これで実現できました! ちなみに KeyAscii = 0 は、どのようなパターンで必要なものでしょうか? ここだけわかりませんでした。

その他の回答 (1)

  • uruz
  • ベストアンサー率49% (417/840)
回答No.2

>KeyAscii = 0 KeyPressイベントのヘルプを参照してください。 コントロールでキーが押された時、KeyPressイベントが発生しますが、この時点ではまだ押されたキーはコントロールに反映されていません KeyPressイベント内でKeyAsciiの値を変更することで[A]が押されたら[B]が入力されるようにもできます また、KeyAscii = 0 にすることで押されたキーを無効(押されていない)にすることができます。 たとえば、[0]~[9]以外であればKeyAscii = 0とすれば数値しか入力できないコントロールにすることができます。 今回の例では[Enter]が押された場合コントロールに[Enter]を渡す必要がないのでゼロを代入しています。

ownmart
質問者

お礼

理解できました。ありがとうございます。 助かりました!

関連するQ&A

  • VB6.0 KeyDownイベントの対応

    VB6.0を使ってプログラム中ですが、下記の  Command10_KeyDown で、複合キー「 Ctrl + ↓」 だとイベント KeyDown を受信できるのですが、単純な キー「↓」だと、イベント KeyDown を受信でず、他のボタンにフォーカスが移ってしまいます。 Comman10_GotFocus に何か対応策を入れて、単純な キー「↓」のイベント KeyDown を受信する方法はないでしょうか? Private Sub Command10_KeyDown(KeyCode As Integer, Shift As Integer) If KeyCode = 40 Then execsub001() End If End Sub Private Sub Commnad10_Click() execsub001() End Sub Private Sub Comman10_GotFocus() 上記問題への対応策を此処に記述したい End If Private Sub execsub110() 内容は省略 End Sub

  • KeyDownイベントが機能しない

    エクセル2003を使用しています。 フォームを表示中に、エスケープキーを押したらフォームを閉じたいのですが KeyDownイベントが反応しません。 http://homepage1.nifty.com/tsware/tips/tips_251.htm を見てやってみたのですが 新ブックに新規フォームを挿入し、 Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) If KeyCode = vbKeyEscape Then Unload Me End If MsgBox "" End Sub と記載し、フォームを実行しエスケープキーを押してみました。 しかし何も起こりません。 実験用のMsgBoxも表示されません。 「エスケープキーを押したらフォームを閉じる」以前に、 KeyDownイベントが反応しないのですが 何が原因なのでしょうか? 新ブックを作ってテストしているので 余計な動作に邪魔されていないと思います。 ご指摘よろしくお願いします。

  • VB6 テキストボックスの数値をコンボボックスに反映させるには?

    TextBoxのChangeイベントを使って、 テキストボックスの数値をコンボボックスに反映させる (具体的には数値をコンボボックスのindex数にし、それぞれのindexに アニメ+str(i)としたいです。 しかし、後で書くソースは何故か、コンボボックスが アニメ1 アニメ0 アニメ1 アニメ2 アニメ3 … となってしまいます。 これを アニメ0 アニメ1 アニメ2 アニメ3 … としたいです。どうすればいいんでしょうか? Private Sub Text8_Change() Static p As Integer If Text8.Text = "" Then Exit Sub For i = 0 To p If p = 0 Then GoTo b If Form6.Combo1.NewIndex = -1 Then GoTo b Form6.Combo1.RemoveItem (i) Next i b: For i = 0 To Val(Text8.Text) Form6.Combo1.AddItem "アニメ" + str(i) Next i p = Val(Text8.Text) End Sub

  • エラー処理について

    Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) If KeyCode = 38 Then PICOCX1.Outp PortB, 7, High PICOCX1.Outp PortB, 4, High End If If KeyCode = 40 Then PICOCX1.Outp PortB, 6, High PICOCX1.Outp PortB, 5, High End If If KeyCode = 37 Then PICOCX1.Outp PortB, 7, High PICOCX1.Outp PortB, 5, High End If If KeyCode = 39 Then PICOCX1.Outp PortB, 6, High PICOCX1.Outp PortB, 4, High End If End Sub Private Sub Form_KeyUp(KeyCode As Integer, Shift As Integer) If KeyCode = 38 Then PICOCX1.Outp PortB, 7, Low PICOCX1.Outp PortB, 4, Low End If If KeyCode = 40 Then PICOCX1.Outp PortB, 6, Low PICOCX1.Outp PortB, 5, Low End If If KeyCode = 37 Then PICOCX1.Outp PortB, 7, Low PICOCX1.Outp PortB, 5, Low End If If KeyCode = 39 Then PICOCX1.Outp PortB, 6, Low PICOCX1.Outp PortB, 4, Low End If End Sub というプログラムですがこれがもしPICOCX1.Outp PortB, 4, Lowなどが実行できないとエラーとして返ってきてしまいます。このときエラー箇所をもう一度実行する方法はあるのでしょうか? お願いします。こちらの環境はVB6.0です。

  • コンボボックスのクリア方法について教えて下さい(vb6.5)

    コンボボックスのクリア方法について教えて下さい(vb6.5) ComboBox1で選択したものによって、 ComboBox2で表示するものを変えたいと思っています。 ただ、一度ComboBox1で選択した後にComboBox2を開くと、 ComboBox2は前回のものがどんどん足されていきます。 コンボボックスのクリア方法について、 どの様にすればよいかご教示のほど、 宜しくお願い致します。 Private Sub ComboBox1_Change() UserForm1.ComboBox2.RemoveItem (0) If ComboBox1.Text = 1 Then UserForm1.ComboBox2.AddItem "A" UserForm1.ComboBox2.AddItem "B" UserForm1.ComboBox2.AddItem "C" ElseIf ComboBox1.Text = 2 Then UserForm1.ComboBox2.AddItem "D" UserForm1.ComboBox2.AddItem "E" UserForm1.ComboBox2.AddItem "F" Else UserForm1.ComboBox2.AddItem "G" UserForm1.ComboBox2.AddItem "H" UserForm1.ComboBox2.AddItem "I" End If End Sub -------------------------------------- Private Sub UserForm_Initialize() UserForm1.ComboBox1.AddItem "1" UserForm1.ComboBox1.AddItem "2" UserForm1.ComboBox1.AddItem "3" End Sub

  • テキストボックスのエンターキー無効

    VB6.0について質問いたします。 テキストボックスの入力の際に改行を強制的にできないように制御したいのですが次のプログラムでは上手くいきませんでした。 Private Sub Text_KeyDown(KeyCode As Integer, Shift As Integer) If vbcode = vbKeyReturn Then Exit Sub End If End Sub エンターキーを押したとき何も実行しないようにするにはどうしたらいいですか? テキストボックスはスクロールバーを設置してMultiLine プロパティをtrueに設定しています。

  • VBで二つの信号を送るには?

    よろしくお願いします VBで計測機械の制御をしようと考えているのですが、うまくいきません 具体的にはコマンドボタンを押して、計測機器に設定を送る際 先発の信号が受け付けられず、後発の信号のみが受け付けられる結果になります それぞれの信号が間違いないことは確認しているので 入力ごとにコマンドボタンを設定することも考えましたが、 見た目もごちゃごちゃしてよくないので、できればボタンひとつで行きたいと思います 一部ですがコードを貼っておきます よろしくお願いします Private Sub Command4_Click(Index As Integer) If MSComm1.PortOpen = False Then MSComm1.PortOpen = True End If Dim W As Single W = Text1.Text W = W / 1000 MSComm1.Output = ":WAVELENGTH " & W & "e-06" & vbCrLf Static R As Integer If Combo1 = "3μw" Then R = 3 If Combo1 = "10μw" Then R = 4 If Combo1 = "30μw" Then R = 5 MSComm1.Output = ":RANGE " & R & vbCrLf End Sub

  • VB.NET 2008 Eventステートメント

    VB.NET 2008 以下の実装で実行したところ、GC強制実行後のメモリ状態に疑問を持ち質問しました。 Eventを所持したクラスの生成、削除を繰り返し、GCを強制実行したところ、 16バイトごと増加していきます。 Class1で定義したm_eventをイベントから別のタイプ、例えばIntegerやString型に変更して、 同様に実行したところ、メモリの増加は見受けられません。 なぜでしょうか? またこの現象はメモリリークといえるのでしょうか? Public Class Class1 Public Sub New() End Sub Private Event m_event() End Class Sub Main() GC.Collect() Debug.Print("####") Debug.Print(GC.GetTotalMemory(False)) Dim cls As Class1 For i As Integer = 0 To 1000 cls = New Class1 cls = Nothing If i = 0 Then GC.Collect() Debug.Print(GC.GetTotalMemory(False)) End If Next GC.Collect() Debug.Print(GC.GetTotalMemory(False)) Debug.Print("@@@@") End Sub

  • 特定のキーを入力すると、visible=falseからtrueになるよ

    特定のキーを入力すると、visible=falseからtrueになるようにコーディングしたいのですがうまくいきません。次のようにalt+F12でFrameを表示させたいのですが全く反応しません。何故でしょう。 Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) Select Case KeyCode Case vbKeyF12 If Shift = vbAltMask Then Frame2.Visible = True End If End Select End Sub アドバイス願いますm(_ _)m

  • vb6.0のプログラム

    今こんなプログラムを作っているのですがなぜか、足りない部分があると言われて困っております。 できれば教えてください。 図 ーーーーーーーーーーーーーーーー from ーーーーーーーーーーーーーーーー 残り30秒[ーーーーラベルーーーー] 000+000=000←(3つともlabel) □-------------------□←HScrollbar max100 min0 [コマンドボタン] [タイマー]←非表示 ーーーーーーーーーーーーーーーー コード Private intCount As Integer Private intSecond As Integer Private Sub cmdStart_Click() Dim intNum1 As Integer Dim intNum2 As Integer If cmdStart.Caption = "Start" Then intCount = 0 intSecond = 30 lblResult.Caption = "" cmdStart.Caption = "OK" tmrSecond.Enabled = True ElseIf cmdStart.Caption = "OK" Then If CInt(lblAnswer.Caption) = CInt(lblNum1.Caption) + CInt(lblNum2.Caption) Then lblResult.Caption = lblResult.Caption & "○" intCount = intCount + 1 Else lblResult.Caption = lblResult.Caption & "×" End If intNum1 = Rnd() * 50 intNum2 = Rnd() * 50 lblNum1.Caption = intNum1 lblNum2.Caption = intNum2 End If End Sub Private Sub hsbAnswer_Change() lblAnswer.Caption = hsbAnswer.Value End Sub Private Sub tmrSecond_Timer() intSecond = intSecond - 1 lblTime.Caption = "残り" & intSecond & "秒" If intSecond = 0 Then tmrSecond.Enabled = False MsgBox (intCount & "問正解") cmdStart.Caption = "Start" Else End If End Sub どうぞよろしくお願いします。

専門家に質問してみよう