• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:EXCEL VBA コンボボックス、テキストボックスが未入力のときメッセージを表示する方法)

EXCEL VBA コンボボックス、テキストボックスが未入力のときメッセージを表示する方法

このQ&Aのポイント
  • EXCEL VBAでユーザーフォームにコンボボックスとテキストボックスがあり、未入力の場合にメッセージを表示する方法について教えてください。
  • コンボボックスとテキストボックスの入力を必須に設定し、コマンドボタンが押された時に未入力があればメッセージを表示したいです。
  • コンボボックス1が空欄でもメッセージが表示されないため、解決策を教えてください。

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

  • ベストアンサー
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.2

こんにちは。 バグらしいバグは掲載されたソースからは読み取れません。ComboBox に どのようにデータを追加しているのか、どのようなデータなのかあたり からも検証しないと。 また、ソースが途中で途切れてますよ。ちゃんと End Sub まで、掲載して 下さい。 とりあえず、新規ブックで Userform を挿入し、  ・Textbox1  ・ComboBox1  ・ComboBox2  ・CommandButton1 をそれぞれ配置してから、下記ソースを貼り付けて動かしてみて下さい。 Private ws As Worksheet Private Sub UserForm_Initialize()      Set ws = Sheets("sheet1")      ' // ComboBox 用テストデータ作成   ws.Cells.Delete   With ws.Range("A1:C10")     .Formula = "=""R""&ROW()&""C""&COLUMN()"     .Value = .Value   End With   With ws.Range("D1:D10")     .Formula = "=""ITEM""&ROW()"     .Value = .Value   End With   ' // 選択 ONLY のコンボボックス(fmStyleDropDownList)に   ' // データを追加する   With Me.ComboBox1     .Style = fmStyleDropDownList     .ColumnCount = 2     .List = ws.Range("A1:C10").Value   End With   With Me.ComboBox2     .Style = fmStyleDropDownList     .List = ws.Range("D1:D10").Value   End With End Sub ' // Style が fmStyleDropDownList のコンボボックスで値を消去できるようにする Private Sub ComboBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)   If KeyCode = 8 Or KeyCode = 46 Then ' 8:backspace / 46: delete key     ComboBox1.ListIndex = -1   End If End Sub Private Sub ComboBox2_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)   If KeyCode = 8 Or KeyCode = 46 Then ' 8:backspace / 46: delete key     ComboBox2.ListIndex = -1   End If End Sub Private Sub CommandButton1_Click()   Dim ctrl As Control, txt1 As String, txt2 As String   Dim ret As Integer      For Each ctrl In Me.Controls     Select Case ctrl.Name       Case "ComboBox1", "ComboBox2", "TextBox1"         If Len(Trim$(ctrl.Text)) = 0 Then           txt1 = txt1 & ctrl.Name & vbLf         Else           txt2 = txt2 & ctrl.Text & vbLf         End If       Case Else     End Select   Next      If Len(txt1) > 0 Then     MsgBox "以下の値を入力してください" & vbLf & txt1, vbExclamation     Exit Sub   Else     ret = MsgBox("以下の値を入力します" & vbLf & txt2, vbOKCancel)     If ret <> vbOK Then Exit Sub   End If End Sub 追伸:: ....余計なお世話ですが。 ■1点目: 変数名が違います。 > Dim ctrl As Control, tst1 As String, txt2 As String txt1 As String ですよね。このようなミスを防ぐ意味で、Option Explicit を宣言のうえ、プログラムを作成する習慣をつけた方が、上達が速いですよ。 ■2点目: For Each ループについて For Each ctrl In Me.Controls のループで > Me.Controls(ctrl.Name).Value とするのは、折角 For Each を使う意味が無くなってしまいますから、 そのまま ctrl.value とか、ctrl.text で使って下さい。

hiro_ele
質問者

お礼

詳しくコードまで記入してくださりありがとうございます。 ソースが切れてしまったのは質問の文字数制限のためです…すみません 書いてくださったものを新しいBOOKで試したところうまくいき、自分のマクロに組み入れたところこちらでもうまく行きました! If Me.Controls(ctrl.Name).Value = "" Thenの辺りが怪しかったでしょうかね。 こんなに早く解決できてしまうとはKenKen_SPさんありがとうございます。 追伸の内容は私も素人でまだまだ勉強不足なので今後気をつけたいと思います delやbackspaceでコンボボックスの値を消去できるようにするというもの使わせていただきました。 delではうまくいくのですが、backspaceだと選択肢の最上位に行ってしまいますね。わたしだけでしょうか。 ありがとうございました

その他の回答 (1)

  • xls88
  • ベストアンサー率56% (669/1189)
回答No.1

提示されたコードで試してみました。 当方のExcel2007では問題なく実行できています。 >コンボ1が空欄でもMsgが出ません マクロは何事もなく、実行して終了されるということですか? セルへの出力結果はどうなっていますか?

hiro_ele
質問者

補足

早速ありがとうございます。 質問欄では文字制限があって説明が少なくなってしまいました。 コンボボックス1(日付)はSheet1の縦列を選択し、2(勘定項目)では横列を選択し、それによってテキストボックス(経費金額)の内容をどのセルへ入力するか決めます。 コンボボックス2やテキストボックス1を空欄にしてコマンドボタンを押すと、「以下の値を入力してください...」と空欄になっている場所を示すメッセージが表示されます。 しかしコンボボックス1を空欄にし、コンボボックス2とテキストボックス1を入力した状態でコマンドボタンを押すと、「以下の値を入力します」という、必須項目の入力はできている方のメッセージが表示されてしまいます。 実際このメッセージが表示されてもコンボボックス1が入力されていないのでセルへの出力はされません。 必須項目を入力した状態でコマンドボタンを押すと、「以下の値を入力します (コンボボックス1の内容、2の内容、テキストボックス1の内容)」と表示され、セルへの出力も行われます。 先ほどのコードから後の部分です。 r = Me.ComboBox1.ListIndex + 5 ’5行目からスタートする c = Me.ComboBox2.ListIndex + 19 ’19列目からスタートする If ws.Cells(r, c).HasFormula Then ws.Cells(r, c).FormulaLocal = ws.Cells(r, c).FormulaLocal & "+" & TextBox1.Value Else ws.Cells(r, c).FormulaLocal = "=" & TextBox1.Value End If If ws.Cells(r, 18) = 0 Then ws.Cells(r, 18) = Me.TextBox2.Text Else ws.Cells(r, 18).Value = ws.Cells(r, 18).Value & "," & TextBox2.Value End If End If Set ws = Nothing Me!ComboBox1 = Null’入力後は値をクリアする Me!ComboBox2 = Null Me!TextBox1 = Null Me!TextBox2 = Null End Sub よろしくお願いします