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

ユーザーフォームにコンボボックス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

A 回答 (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 で使って下さい。
    • good
    • 0
この回答へのお礼

詳しくコードまで記入してくださりありがとうございます。
ソースが切れてしまったのは質問の文字数制限のためです…すみません

書いてくださったものを新しいBOOKで試したところうまくいき、自分のマクロに組み入れたところこちらでもうまく行きました!
If Me.Controls(ctrl.Name).Value = "" Thenの辺りが怪しかったでしょうかね。
こんなに早く解決できてしまうとはKenKen_SPさんありがとうございます。

追伸の内容は私も素人でまだまだ勉強不足なので今後気をつけたいと思います

delやbackspaceでコンボボックスの値を消去できるようにするというもの使わせていただきました。
delではうまくいくのですが、backspaceだと選択肢の最上位に行ってしまいますね。わたしだけでしょうか。

ありがとうございました

お礼日時:2008/09/21 19:59

提示されたコードで試してみました。


当方の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
よろしくお願いします

補足日時:2008/09/21 19:00
    • good
    • 0

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

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


このQ&Aを見た人がよく見るQ&A