- ベストアンサー
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
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
暇なのでまたまた登場しました。(^^;;; VENZOUさんの回答にもありますように、 Key関係の変数が宣言してありませんのでそれらの型はVariantになり Key3=ComboBox3.Text このKey3には項目「設置」の数字が入りますがComboBox3.Textは文字列ですから、 Key3に代入された数字は、「数値」ではなくて「文字列の数字」になります。 ですから、 If Key3=.Cells(ico,3) Then これは、「文字列の数字」と「数値」を比較することになり 同じ、100 でもイコールでないことになるわけです。 で、今回の場合、Key3には数値が入るようにすればいいわけですから Key3 = Val(ComboBox3.Text) とか Key3 = CInt(ComboBox3.Text) とかして数値に変換してKey3に入れてやればOKです。 が、一番大事なことは、変数は必ず宣言し、変数の型は可能な限り、Variant型ではなくて、 その変数にあった型を宣言しておき、比較などその変数を扱うときは必ず同じ型にして扱うようにしましょう。 それから、 Dim Key As String Dim Key2 As String Dim Key3 as Integer Dim Key4 As Integer このように型まで宣言しておくと Key3=ComboBox3.Text このKey3には文字列の数字を代入してもエクセルの方で数値とみなしてくれますが、 やはり、先にも書いたように「数値」に変換して代入するのが正しい方法です。 以上です。
その他の回答 (2)
- venzou
- ベストアンサー率71% (311/435)
Variantの変数に数値が入った場合、文字との比較が期待どうりになってませんね。(該当箇所、多数あります。) Variant ではなく String で宣言して見て下さい。 Dim ITE As String Dim flg As Integer Dim KEY As String Dim KEY1 As String Dim KEY2 As String Dim KEY3 As String Dim KEY4 As String Dim I As Integer
お礼
できました! 宣言がまちがっていたようです。 ありがとうございました。
- onlyrom
- ベストアンサー率59% (228/384)
再度の登場です。 先ほどのComboBox3がちゃんと表示されてるのなら 今回のコードは、3を4に変えてるだけですから 条件を満たすデータがあれば表示されるはずですよね。 表示されないということは、条件を満たすデータがないと考えられます。 で、IFの後にMSGBOXを入れて条件を満足するルーチンを通ってるか確認してみたらどうですか。 If .Cells(ico, 1) = KEY And .Cells(ico, 2) = KEY2 And .Cells(ico, 3) = KEY3 Then ● MsgBox "データあり" ITE = .Cells(ico, 4).Value 以上です。
補足
何度もすみません。 データはあるのですが・・・。 やってみましたが、メッセージはでませんでした。 文字列に問題があるのでしょうか? 番号がコンボボックス4です。 データシートのA列からE列までの表です。 処理 温度 設置 番号 号 サクイル -40~85 100 1 a サクイル -40~85 100 2 b サクイル -40~125 500 3 c サクイル -40~125 500 4 d 連続 -40~125 1000 5 d すべてのコードです。 Dim ITE As Variant Dim flg As Variant Private Sub UserForm_Initialize() Dim ico As Long ico = 1 With ThisWorkbook.Worksheets("data") Do While .Cells(ico, 1) <> "" ITE = .Cells(ico, 1).Value flg = 0 For I = 0 To Me.ComboBox1.ListCount - 1 If ITE = Me.ComboBox1.List(I) Then flg = 1 Next I If flg = 0 Then Me.ComboBox1.AddItem ITE ico = ico + 1 Loop End With Me.ComboBox1.SetFocus End Sub Private Sub ComboBox1_Change() 'ComboBox2セット Dim ico As Long ico = 1 With ThisWorkbook.Worksheets("data") KEY = Me.ComboBox1.Text Me.ComboBox2.Clear Do While .Cells(ico, 1) <> "" If .Cells(ico, 1) = KEY Then ITE = .Cells(ico, 2).Value flg = 0 For I = 0 To Me.ComboBox2.ListCount - 1 If ITE = Me.ComboBox2.List(I) Then flg = 1 Next If flg = 0 Then Me.ComboBox2.AddItem ITE End If ico = ico + 1 Loop End With Me.ComboBox2.SetFocus End Sub Private Sub ComboBox2_Change() 'ComboBox3セット Dim ico As Long ico = 1 With ThisWorkbook.Worksheets("data") KEY = Me.ComboBox1.Text KEY2 = Me.ComboBox2.Text Me.ComboBox3.Clear Do While .Cells(ico, 1) <> "" If .Cells(ico, 1) = KEY And .Cells(ico, 2) = KEY2 Then MsgBox "データあり"●ここではでます。 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 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 MsgBox "データあり"●ここではでません。 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 Private Sub ComboBox4_Change() 'ComboBox5セット Dim ico As Long ico = 1 With ThisWorkbook.Worksheets("data") KEY = Me.ComboBox1.Text KEY2 = Me.ComboBox2.Text KEY3 = Me.ComboBox3.Text KEY4 = Me.ComboBox4.Text Me.ComboBox5.Clear Do While .Cells(ico, 1) <> "" If .Cells(ico, 1) = KEY And .Cells(ico, 2) = KEY2 And .Cells(ico, 3) = KEY3 And .Cells(ico, 4) = KEY4 Then ITE = .Cells(ico, 5).Value flg = 0 For I = 0 To Me.ComboBox5.ListCount - 1 If ITE = Me.ComboBox5.List(I) Then flg = 1 Next If flg = 0 Then Me.ComboBox5.AddItem ITE End If ico = ico + 1 Loop End With Me.ComboBox5.SetFocus End Sub
お礼
いつもありがとうございます。 できました! 宣言がなかなか理解できなくて・・・。 でも、本で基本を読みました。 わかったような気がします。 今後ともよろしくお願いします。