- ベストアンサー
EXCEL VBA コンボボックス、テキストボックスが未入力のときメッセージを表示する方法
- EXCEL VBAでユーザーフォームにコンボボックスとテキストボックスがあり、未入力の場合にメッセージを表示する方法について教えてください。
- コンボボックスとテキストボックスの入力を必須に設定し、コマンドボタンが押された時に未入力があればメッセージを表示したいです。
- コンボボックス1が空欄でもメッセージが表示されないため、解決策を教えてください。
- みんなの回答 (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 で使って下さい。
その他の回答 (1)
- xls88
- ベストアンサー率56% (669/1189)
提示されたコードで試してみました。 当方のExcel2007では問題なく実行できています。 >コンボ1が空欄でもMsgが出ません マクロは何事もなく、実行して終了されるということですか? セルへの出力結果はどうなっていますか?
補足
早速ありがとうございます。 質問欄では文字制限があって説明が少なくなってしまいました。 コンボボックス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 よろしくお願いします
お礼
詳しくコードまで記入してくださりありがとうございます。 ソースが切れてしまったのは質問の文字数制限のためです…すみません 書いてくださったものを新しいBOOKで試したところうまくいき、自分のマクロに組み入れたところこちらでもうまく行きました! If Me.Controls(ctrl.Name).Value = "" Thenの辺りが怪しかったでしょうかね。 こんなに早く解決できてしまうとはKenKen_SPさんありがとうございます。 追伸の内容は私も素人でまだまだ勉強不足なので今後気をつけたいと思います delやbackspaceでコンボボックスの値を消去できるようにするというもの使わせていただきました。 delではうまくいくのですが、backspaceだと選択肢の最上位に行ってしまいますね。わたしだけでしょうか。 ありがとうございました