[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『VBAコンボボックスの連動』(みみ)
VBA初心者です。
連動がうまくいかず悩んでいます。
フォームにコンボボックスを3つ配置して、連動し表示、
またコンボボックスの結果をもとに
テキストボックスにも内容を反映させたいです。
コンボボックスには重複した値をなくしたいです。
コンボボックス1…品名
コンボボックス2…型
コンボボックス3…メーカー
テキストボックス1…単価 型から単価を導きたいです
テキストボックス2…会社 メーカーから会社を導きたいです
A B C D E F G 1 ID No. 品名 メーカー 型 単価 会社 2 3 4 5 : 400
よろしくお願いします。
< 使用 Excel:Excel2013、使用 OS:Windows8 >
どこがうまくいかなくて困っているんですか? コードはありませんか?
サンプルデータが全くの空欄なので やりたいことがいまいちわかりません。
連動ってことはコンボボックス1の選択内容によって コンボボックス2のリストをかえたいとか、そういうことですか? (TAKA) 2018/09/13(木) 09:05
ユーザーフォーム上に ComboBox x 3 (ComboBox1, ComboBox2, ComboBox3) TextBox x 2 (TextBox1, TextBox2) を配置
Option Explicit
Private dic As Object
Private Sub UserForm_Initialize() Dim a, i As Long Set dic = CreateObject("Scripting.Dictionary") dic.CompareMode = 1 a = Sheets("sheet1").Cells(1).CurrentRegion.Value For i = 2 To UBound(a, 1) a(i, 2) = CStr(a(i, 2)) If Not dic.exists(a(i, 2)) Then Set dic(a(i, 2)) = CreateObject("Scripting.Dictionary") dic(a(i, 2)).CompareMode = 1 End If a(i, 4) = CStr(a(i, 4)) If Not dic(a(i, 2)).exists(a(i, 4)) Then Set dic(a(i, 2))(a(i, 4)) = CreateObject("Scripting.Dictionary") dic(a(i, 2))(a(i, 4)).CompareMode = 1 End If a(i, 3) = CStr(a(i, 3)) dic(a(i, 2))(a(i, 4))(a(i, 3)) = Array(a(i, 5), a(i, 6)) Next Me.ComboBox1.List = dic.keys End Sub
Private Sub ComboBox1_Change() With Me .ComboBox2.Clear: .ComboBox3.Clear ClearTB If .ComboBox1.ListIndex = -1 Then Exit Sub .ComboBox2.List = dic(Me.ComboBox1.Value).keys End With End Sub
Private Sub ComboBox2_Change() Me.ComboBox3.Clear ClearTB If Me.ComboBox2.ListIndex = -1 Then Exit Sub Me.ComboBox3.List = dic(Me.ComboBox1.Value)(Me.ComboBox2.Value).keys End Sub
Private Sub ComboBox3_Change() ClearTB If Me.ComboBox3.ListIndex = -1 Then Exit Sub With Me .TextBox1.Value = dic(.ComboBox1.Value)(.ComboBox2.Value)(.ComboBox3.Value)(0) .TextBox2.Value = dic(.ComboBox1.Value)(.ComboBox2.Value)(.ComboBox3.Value)(1) End With End Sub
Private Sub ClearTB() Me.TextBox1.Value = "" Me.TextBox2.Value = "" End Sub
(seiya) 2018/09/13(木) 10:19
seiyaさんのプログラムを参考に作ってみます。
有難うございました。
(みみ) 2018/09/13(木) 20:26
一つ教えてほしい所がありまして
少し変更したプログラムがこれなんですが
Private Sub UserForm_Initialize()
Dim a, i As Long Set dic = CreateObject("Scripting.Dictionary") dic.CompareMode = 1 a = Sheets("sheet1").Cells(1).CurrentRegion.Value For i = 3 To UBound(a, 1) a(i, 3) = CStr(a(i, 3)) If Not dic.exists(a(i, 3)) Then Set dic(a(i, 3)) = CreateObject("Scripting.Dictionary") dic(a(i, 3)).CompareMode = 1 End If a(i, 5) = CStr(a(i, 5)) If Not dic(a(i, 3)).exists(a(i, 5)) Then Set dic(a(i, 3))(a(i, 5)) = CreateObject("Scripting.Dictionary") dic(a(i, 3))(a(i, 5)).CompareMode = 1 End If a(i, 3) = CStr(a(i, 3)) dic(a(i, 3))(a(i, 5))(a(i, 4)) = Array(a(i, 6), a(i, 7)) Next Me.ComboBox1.List = dic.keys
End Sub
Private Sub ComboBox1_Change() With Me .ComboBox2.Clear: .ComboBox3.Clear ClearTB If .ComboBox1.ListIndex = -1 Then Exit Sub .ComboBox2.List = dic(Me.ComboBox1.Value).keys End With End Sub
Private Sub ComboBox2_Change() Me.ComboBox3.Clear ClearTB If Me.ComboBox2.ListIndex = -1 Then Exit Sub Me.ComboBox3.List = dic(Me.ComboBox1.Value)(Me.ComboBox2.Value).keys End Sub
Private Sub ComboBox3_Change() ClearTB If Me.ComboBox3.ListIndex = -1 Then Exit Sub With Me .TextBox1.Value = dic(.ComboBox1.Value)(.ComboBox2.Value)(.ComboBox3.Value)(0) .TextBox2.Value = dic(.ComboBox1.Value)(.ComboBox2.Value)(.ComboBox3.Value)(1) End With End Sub
Private Sub ClearTB() Me.TextBox1.Value = "" Me.TextBox2.Value = "" End Sub
コンボボックス1の品名のリストを下までスクロールしたら
少し空白の行があってその下に品名と言うリストが入るようになってしまいました。
何処が原因なのでしょうか・・・。
(みみ) 2018/09/13(木) 20:35
>少し空白の行があってその下に品名と言うリストが入るようになってしまいました。 範囲内に空白があるのでしょうか?
UserForm_Initialize を下記に差し替えてみてください。
Private Sub UserForm_Initialize() Dim a, i As Long Set dic = CreateObject("Scripting.Dictionary") dic.CompareMode = 1 a = Sheets("sheet1").Cells(1).CurrentRegion.Value For i = 3 To UBound(a, 1) If a(i, 3) <> "" Then a(i, 3) = CStr(a(i, 3)) If Not dic.exists(a(i, 3)) Then Set dic(a(i, 3)) = CreateObject("Scripting.Dictionary") dic(a(i, 3)).CompareMode = 1 End If a(i, 5) = CStr(a(i, 5)) If Not dic(a(i, 3)).exists(a(i, 5)) Then Set dic(a(i, 3))(a(i, 5)) = CreateObject("Scripting.Dictionary") dic(a(i, 3))(a(i, 5)).CompareMode = 1 End If a(i, 3) = CStr(a(i, 3)) dic(a(i, 3))(a(i, 5))(a(i, 4)) = Array(a(i, 6), a(i, 7)) End If Next Me.ComboBox1.List = dic.keys End Sub (seiya) 2018/09/13(木) 23:44
(みみ) 2018/09/14(金) 21:41
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.