[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『複数コンボボックスの連携について』(hide)
複数コンボボックスの連携について過去回答欄にて下記のコードを見つけ
是非活用させて頂こうとしましたが、知識的に不足している為、理解出来ません。
5個のコンボボックスを連携させてあり、シートのA列からE列までの連携です。
これをC列からG列に変更したいのですが、難しくて解析出来ない為どうなっているのか
理解できません。変更して頂ければ照らし合わせて勉強できるので宜しくお願いします。
本当に作った方凄いと感じました。
Private myComb As New Collection
Private myRng As Range
Private Sub UserForm_Initialize()
Dim i As Long, tbl As Variant
For i = 1 To 5
myComb.Add Me.Controls("ComboBox" & i)
Next i
With Worksheets("Sheet1").Range("A1").CurrentRegion
Set myRng = .Offset(1).Resize(.Rows.Count - 1)
End With
With CreateObject("Scripting.Dictionary")
tbl = myRng.Resize(, 1).Value
For i = 1 To UBound(tbl)
If Not .Exists(tbl(i, 1)) Then
.Add tbl(i, 1), ""
End If
Next i
Me.ComboBox1.List = .keys
End With
End Sub
Private Sub ComboBox1_Change() SetList 1 End Sub
Private Sub ComboBox2_Change() SetList 2 End Sub
Private Sub ComboBox3_Change() SetList 3 End Sub
Private Sub ComboBox4_Change() SetList 4 End Sub
Private Sub ComboBox5_Change() SetList 5 '必要無いけど・・・ End Sub
Private Sub SetList(CntNum As Long)
Dim tbl1 As Variant, tbl2 As Variant, i As Long, myKey As String
If CntNum >= myComb.Count Then Exit Sub
For i = CntNum + 1 To myComb.Count
myComb(i).Clear
Next i
tbl1 = myRng.Resize(, CntNum).Value
tbl2 = myRng.Offset(, CntNum).Resize(, 1).Value
For i = 1 To CntNum
myKey = myKey & vbTab & myComb(i).Value
Next i
With CreateObject("Scripting.Dictionary")
For i = 1 To UBound(tbl1)
If Join(Application.WorksheetFunction.Index(tbl1, i, 0), vbTab) = Mid(myKey, 2) Then
If Not .Exists(tbl2(i, 1)) Then
.Add tbl2(i, 1), ""
End If
End If
Next i
myComb(CntNum + 1).List = .keys
End With
End Sub
< 使用 Excel:Excel2007、使用 OS:Windows7 >
参考になるかな? [[20131105121455]] 『Comboboxリスト抽出』(KISS)
(seiya) 2014/06/18(水) 11:36
おじゃまします。 かぶってましたら、すみません m(_ _)m
'★ 事前に Microsoft Scripting Runtimeへの参照設定が必要です '----------------------------------------------------------- Option Explicit Private dic As Scripting.Dictionary Dim a, b, c, d, e
Private Sub UserForm_Initialize()
Dim v, i&
With Worksheets("Sheet1")
v = .Range("C2", .Cells(.Rows.Count, "C").End(xlUp) _
).Resize(, 5).Value 'C列からG列までを配列に
End With
Set dic = New Dictionary
For i = 1 To UBound(v)
a = v(i, 1)
b = v(i, 2)
c = v(i, 3)
d = v(i, 4)
e = v(i, 5)
If Not dic.Exists(a) Then Set dic(a) = New Dictionary
If Not dic(a).Exists(b) Then Set dic(a)(b) = New Dictionary
If Not dic(a)(b).Exists(c) Then Set dic(a)(b)(c) = New Dictionary
If Not dic(a)(b)(c).Exists(d) Then Set dic(a)(b)(c)(d) = New Dictionary
If Not dic(a)(b)(c)(d).Exists(e) Then Set dic(a)(b)(c)(d)(e) = New Dictionary
Next
ComboBox1.List = dic.Keys()
End Sub
Private Sub ComboBox1_Change()
a = ComboBox1.Value
ComboBox2.List = dic(a).Keys()
ComboBox3.ListIndex = -1
ComboBox4.ListIndex = -1
ComboBox5.ListIndex = -1
End Sub
Private Sub ComboBox2_Change()
b = ComboBox2.Value
ComboBox3.List = dic(a)(b).Keys()
ComboBox3.ListIndex = -1
ComboBox4.ListIndex = -1
ComboBox5.ListIndex = -1
End Sub
Private Sub ComboBox3_Change()
c = ComboBox3.Value
If Len(c) Then ComboBox4.List = dic(a)(b)(c).Keys()
ComboBox4.ListIndex = -1
ComboBox5.ListIndex = -1
End Sub
Private Sub ComboBox4_Change()
d = ComboBox4.Value
If Len(d) Then ComboBox5.List = dic(a)(b)(c)(d).Keys()
ComboBox5.ListIndex = -1
End Sub
(kanabun) 2014/06/18(水) 12:45
「参照設定」は、VBEの「ツール」メニューにあります。 http://www.tipsfound.com/VBA/01005.vbhtml (kanabun) 2014/06/18(水) 21:44
kanabunさん提案ありがとうございます。
勉強の為に質問のコードで何処をどう変えれば
C列からG列に変更出来るのかな?と悩んでいます。
今後教えていただいたコードは是非活用させて頂こうと思います。
(hide) 2014/06/19(木) 08:51
こんにちは〜
> 質問のコードで何処をどう変えれば > C列からG列に変更出来るのかな?と悩んでいます。
ぼくも最初に引用されたコレクションを使ったコードは 解読し切れてません。
> Private Sub SetList() このプロシージャで毎回シートからリストを組み立ててるようですね?
> With Worksheets("Sheet1").Range("A1").CurrentRegion
> Set myRng = .Offset(1).Resize(.Rows.Count - 1)
> End With
ここで、表範囲を(1行目はカットして)取得しているようです。
ぼくの書いたのでは
> With Worksheets("Sheet1")
> v = .Range("C2", .Cells(.Rows.Count, "C").End(xlUp) _
> ).Resize(, 5).Value 'C列からG列までを配列に
> End With
で、C〜G列 範囲を取得して 範囲の値を配列に放り込んでいます。
(kanabun) 2014/06/19(木) 12:19
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.