[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『Comboboxリスト抽出』(KISS)Ver2010 Win7
以前に検索用で教えていただいたのですが
教えて頂いたのを入力用に使おうと思ったのですが
上手にいかなくて大変申し訳ございません
現状ですと リストがすべて出てしまう為
フィルターを掛けたいと思ってます
Combobox1〜9配置してまして
Combobox1を選択したときConbobox1に関連したCombobox2リスト抽出
Combobox2を選択したときConbobox2に関連したCombobox3リスト抽出
Combobox3を選択したときConbobox3に関連したCombobox4リスト抽出
Combobox4を選択したときConbobox4に関連したCombobox5リスト抽出
Combobox5を選択したときConbobox5に関連したCombobox6リスト抽出
Combobox6を選択したときConbobox6に関連したCombobox7リスト抽出
上記の様なフィルタを掛けたいのですがどの様にすればよいのでしょうか
よろしくお願いいたします
Comboboxは下記のように配置しております
Private Sub UserForm_Initialize()
Dim リスト As New Collection
Dim 列 As String, 上端セル As String, 最下端セル As String
Dim セル範囲 As Range, 各セル As Range
'
列 = "A"
上端セル = 列 & "2"
最下端セル = 列 & "65536"
With Worksheets("SSS")
Set セル範囲 = .Range(.Range(上端セル), .Range(最下端セル).End(xlUp))
End With
For Each 各セル In セル範囲
On Error Resume Next
リスト.Add 各セル.Value, CStr(各セル.Value)
If Err.Number = 0 Then
Me.ComboBox1.AddItem 各セル.Value
End If
On Error GoTo 0
Next
'
列 = "B"
上端セル = 列 & "2"
最下端セル = 列 & "65536"
With Worksheets("SSS")
Set セル範囲 = .Range(.Range(上端セル), .Range(最下端セル).End(xlUp))
End With
For Each 各セル In セル範囲
On Error Resume Next
リスト.Add 各セル.Value, CStr(各セル.Value)
If Err.Number = 0 Then
Me.ComboBox2.AddItem 各セル.Value
End If
On Error GoTo 0
Next
'
列 = "C"
上端セル = 列 & "2"
最下端セル = 列 & "65536"
With Worksheets("SSS")
Set セル範囲 = .Range(.Range(上端セル), .Range(最下端セル).End(xlUp))
End With
For Each 各セル In セル範囲
On Error Resume Next
リスト.Add 各セル.Value, CStr(各セル.Value)
If Err.Number = 0 Then
Me.ComboBox3.AddItem 各セル.Value
End If
On Error GoTo 0
Next
'
列 = "D"
上端セル = 列 & "2"
最下端セル = 列 & "65536"
With Worksheets("SSS")
Set セル範囲 = .Range(.Range(上端セル), .Range(最下端セル).End(xlUp))
End With
For Each 各セル In セル範囲
On Error Resume Next
リスト.Add 各セル.Value, CStr(各セル.Value)
If Err.Number = 0 Then
Me.ComboBox4.AddItem 各セル.Value
End If
On Error GoTo 0
Next
'
列 = "E"
上端セル = 列 & "2"
最下端セル = 列 & "65536"
With Worksheets("SSS")
Set セル範囲 = .Range(.Range(上端セル), .Range(最下端セル).End(xlUp))
End With
For Each 各セル In セル範囲
On Error Resume Next
リスト.Add 各セル.Value, CStr(各セル.Value)
If Err.Number = 0 Then
Me.ComboBox5.AddItem 各セル.Value
End If
On Error GoTo 0
Next
'
列 = "f"
上端セル = 列 & "2"
最下端セル = 列 & "65536"
With Worksheets("SSS")
Set セル範囲 = .Range(.Range(上端セル), .Range(最下端セル).End(xlUp))
End With
For Each 各セル In セル範囲
On Error Resume Next
リスト.Add 各セル.Value, CStr(各セル.Value)
If Err.Number = 0 Then
Me.ComboBox6.AddItem 各セル.Value
End If
On Error GoTo 0
Next
'
列 = "G"
上端セル = 列 & "2"
最下端セル = 列 & "65536"
With Worksheets("SSS")
Set セル範囲 = .Range(.Range(上端セル), .Range(最下端セル).End(xlUp))
End With
For Each 各セル In セル範囲
On Error Resume Next
リスト.Add 各セル.Value, CStr(各セル.Value)
If Err.Number = 0 Then
Me.ComboBox7.AddItem 各セル.Value
End If
On Error GoTo 0
Next
'
列 = "H"
上端セル = 列 & "2"
最下端セル = 列 & "65536"
With Worksheets("SSS")
Set セル範囲 = .Range(.Range(上端セル), .Range(最下端セル).End(xlUp))
End With
For Each 各セル In セル範囲
On Error Resume Next
リスト.Add 各セル.Value, CStr(各セル.Value)
If Err.Number = 0 Then
Me.ComboBox8.AddItem 各セル.Value
End If
On Error GoTo 0
Next
'
列 = "I"
上端セル = 列 & "2"
最下端セル = 列 & "65536"
With Worksheets("SSS")
Set セル範囲 = .Range(.Range(上端セル), .Range(最下端セル).End(xlUp))
End With
For Each 各セル In セル範囲
On Error Resume Next
リスト.Add 各セル.Value, CStr(各セル.Value)
If Err.Number = 0 Then
Me.ComboBox9.AddItem 各セル.Value
End If
On Error GoTo 0
Next
End Sub
長いけど...
Option Explicit
Private dic As Object
Private Sub UserForm_Initialize()
Dim a, i As Long, ii As Long
Set dic = CreateObject("Scripting.Dictionary")
dic.CompareMode = 1
a = Sheets("sss").Cells(1).CurrentRegion.Resize(, 10).Value
For i = 2 To UBound(a, 1)
For ii = 1 To UBound(a, 2)
a(i, ii) = CStr(a(i, ii))
Next
If Not dic.exists(a(i, 1)) Then
Set dic(a(i, 1)) = CreateObject("Scripting.Dictionary")
dic(a(i, 1)).CompareMode = 1
End If
If Not dic(a(i, 1)).exists(a(i, 2)) Then
Set dic(a(i, 1))(a(i, 2)) = CreateObject("Scripting.Dictionary")
dic(a(i, 1))(a(i, 2)).CompareMode = 1
End If
If Not dic(a(i, 1))(a(i, 2)).exists(a(i, 3)) Then
Set dic(a(i, 1))(a(i, 2))(a(i, 3)) = _
CreateObject("Scripting.Dictionary")
dic(a(i, 1))(a(i, 2))(a(i, 3)).CompareMode = 1
End If
If Not dic(a(i, 1))(a(i, 2))(a(i, 3)).exists(a(i, 4)) Then
Set dic(a(i, 1))(a(i, 2))(a(i, 3))(a(i, 4)) = _
CreateObject("Scripting.Dictionary")
dic(a(i, 1))(a(i, 2))(a(i, 3))(a(i, 4)).CompareMode = 1
End If
If Not dic(a(i, 1))(a(i, 2))(a(i, 3))(a(i, 4)).exists(a(i, 5)) Then
Set dic(a(i, 1))(a(i, 2))(a(i, 3))(a(i, 4))(a(i, 5)) = _
CreateObject("Scripting.Dictionary")
dic(a(i, 1))(a(i, 2))(a(i, 3))(a(i, 4))(a(i, 5)).CompareMode = 1
End If
If Not dic(a(i, 1))(a(i, 2))(a(i, 3))(a(i, 4))(a(i, 5)).exists(a(i, 6)) Then
Set dic(a(i, 1))(a(i, 2))(a(i, 3))(a(i, 4))(a(i, 5))(a(i, 6)) = _
CreateObject("Scripting.Dictionary")
dic(a(i, 1))(a(i, 2))(a(i, 3))(a(i, 4))(a(i, 5))(a(i, 6)).CompareMode = 1
End If
If Not dic(a(i, 1))(a(i, 2))(a(i, 3))(a(i, 4))(a(i, 5))(a(i, 6)).exists(a(i, 7)) Then
Set dic(a(i, 1))(a(i, 2))(a(i, 3))(a(i, 4))(a(i, 5))(a(i, 6))(a(i, 7)) = _
CreateObject("Scripting.Dictionary")
dic(a(i, 1))(a(i, 2))(a(i, 3))(a(i, 4))(a(i, 5))(a(i, 6))(a(i, 7)).CompareMode = 1
End If
If Not dic(a(i, 1))(a(i, 2))(a(i, 3))(a(i, 4))(a(i, 5))(a(i, 6))(a(i, 7)).exists(a(i, 8)) Then
Set dic(a(i, 1))(a(i, 2))(a(i, 3))(a(i, 4))(a(i, 5))(a(i, 6))(a(i, 7))(a(i, 8)) = _
CreateObject("Scripting.Dictionary")
dic(a(i, 1))(a(i, 2))(a(i, 3))(a(i, 4))(a(i, 5))(a(i, 6))(a(i, 7))(a(i, 8)).CompareMode = 1
End If
If Not dic(a(i, 1))(a(i, 2))(a(i, 3))(a(i, 4))(a(i, 5))(a(i, 6))(a(i, 7))(a(i, 8)).exists(a(i, 9)) Then
Set dic(a(i, 1))(a(i, 2))(a(i, 3))(a(i, 4))(a(i, 5))(a(i, 6))(a(i, 7))(a(i, 8))(a(i, 9)) = _
CreateObject("System.Collections.ArrayList")
End If
dic(a(i, 1))(a(i, 2))(a(i, 3))(a(i, 4))(a(i, 5))(a(i, 6))(a(i, 7))(a(i, 8))(a(i, 9)).Add i
Next
Me.ComboBox1.List = dic.keys
End Sub
Private Sub ComboBox1_Change()
ClearComb 2, 9
With Me
If .ComboBox1.ListIndex <> -1 Then
.ComboBox2.List = dic(.ComboBox1.Value).keys
End If
End With
End Sub
Private Sub ComboBox2_Change()
ClearComb 3, 9
With Me
If .ComboBox2.ListIndex <> -1 Then
.ComboBox3.List = dic(.ComboBox1.Value)(.ComboBox2.Value).keys
End If
End With
End Sub
Private Sub ComboBox3_Change()
ClearComb 4, 9
With Me
If .ComboBox3.ListIndex <> -1 Then
.ComboBox4.List = dic(.ComboBox1.Value)(.ComboBox2.Value)(.ComboBox3.Value).keys
End If
End With
End Sub
Private Sub ComboBox4_Change()
ClearComb 5, 9
With Me
If .ComboBox4.ListIndex <> -1 Then
.ComboBox5.List = dic(.ComboBox1.Value)(.ComboBox2.Value)(.ComboBox3.Value)(.ComboBox4.Value).keys
End If
End With
End Sub
Private Sub ComboBox5_Change()
ClearComb 6, 9
With Me
If .ComboBox5.ListIndex <> -1 Then
.ComboBox6.List = dic(.ComboBox1.Value)(.ComboBox2.Value)(.ComboBox3.Value)(.ComboBox4.Value)(.ComboBox5.Value).keys
End If
End With
End Sub
Private Sub ComboBox6_Change()
ClearComb 7, 9
With Me
If .ComboBox6.ListIndex <> -1 Then
.ComboBox7.List = dic(.ComboBox1.Value)(.ComboBox2.Value)(.ComboBox3.Value)(.ComboBox4.Value)(.ComboBox5.Value)(.ComboBox6.Value).keys
End If
End With
End Sub
Private Sub ComboBox7_Change()
ClearComb 8, 9
With Me
If .ComboBox7.ListIndex <> -1 Then
.ComboBox8.List = dic(.ComboBox1.Value)(.ComboBox2.Value)(.ComboBox3.Value)(.ComboBox4.Value)(.ComboBox5.Value)(.ComboBox6.Value)(.ComboBox7.Value).keys
End If
End With
End Sub
Private Sub ComboBox8_Change()
ClearComb 9, 9
With Me
If .ComboBox8.ListIndex <> -1 Then
.ComboBox9.List = dic(.ComboBox1.Value)(.ComboBox2.Value)(.ComboBox3.Value)(.ComboBox4.Value)(.ComboBox5.Value)(.ComboBox6.Value)(.ComboBox7.Value)(.ComboBox8.Value).keys
End If
End With
End Sub
Private Sub ComboBox9_Change()
With Me
If .ComboBox9.ListIndex <> -1 Then
MsgBox Join(dic(.ComboBox1.Value)(.ComboBox2.Value)(.ComboBox3.Value)(.ComboBox4.Value)(.ComboBox5.Value)(.ComboBox6.Value)(.ComboBox7.Value)(.ComboBox8.Value)(.ComboBox9.Value).ToArray, vbLf), , "Lacated in"
End If
End With
End Sub
Private Sub ClearComb(myStart, myEnd)
Dim i As Long
For i = myStart To myEnd
Me.Controls("ComboBox" & i).Clear
Next
End Sub
(seiya) 2013/11/05(火) 13:50
また何かありましたら
よろしくお願いいたします
本当にありがとうございました
(KISS) 2013/11/05(火) 15:22
seiyaさん早速のお返答有難うございます
もう少し教えて頂けませんか
貴殿のマクロで抽出時して
Comboboxにデーターを入れまして
下記コードにてシートに張り付けた時
Comnbobox2〜7までのデーターがセルに反映されないのは
なぜでしょうか
教えて頂けますか
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", "ComboBox3", "ComboBox4", "ComboBox5", "ComboBox6", "ComboBox7", "ComboBox8"
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
Worksheets("SSS").Activate
With ActiveSheet
.Cells(.Cells.Rows.Count, "A").End(xlUp).Offset(1).Value = ComboBox1.Value
End With
ComboBox1.Value = ""
With ActiveSheet
.Cells(.Cells.Rows.Count, "B").End(xlUp).Offset(1).Value = ComboBox2.Value
End With
ComboBox2.Value = ""
With ActiveSheet
.Cells(.Cells.Rows.Count, "C").End(xlUp).Offset(1).Value = ComboBox3.Value
End With
ComboBox3.Value = ""
With ActiveSheet
.Cells(.Cells.Rows.Count, "D").End(xlUp).Offset(1).Value = ComboBox4.Value
End With
ComboBox4.Value = ""
With ActiveSheet
.Cells(.Cells.Rows.Count, "E").End(xlUp).Offset(1).Value = ComboBox5.Value
End With
ComboBox5.Value = ""
With ActiveSheet
.Cells(.Cells.Rows.Count, "F").End(xlUp).Offset(1).Value = ComboBox6.Value
End With
ComboBox6.Value = ""
With ActiveSheet
.Cells(.Cells.Rows.Count, "G").End(xlUp).Offset(1).Value = ComboBox7.Value
End With
ComboBox7.Value = ""
With ActiveSheet
.Cells(.Cells.Rows.Count, "H").End(xlUp).Offset(1).Value = ComboBox8.Value
End With
ComboBox8.Value = ""
With ActiveSheet
.Cells(.Cells.Rows.Count, "I").End(xlUp).Offset(1).Value = ComboBox9.Value
End With
ComboBox9.Value = ""
Cells(Rows.Count, 1).End(xlUp).Select
Intersect(Range("A:I"), Rows(ActiveCell.Row)).Interior.ColorIndex = 3
ThisWorkbook.Save
End Sub
ComboBox1.Value = "" の時点で ComboBox1_Change が反応して、ComboBox2 以降が全て空白になってしまう。
全ての ComboBoxN.Value = "" を削除して 最後に ClearComb 1, 9 としてやればOK
要約すると
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", "ComboBox3", "ComboBox4", "ComboBox5", "ComboBox6", "ComboBox7", "ComboBox8"
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
With Worksheets("SSS").Cells(Rows.Count, 1).End(xlUp)(2).Resize(, 9)
.Value = Array(ComboBox1.Value, ComboBox2.Value, ComboBox3.Value, ComboBox4.Value, _
ComboBox5.Value, ComboBox6.Value, ComboBox7.Value, ComboBox8.Value, ComboBox9.Value)
.Interior.ColorIndex = 3
End With
ClearComb 1, 9
ThisWorkbook.Save
End Sub
(seiya) 2013/11/05(火) 16:12
本当にありがとうございます
(KISS) 2013/11/05(火) 16:18
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.