| 
    
     |  | もう見て居ないかな? 実際の物で試して居ないけど、作業セルを使わない方法として
 こんなやり方でも出来るみたいですね?
 
 以下は、UserFormのコードとして記述して下さい
 
 Option Explicit
 
 'Object変数をUserForm内の何処からでも参照出来る変数に宣言
 Private dicInitial As Object
 Private dicSchool As Object
 
 Private Sub ComboBox1_Change()
 
 Dim vntList As Variant
 
 With ComboBox2
 If ComboBox1.ListIndex > -1 Then
 '指定されたキーに対応する配列を取得
 vntList = dicInitial.Item(ComboBox1.Value)
 '配列の行列を入れ替えComboBox2のListに代入
 .List = Application.Transpose(vntList)
 .ListIndex = 0
 End If
 End With
 
 End Sub
 
 Private Sub ComboBox2_Change()
 
 Dim vntList As Variant
 
 With ComboBox3
 If ComboBox2.ListIndex > -1 Then
 vntList = dicSchool.Item(ComboBox2.Value)
 .List = Application.Transpose(vntList)
 .ListIndex = 0
 End If
 End With
 
 End Sub
 
 Private Sub UserForm_Initialize()
 
 Dim i As Long
 Dim lngRows As Long
 Dim vntData As Variant
 Dim vntSchool As Variant
 Dim lngSchool As Long
 Dim vntSubject As Variant
 Dim lngSubject As Long
 Dim vntInitial As Variant
 Dim lngInitial As Long
 
 'データを配列に取得
 With Sheet1.Cells(2, "A")
 lngRows = .Offset(65536 - .Row).End(xlUp).Row - .Row
 vntData = .Offset(1).Resize(lngRows, 3).Value
 End With
 
 'Dictionary オブジェクトを作成
 Set dicInitial = CreateObject("Scripting.Dictionary")
 Set dicSchool = CreateObject("Scripting.Dictionary")
 
 '頭文字配列の最大添え字の初期値を設定
 lngInitial = 1
 '頭文字配列を確保
 ReDim vntInitial(1 To lngInitial)
 '頭文字配列に初期データを代入
 vntInitial(lngInitial) = vntData(1, 1)
 '学校名配列の最大添え字の初期値を設定
 lngSchool = 1
 '学校名配列を確保
 ReDim vntSchool(1 To lngSchool)
 '学校名配列に初期データを代入
 vntSchool(lngSchool) = vntData(1, 2)
 '学科配列の最大添え字の初期値を設定
 lngSubject = 1
 '学科配列を確保
 ReDim vntSubject(1 To lngSubject)
 '学科配列に初期データを代入
 vntSubject(lngSubject) = vntData(1, 3)
 
 '取得データ配列の最後まで繰り返し
 For i = 2 To UBound(vntData, 1)
 '学校名配列の最大添え字位置の学校名が、
 'データの学校名と同じ場合(重複取り)
 If vntSchool(lngSchool) = vntData(i, 2) Then
 '学科配列を拡張して、'学科名を追加
 lngSubject = lngSubject + 1
 ReDim Preserve vntSubject(1 To lngSubject)
 vntSubject(lngSubject) = vntData(i, 3)
 Else
 '学校名Indexに、学校名をキーとして、学科配列を登録
 dicSchool.Add vntSchool(lngSchool), vntSubject
 '学科配列を初期化し、新しい学科名を代入
 lngSubject = 1
 ReDim vntSubject(1 To lngSubject)
 vntSubject(lngSubject) = vntData(i, 3)
 '頭文字配列の最大添え字位置の頭文字が
 'データの頭文字と同じ場合(重複取り)
 If vntInitial(lngInitial) = vntData(i, 1) Then
 '学校名配列を拡張し、新しい学校名を追加
 lngSchool = lngSchool + 1
 ReDim Preserve vntSchool(1 To lngSchool)
 vntSchool(lngSchool) = vntData(i, 2)
 Else
 '頭文字Indexに、頭文字をキーとして学校名配列を登録
 dicInitial.Add vntInitial(lngInitial), vntSchool
 '頭文字配列を拡張して、頭文字を追加
 lngInitial = lngInitial + 1
 ReDim Preserve vntInitial(1 To lngInitial)
 vntInitial(lngInitial) = vntData(i, 1)
 '学校名配列を初期化して、新しい学校名を代入
 lngSchool = 1
 ReDim vntSchool(1 To lngSchool)
 vntSchool(lngSchool) = vntData(i, 2)
 End If
 End If
 Next i
 '学校名Indexに、学校名をキーとして、学科配列を登録
 dicSchool.Add vntSchool(lngSchool), vntSubject
 '頭文字Indexに、頭文字をキーとして学校名配列を登録
 dicInitial.Add vntInitial(lngInitial), vntSchool
 
 With ComboBox1
 .List = Application.Transpose(vntInitial)
 .ListIndex = 0
 End With
 
 End Sub
 
 Private Sub UserForm_Terminate()
 
 Set dicInitial = Nothing
 Set dicSchool = Nothing
 
 End Sub
 
 |  |