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

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

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

ユーザーフォームにコンボボックス2個textboxが2個あります コンボは選択のみです。 コンボとtextbox1は入力必須にして、空欄でコマンドボタンが押された時はメッセージを表示したいです OKwebを参考に作ったのですが、コンボ1が空欄でもMsgが出ません 願いします Private Sub CommandButton1_Click() Dim ctrl As Control, tst1 As String, txt2 As String Dim ws As Worksheet Set ws = Sheets("sheet1") For Each ctrl In Me.Controls Select Case ctrl.Name Case "ComboBox1", "ComboBox2", "TextBox1" If Me.Controls(ctrl.Name).Value = "" Then txt1 = txt1 & ctrl.Name & vbLf Else txt2 = txt2 & Me.Controls(ctrl.Name).Value & vbLf End If 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

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

  • ベストアンサー
  • 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 よろしくお願いします

関連するQ&A

  • Excel VBAのコンボボックス

    お世話になります。 コンボボックス1と2と3は選択されますが コンボボックス4には何の表示もされません。 選択して条件設定は4つ以上できないのでしょうか? Dim ITE As Variant Dim flg As Variant Private Sub ComboBox3_Change() 'ComboBox4セット Dim ico As Long ico = 1 With ThisWorkbook.Worksheets("data") KEY = Me.ComboBox1.Text KEY2 = Me.ComboBox2.Text KEY3 = Me.ComboBox3.Text Me.ComboBox4.Clear Do While .Cells(ico, 1) <> "" If .Cells(ico, 1) = KEY And .Cells(ico, 2) = KEY2 And .Cells(ico, 3) = KEY3 Then ITE = .Cells(ico, 4).Value flg = 0 For I = 0 To Me.ComboBox4.ListCount - 1 If ITE = Me.ComboBox4.List(I) Then flg = 1 Next If flg = 0 Then Me.ComboBox4.AddItem ITE End If ico = ico + 1 Loop End With Me.ComboBox4.SetFocus End Sub

  • Excel VBAのコンボボックスにて条件で絞込みをしたいのですが

    いつもお世話になっています。 コンボボックスの3個目が表示されません。 コンボボックス1と2はうまく表示されます。 よろしくお願いします。 Private Sub ComboBox2_Change() Dim ico As Long ico = 1 With ThisWorkbook.Worksheets("data") KEY = Me.ComboBox1.Text KET2 = Me.ComboBox2.Text KET3 = Me.ComboBox3.Text Me.ComboBox3.Clear Do While .Cells(ico, 1) <> "" If .Cells(ico, 1) = KEY And .Cells(ico, 2) = KEY2 Then ITE = .Cells(ico, 3).Value flg = 0 For I = 0 To Me.ComboBox3.ListCount - 1 If ITE = Me.ComboBox3.List(I) Then flg = 1 Next If flg = 0 Then Me.ComboBox3.AddItem ITE End If ico = ico + 1 Loop End With Me.ComboBox3.SetFocus End Sub

  • テキストボックスの表示について

    visual basic2010を使用しています。 コンボボックスAの選択が1~4だった時、コンボボックスB、C、Dの選択された結果を、ボタンクリックを経てテキストボックスに表示させるにはどうすればいいでしょうか? If ComboBox1.Text = "1" Then TextBox1.Text = (ComboBox2.Text) TextBox1.Text = (ComboBox3.Text) TextBox1.Text = (ComboBox4.Text) ElseIf ComboBox1.Text = "2" Then TextBox2.Text = (ComboBox2.Text) TextBox2.Text = (ComboBox3.Text) TextBox2.Text = (ComboBox4.Text) ElseIf ComboBox1.Text = "3" Then TextBox3.Text = (ComboBox2.Text) TextBox3.Text = (ComboBox3.Text) TextBox3.Text = (ComboBox4.Text) Else TextBox4.Text = (ComboBox2.Text) TextBox4.Text = (ComboBox3.Text) TextBox4.Text = (ComboBox4.Text) End If 実行した結果、ComboBox4のみの結果がテキストボックスに表示されてしまいました。 '変数を使った場合 If ComboBox2.Text = "1" Then Dim st As String st = (ComboBox3.Text),(ComboBox4.Text),(ComboBox5.Text) textbox1.Text = st ElseIf ~~~~~~~~~~^ こちらは「ステートメントの終わりを指定してください」と出て動作しませんでした。 以上、宜しくお願い致します。

  • コンボボックスの変更に応じてテキストボックスの有効を切り替える(ExcelVBA2007)

    お世話になります。 Excel VBA 2007で質問です。 今、  Label1 ComboBox1 TextBox1  Label2 ComboBox2 TextBox2 ・・・  Label100 ComboBox100 TextBox100 のようなフォームがあるとします。 ComboBox1~100は「Any」「is」「is not」のいずれかの値が取れ、初期値はAnyとします。 TextBox の Enabled プロパティの初期値は False とします。 やりたいことは、 ComboBox が「Any」でない場合(is または is not のいずれかの場合)にのみその右隣の TextBox の Enabled プロパティを True にしたいのです。 いま、ComboBox30 を Any から is に切り替えたとします。 すると、TextBox30.Enabled を False から True にしたいのです。 ここで、ComboBox30 を is から is not に切り替えたとします。 TextBox30.Enabled は True のままです。 ここで、ComboBox30 を is not から Any に切り替えたとします。 すると、TextBox30.Enabled を True から False にしたいのです。 ComboBox のイベントハンドラで Sub ComboBox30_Change ()  If ComboBox30.Value = "Any" Then   TextBox30.Enabled = "False"  Else   TextBox30.Enabled = "True"  End If End Sub のように書けばいいことは分かっているのですが、その場合は数字だけ変えたイベントハンドラを100個書かなければなりません。 このイベントハンドラを1個にすることはできるでしょうか。 (コンボボックス100個のうちどれかが変更されたら、変更されたコンボボックスの番号を知りながら呼び出されるハンドラ) 次善の策として、 Sub ComboBox30_Change ()  userSubroutine End Sub のように書くこともできるかと思いますが、この場合、どのコンボボックスが変更されたか(どのイベントハンドラが起動されたか)を知って、userSubroutine に渡さなければなりません。 よろしくお願いします!

  • エクセル VBA OptionButtonからTextBox

    すいません! OptionButtonなら 下記の記述でエラー表示を 簡単にできるのですが これがOptionButtonではなく TextBoxならどのように変化したら 良いのでしょうか? すいません、教えて下さい! Private Sub 記録_Click() Dim i As Integer Dim Cnt As Integer Cnt = 0 For i = 1 To 6 Step 1 If Me.Controls("OptionButton" & i).Value Then Cnt = i Exit For End If Next i If Cnt = 0 Then MsgBox "選択されていません" Exit Sub End If If Me.Controls("Combobox" & Cnt).Value = "" Then MsgBox Me.Controls("OptionButton" & Cnt).Caption & " の内容が選択されていません" Exit Sub End If With 記入フォーム .TextBox5.Value = Me.Controls("OptionButton" & Cnt).Caption .TextBox6.Value = Me.Controls("Combobox" & Cnt).Value End With Unload Me End Sub

  • テキストボックスかコンボボックスを条件としたい

    フォーム上のコントロールを取得する時に、 「テキストボックスかコンボボックスなら」としたいのですが、VBAコードがわかりません。 ************************************************************ Sub Sample() Dim myCtrl As Control Dim myForm As String myForm = "フォーム1" For Each myCtrl In Forms(myForm).Controls If myCtrlのタイプがテキストボックス Or コンボボックス Then Debug.Print myCtrl.Name End If Next End Sub ************************************************************ に修正していただけますか? ControlType プロパティを使うと思うのですが、使い方がわかりません。 ご回答よろしくお願いします。

  • EXCEL VBA ユーザーフォーム内のテキストボックスを一括処理する方法について

    EXCEL VBAのユーザーフォームについて質問があります。 ユーザーフォームを作り、その中にコンボボックスを1個、テキストボックスを100個設置する。 コンボボックスの値が1のときはテキストボックス1~テキストボックス50までのEnabledをFalseに設定し、 コンボボックスの値が2のときはテキストボックス1~テキストボックス100までのEnabled をFalseに設定する。 このとき、TextBox1.Enabled = False、TextBox2.Enabled = False・・・と一つ一つ書いていくのではなく、 セルを処理するときと同様に、テキストボックスの番号を変数にして処理することは可能でしょうか。 Private Sub ComboBox1_Change()  Dim i As Integer   If ComboBox1.Value = 1 Then   For i = 1 To 50   TextBox(i).Enabled = False   Next i   ElseIf ComboBox1.Value = 2 Then   For i = 1 To 100   TextBox(i).Enabled = False   Next i   End If End Sub というような処理をイメージしているのですが、うまくいきません。どうぞよろしくお願いいたします。

  • Excel VBAでコンボボックスで選択

    コンボボックスで選択したいと思っていますがうまくいきません。 教えてください。 Private Sub userform_initialize()  With ComboBox2   .Font.Size = 12   .AddItem "A"   .AddItem "B"   .AddItem "C"  End With If ComboBox2 = "A" Then  With ComboBox3   .Font.Size = 12  .AddItem "a-1"  .AddItem "a-2"  End With ElseIf ComboBox2 = "B" Then With ComboBox3   .Font.Size = 12  .AddItem "b-1" .AddItem "b-2" End With Else: ComboBox2 = "C" With ComboBox3 .Font.Size = 12 .AddItem "c-1" .AddItem "c-2" End With End If End Sub コンボボックス2で"A"を選んだら、コンボボックス3には"a-1とa-2"の選択したい のですが、"c-1,c-2"しかでません。よろしくお願いします。

  • エクセル VBA MsgBox

    1)下記の記述だと コンボが空白ならエラー表示が出て Okをクリックすると ”記録しますか?” となります! そこをエラー表示されたら UserFormに戻り 空白が無くなったら ”記録しますか?” というMegBoxにしたいのですが どう変化すれば良いのでしょうか? 教えて下さい! Private Sub CommandButton1_Click() Dim i As Integer For i = 1 To 10 If Controls("ComboBox" & i).Text = "" Then MsgBox "選択されていません確認して下さい!", vbInformation, "良く見て下さい!" Exit For End If Next If MsgBox("記録しますか?", vbOKCancel) = vbOK Then With UesrForm From.TextBox1 = Val(UesrFrom.ComboBox1) + _ Val(UesrFrom.ComboBox2) + Val(UesrFrom.ComboBox3) + _ Val(UesrFrom.ComboBox4) + Val(UesrFrom.ComboBox5) From.TextBox2 = Val(UesrFrom.ComboBox6) + _ Val(UesrFrom.ComboBox7) + Val(UesrFrom.ComboBox8) + _ Val(UesrFrom.ComboBox9) + Val(UesrFrom.ComboBox10) End With MsgBox " 記録します!" Unload Me Else MsgBox " キャンセル!!" End If End Sub

  • VBA コンボボックス

    VBAコンボボックスで AAAを選択→処理A BBBを選択→処理B CCCを選択→処理C としている場合、 AAAを選択→処理Aの後、コンボボックスで再度AAAをクリックしても次の処理Aにいきません。いったんBBBをクリックしてしてAAAをクリックすると処理Aに行きますが、連続AAAをクリックして処理Aはできないでしょうか。 何か方法はありませんか? Private Sub ComboBox1_Change() If ComboBox1.Value = "AAA" Then   ’処理Aへ ElseIf ComboBox1.Value = "BBB" Then   ’処理Bへ Else   ’処理Cへ End If End Sub

専門家に質問してみよう