[[20100407140308]] 『コンボボックスの連携と複数シートからの参照』(T_T) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『コンボボックスの連携と複数シートからの参照』(T_T)

 はじめまして。
 見よう見まねでマクロを使用しております。

 同一ユーザーフォーム上にコンボボックス1〜9があり、
 シート「@」には
 A     B     C    D      E    F   ・・・
 都道府県  市区町村  会社名  業種     資本金  設立年月  ←1・2行目は項目行です
 東京都   千代田区  A社   化学品製造  1千万  
 大阪府   北区    C社   貿易商社   2億   
 東京都   荒川区   B社   通信     1億   
 東京都   千代田区  D社   加工業    1千万  
 ・
 ・

 シート「A」には
 A     B     C    D    E     F   ・・・
 都道府県  市区町村  会社名  部署名  担当者名  携帯番号  ←1・2行目は項目行です
 東京都   千代田区  A社   営業部  あ氏    ***
 東京都   荒川区   B社   製造部  い氏    ▼▼▼
 東京都   荒川区   B社   営業部  う氏    ○○○
 大阪府   北区    C社   購買部  え氏    ×××
 ・
 ・
 というリストがあります。

 コンボボックス1に「@」シートのA列を選択肢として表示し
 コンボボックス1の選択肢によってコンボボックス2に「@」シートのB列を表示
 コンボボックス2の選択肢によってコンボボックス3に「@」シートのC列を表示
 コンボボックス3の選択肢によってコンボボックス4に「@」シートのD列を表示

 というように連携させたグループ1のコンボボックス郡があります。そして、

 コンボボックス5に「A」シートのA列を選択肢として表示 (東京都
 コンボボックス5の選択肢によってコンボボックス6に「A」シートのB列を表示 
 コンボボックス6の選択肢によってコンボボックス7に「A」シートのC列を表示
 コンボボックス7の選択肢によってコンボボックス8に「A」シートのD列を表示
 コンボボックス8の選択肢によってコンボボックス9に「A」シートのE列を表示
 ***以下は質問には直接関係ないかと思いますが、コードに影響するかもしれない!?ので・・・
   コンボボックス9の選択肢によってラベル1に「A」シートのF列を表示
   コンボボックス9の選択肢によってラベル2に「A」シートのG列を表示
   コンボボックス9の選択肢によってラベル3に「A」シートのH列を表示
   コンボボックス9の選択肢によってラベル4に「A」シートのI列を表示
   コンボボックス9の選択肢によってラベル5に「A」シートのJ列を表示
   コンボボックス9の選択肢によってラベル6に「A」シートのK列を表示
  ******

 というように連携させたグループ2のコンボボックス郡があります。
 いずれのコンボボックスも重複は削除してリストを表示し、フォームを開いたときには何も選択されていない状態で表示されます。

 これを、シート「@」のA列〜C列とシート「A」のA列〜C列は同じ内容なので、コンボボックス4〜6を省きたいと思っています。
 つまり、
 コンボボックス1に「@」シートのA列を選択肢として表示し
 コンボボックス1の選択肢によってコンボボックス2に「@」シートのB列を表示
 コンボボックス2の選択肢によってコンボボックス3に「@」シートのC列を表示
 コンボボックス3の選択肢によってコンボボックス4に「@」シートのD列を表示   *ここまでは同じ
 コンボボックス3の選択肢によってコンボボックス5に「A」シートのD列を表示
    *シート「A」のA〜C列の絞込みは、コンボボックス1〜3のシート「@」のA〜C列絞込みで行われたことにする
 コンボボックス5の選択肢によってコンボボックス6に「A」シートのE列を表示
 ***以下は質問には直接関係ないかと思いますが、コードに影響するかもしれない!?ので・・・
   コンボボックス6の選択肢によってラベル1に「A」シートのF列を表示
   コンボボックス6の選択肢によってラベル2に「A」シートのG列を表示
   コンボボックス6の選択肢によってラベル3に「A」シートのH列を表示
   コンボボックス6の選択肢によってラベル4に「A」シートのI列を表示
   コンボボックス6の選択肢によってラベル5に「A」シートのJ列を表示
   コンボボックス6の選択肢によってラベル6に「A」シートのK列を表示
  ******

 要するに「都道府県・市区町村・会社名」の絞込みを1度ですませたいのです(シートを1つにまとめることは難しいです)。
 こういったことは可能なのでしょうか?
 ご教授宜しくお願い致します。


 なんだかよく分かりませんが
   コードもどうなっているのかよく分かりませんし。。。
 でも、ご説明だけを見ると

 > コンボボックス7の選択肢によってコンボボックス8に「A」シートのD列を表示
 いま、「A」シートのD列を表示する為のコードを実行するきっかけが
 コンボボックス7の選択 に成っている様ですが
 それを コンボボックス3の選択で行えば良いのではないでしょうか。。。?

 コンボボックス6・7に表示する為のコードから順番に必要なら
 表示以外の部分(絞り込みの部分)だけを
 コンボボックス2・3の選択で行うように変更する。

 ・・・全然外してたら済みません。

 (HANA)

 今現在はどのようにコードを組まれていますか?
 重複を絞っていると言う事はDictionaryオブジェクトを使っているのでしょうかね?

 DictionaryであればKeyに対するItemをコンボボックスによって
 シート1の内容にしたりシート2の内容にしたり切り替えれば出来そうですね。

 (momo)

 わかりにくい質問で申し訳ありません。
 現在のコードはだいたいこんな感じです。
 (PCの不具合でファイルが開けなくなってしまいました。
   以下のコードは少し前のもので、この後多少手直ししてあります。
   質問しておきながら曖昧で大変申し訳ありません。  
   過去ログ[[20090924220534]]『同一フォーム上に2組の連携するコンボボックスを作成』(SJC)を
   ほとんどそのまま参考にさせて頂いています)

 (T_T)

 '*Microsoft Scripting Runtime への参照設定要
  [ツール] → [参照設定] →[Microsoft Scripting Runtime] チェック ボックスをオンにする

 Option Explicit
 Private dic() As Scripting.Dictionary       '第1グループ用
 Private dicMax As Long                  '第1グループ用
 Private Const BOXCOUNT1 = 4            '第1グループ用  
 Private dib() As Scripting.Dictionary       '第2グループ用
 Private dibMax As Long                  '第2グループ用
 Private Const BOXCOUNT2 = 5           '第2グループ用  

 Private Sub ComboBox_Update(ByVal Combo1 As MSForms.ComboBox, _
                             ByVal Combo2 As MSForms.ComboBox, _
                             dictio() As Dictionary)                 
    Dim idx As Long
    Dim n As Long, i As Long
    Dim v
    idx = Combo1.ListIndex
    If idx < 0 Then Exit Sub
    n = Combo1.List(idx, 1)
    With Combo2
        i = 0
        .Clear
        For Each v In dictio(n).Keys
            .AddItem v
            .List(i, 1) = dictio(n).Item(v)
            i = i + 1
        Next
    End With
 End Sub

 Private Sub UserForm_Initialize()
    Dim v, sKey As String
    Dim i As Long, colm As Long, k As Long, n As Long
    With Worksheets("@")                            
        v = .Range("A2", .Cells(.Rows.Count, 1).End(xlUp)). _
              Resize(, BOXCOUNT1).Value
    End With
    dicMax = UBound(v) * BOXCOUNT1 '程度
    ReDim dic(1 To dicMax)
    Set dic(1) = New Scripting.Dictionary
    k = 1
    For i = 1 To UBound(v)
        n = 1
        For colm = 1 To BOXCOUNT1 - 1
            If Not IsEmpty(v(i, colm)) Then sKey = v(i, colm)
            If Not dic(n).Exists(sKey) Then
                k = k + 1
                dic(n)(sKey) = k       
                Set dic(k) = New Scripting.Dictionary
                n = k
            Else
                n = dic(n)(sKey)
            End If
        Next
        dic(n).Item(v(i, colm)) = Empty
    Next
    dicMax = k
    With ComboBox1                                      
        .List = Application.Transpose(Array(dic(1).Keys, dic(1).Items))
    End With

    With Worksheets("A")
        v = .Range("A2", .Cells(.Rows.Count, 1).End(xlUp)). _
              Resize(, 11).Value       'K列まで
    End With
    dibMax = UBound(v) * BOXCOUNT2 '程度
    ReDim dib(1 To dibMax)
    Set dib(1) = New Scripting.Dictionary
    k = 1
    For i = 1 To UBound(v)
        n = 1
        For colm = 1 To BOXCOUNT2 - 1
            If Not IsEmpty(v(i, colm)) Then sKey = v(i, colm)
            If Not dib(n).Exists(sKey) Then
                k = k + 1
               dib(n)(sKey) = k       
                Set dib(k) = New Scripting.Dictionary
                n = k
            Else
                n = dib(n)(sKey)
            End If
        Next
       dib(n).Item(v(i, colm)) = v(i, 8) & vbTab & v(i, 5) & vbTab & v(i, 6)      
    Next
    dibMax = k
    With ComboBox5                                
        .List = Application.Transpose(Array(dib(1).Keys, dib(1).Items))
    End With
 End Sub

 Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    Dim i As Long
    For i = dicMax To 1 Step -1
        Set dic(i) = Nothing
    Next
    For i = dibMax To 1 Step -1
        Set dib(i) = Nothing
    Next
 End Sub

 Private Sub ComboBox1_Change()
    ComboBox_Update ComboBox1, ComboBox2, dic()   
 End Sub

 Private Sub ComboBox2_Change()
    ComboBox_Update ComboBox2, ComboBox3, dic()
 End Sub

 Private Sub ComboBox3_Change()
    ComboBox_Update ComboBox3, ComboBox4, dic()
 End Sub

 Private Sub ComboBox5_Change()
    ComboBox_Update ComboBox5, ComboBox6, dib() 
 End Sub

 Private Sub ComboBox6_Change()
    ComboBox_Update ComboBox6, ComboBox7, dib()
 End Sub

 Private Sub ComboBox7_Change()
    ComboBox_Update ComboBox7, ComboBox8, dib()
 End Sub

 Private Sub ComboBox8_Change()
    ComboBox_Update ComboBox8, ComboBox9, dib()
 End Sub


 細かくは見ていませんが、参考にしてここまで作れるのであれば、逆転の発想で
 最初のリストが1つになっていれば作れるんじゃないかな? と思うので

 例えば

    Dim v(), buf, i As Long, j As Long
    With Worksheets("Sheet1")
      buf = .Range("A2").CurrentRegion.Columns("A:D").Value
    End With
    v = buf
    ReDim Preserve v(1 To UBound(buf), 1 To UBound(buf, 2) + 8)
    With Worksheets("Sheet2")
      buf = .Range("A2").CurrentRegion.Columns("D:K").Value
    End With
    For i = 1 To UBound(buf)
      For j = 1 To UBound(buf, 2)
        v(i, j + 4) = buf(i, j)
      Next j
    Next i
    Erase buf

 こんな感じでSheet1とSheet2のリストをくっつけた配列を作っておけば
 複雑な事を回避して1組のDictionaryの制御で出来るのではないでしょうか?

 丸付き数字はNetでは使えないのでSheet1、Sheet2と表記していますので変更してみてください。

 (momo)

 (momo)様 アドバイス有り難う御座います。
  Sheet1とSheet2のリストをくっつけたリストを作ったことにして動かす・・・
  ということでよいのでしょうか?(不勉強で申し訳ありません)
  以前のコードも、過去ログの意味は理解できないままに 雰囲気でいじってみたら
  とりあえず上手く動いたので良しとした・・・というのが実際の所でして・・・。

  教えて頂いたサンプルを拝見しつつ、またもや雰囲気でいじってみたのですが
  やはりちゃんと理解していないのでうまくいきません。

  コンボボックス1にSheet1のA列3行目以下を重複削除で表示したいのですが
  Sheet2のA列項目名(=A1)、D列項目名(D1)、A列(=A3以下、重複削除)が表示されます。
  このA列(=A3以下、重複削除)だけ表示させたいのですが)・・・。
  コンボボックス1の表示リストがうまくいかないので、以下のコンボボックスも当然うまくいきません。

  本当に申し訳ありませんがご指導頂ければ幸いです。

 (T_T)

 >丸付き数字はNetでは使えないのでSheet1、Sheet2と表記しています・・・
  失礼致しました。
  以下のコードsheet1、sheet2に修正致しました。

 ‘*Microsoft Scripting Runtime への参照設定要
  [ツール] → [参照設定] →[Microsoft Scripting Runtime] チェック ボックスをオンにする

 ‘<前提>
 Option Explicit
 Private dic() As Scripting.Dictionary     
 Private dicMax As Long                  
 Private Const BOXCOUNT1 = 6          ◆ComboBoxの数

 Private Sub ComboBox_Update(ByVal Combo1 As MSForms.ComboBox, _
                             ByVal Combo2 As MSForms.ComboBox, _
                             dictio() As Dictionary)          '第3引数に 使用dictionaryオブジェクト名を入れる
    Dim idx As Long
    Dim n As Long, i As Long
    Dim v
    idx = Combo1.ListIndex
    If idx < 0 Then Exit Sub
    n = Combo1.List(idx, 1)
    With Combo2
        i = 0
        .Clear
        For Each v In dictio(n).Keys
            .AddItem v
            .List(i, 1) = dictio(n).Item(v)
            i = i + 1
        Next 
    End With
 End Sub

 Private Sub UserForm_Initialize()
    Dim sKey As String
    Dim colm As Long, k As Long, n As Long
   Dim v(), buf, i As Long, j As Long
    With Worksheets("sheet1")
      buf = .Range("A3").CurrentRegion.Columns("A:D").Value
    End With
    v = buf
    ReDim Preserve v(1 To UBound(buf), 1 To UBound(buf, 2) + 8)
    With Worksheets("sheet2")
      buf = .Range("A3").CurrentRegion.Columns("D:K").Value
    End With
    For i = 1 To UBound(buf)
      For j = 1 To UBound(buf, 2)
        v(i, j + 4) = buf(i, j)
      Next j
    Next i
    Erase buf

    dicMax = UBound(v) * BOXCOUNT1 '程度
    ReDim dic(1 To dicMax)
    Set dic(1) = New Scripting.Dictionary
    k = 1
    For i = 1 To UBound(v)
        n = 1
        For colm = 1 To BOXCOUNT1 - 1
            If Not IsEmpty(v(i, colm)) Then sKey = v(i, colm)
            If Not dic(n).Exists(sKey) Then
                k = k + 1
                dic(n)(sKey) = k       '★下位のComboBox用dic番号
                Set dic(k) = New Scripting.Dictionary
                n = k
            Else
                n = dic(n)(sKey)
            End If
        Next
        dic(n).Item(v(i, colm)) = v(i, 6) & vbTab & v(i, 7) & vbTab & v(i, 8) & vbTab & v(i, 9) & vbTab & v(i, 10) & vbTab & v(i, 11)
     '---- 最後のComboBox6には F〜K列の値を連動させる
    Next
    dicMax = k
    With ComboBox1                                      '先頭レベルComboBox1の リストをセットする
        .List = Application.Transpose(Array(dic(1).Keys, dic(1).Items))
    End With
 End Sub

 Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    Dim i As Long
    For i = dicMax To 1 Step -1
        Set dic(i) = Nothing
    Next
 End Sub

 Private Sub ComboBox1_Change()
    ComboBox_Update ComboBox1, ComboBox2, dic()
 End Sub

 Private Sub ComboBox2_Change()
    ComboBox_Update ComboBox2, ComboBox3, dic()
 End Sub

 Private Sub ComboBox3_Change()
    ComboBox_Update ComboBox3, ComboBox4, dic()
 End Sub

 Private Sub ComboBox5_Change()
    ComboBox_Update ComboBox5, ComboBox6, dic()
 End Sub

 Private Sub ComboBox6_Change()
    Dim ss As String
    Dim idx As Long
    Dim v As Variant
     With ComboBox6
         idx = .ListIndex
         If idx < 0 Then Exit Sub
         v = Split(.List(idx, 1), vbTab)     'TABで結合された文字列をわける
         label1.caption = v(0)
         Label2.caption = v(1)
         Label3.caption = v(2)
     Label4.caption = v(3)
     Label5.caption = v(4)
     Label6.caption = v(5)
     End With
 End Sub

  *PC復活しました。
   現在のコードは以下の通りです。

 ‘*Microsoft Scripting Runtime への参照設定要
  [ツール] → [参照設定] →[Microsoft Scripting Runtime] チェック ボックスをオンにする

 ‘<前提>
 Option Explicit
 Private dic() As Scripting.Dictionary    'sheet1用
 Private dicMax As Long                 'sheet1用
 Private Const BOXCOUNT1 = 4          ‘sheet1用  ◆ComboBoxの数
 Private dib() As Scripting.Dictionary    'sheet2用
 Private dibMax As Long                 'sheet2用
 Private Const BOXCOUNT2 =5            'sheet2用  ◆ComboBoxの数

 Private Sub ComboBox_Update(ByVal Combo1 As MSForms.ComboBox, _
                             ByVal Combo2 As MSForms.ComboBox, _
                             dictio() As Dictionary)          '第3引数に 使用dictionaryオブジェクト名を入れる
    Dim idx As Long
    Dim n As Long, i As Long
    Dim v
    idx = Combo1.ListIndex
    If idx < 0 Then Exit Sub
    n = Combo1.List(idx, 1)
    With Combo2
        i = 0
        .Clear
        For Each v In dictio(n).Keys
            .AddItem v
            .List(i, 1) = dictio(n).Item(v)
            i = i + 1
        Next 
    End With
 End Sub

 ‘<sheet1を参照するコンボボックス>
 Private Sub UserForm_Initialize()
    Dim v, sKey As String
    Dim i As Long, colm As Long, k As Long, n As Long
    With Worksheets("sheet1")                            '------- sheet1のTree 作成
        v = .Range("A3", .Cells(.Rows.Count, 1).End(xlUp)). _
              Resize(, BOXCOUNT1).Value
    End With
    dicMax = UBound(v) * BOXCOUNT1 '程度
    ReDim dic(1 To dicMax)
    Set dic(1) = New Scripting.Dictionary
    k = 1
    For i = 1 To UBound(v)
        n = 1
        For colm = 1 To BOXCOUNT1 - 1
            If Not IsEmpty(v(i, colm)) Then sKey = v(i, colm)
            If Not dic(n).Exists(sKey) Then
                k = k + 1
                dic(n)(sKey) = k       '★下位のComboBox用dic番号
                Set dic(k) = New Scripting.Dictionary
                n = k
            Else
                n = dic(n)(sKey)
            End If
        Next
        dic(n).Item(v(i, colm)) = Empty
    Next
    dicMax = k
    With ComboBox1                                      '先頭レベルComboBox1の リストをセットする
        .List = Application.Transpose(Array(dic(1).Keys, dic(1).Items))
    End With

 ‘<Sheet2を参照するコンボボックス>
    With Worksheets("sheet2")  ' ------- sheet2のTree 作成
        v = .Range("A3", .Cells(.Rows.Count, 1).End(xlUp)). _
              Resize(, 11).Value       'K列まで
    End With
    dibMax = UBound(v) * BOXCOUNT2 '程度
    ReDim dib(1 To dibMax)
    Set dib(1) = New Scripting.Dictionary
    k = 1
    For i = 1 To UBound(v)
        n = 1
        For colm = 1 To BOXCOUNT2 - 1
            If Not IsEmpty(v(i, colm)) Then sKey = v(i, colm)
            If Not dib(n).Exists(sKey) Then
                k = k + 1
               dib(n)(sKey) = k       '★下位のComboBox用dic番号
                Set dib(k) = New Scripting.Dictionary
                n = k
            Else
                n = dib(n)(sKey)
            End If
        Next
       dib(n).Item(v(i, colm)) = v(i, 6) & vbTab & v(i, 7) & vbTab & v(i, 8) & vbTab & v(i, 9) & vbTab & v(i, 10) & vbTab & v(i, 11)
     '---- 最後のComboBox9には K列の値を連動させる
    Next
    dibMax = k
    With ComboBox5                                '先頭のComboBox5 に リスト dib(1) をセット
        .List = Application.Transpose(Array(dib(1).Keys, dib(1).Items))
    End With
 End Sub

 Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    Dim i As Long
    For i = dicMax To 1 Step -1
        Set dic(i) = Nothing
    Next
    For i = dibMax To 1 Step -1
        Set dib(i) = Nothing
    Next
 End Sub

 ‘<Sheet1を参照するコンボボックス>
 Private Sub ComboBox1_Change()
    ComboBox_Update ComboBox1, ComboBox2, dic()   '第3引数に 使用dictionaryオブジェクト名を入れる
 End Sub

 Private Sub ComboBox2_Change()
    ComboBox_Update ComboBox2, ComboBox3, dic()
 End Sub

 Private Sub ComboBox3_Change()
    ComboBox_Update ComboBox3, ComboBox4, dic()
 End Sub

 ‘<Sheet2を参照するコンボボックス>
 Private Sub ComboBox5_Change()
    ComboBox_Update ComboBox5, ComboBox6, dib()         '第3引数に 使用dictionaryオブジェクト名を入れる
 End Sub

 Private Sub ComboBox6_Change()
    ComboBox_Update ComboBox6, ComboBox7, dib()
 End Sub

 Private Sub ComboBox7_Change()
    ComboBox_Update ComboBox7, ComboBox8, dib()
 End Sub

 Private Sub ComboBox8_Change()
    ComboBox_Update ComboBox8, ComboBox9, dib()
 End Sub

 Private Sub ComboBox9_Change()
    Dim ss As String
    Dim idx As Long
    Dim v As Variant
     With ComboBox9
         idx = .ListIndex
         If idx < 0 Then Exit Sub
         v = Split(.List(idx, 1), vbTab)     'TABで結合された文字列をわける
         label1.caption = v(0)
         Label2.caption = v(1)
         Label3.caption = v(2)
     Label4.caption = v(3)
     Label5.caption = v(4)
     Label6.caption = v(5)
     End With
 End Sub

 今更気づきましたがSheet1とSheet2はA〜C列の行方向並びが同じではないんですね・・・
 行が違うだけで、必ず同じものが同じ行数だけあるんでしょうか?

 同じなら、同じ並び順にすれば簡単なのですが(まぁこれはソートを掛ければ簡単ですが)
 同じデータが無い場合はどう連携させていくのでしょう?

 同じじゃないとすると・・・少しロジックに行き詰りました。(頭が回ってません><)
 (momo)

 一応動きました。。。

 '------
Private dic As Object
Private Const BoxCount1 = 4         '第1グループ用
Private Const BoxCount2 = 5         '第2グループ用
Private Const BoxCom = 3            '共通個数
 '======
 '======
Private Sub UserForm_Initialize()
Dim tbl1 As Variant, tbl2 As Variant
Dim i As Long, ii As Long
Dim ky As String, kyi As Long
Dim itm As String, itmi As Long
Dim sdic As Object, sky As String
    Set dic = CreateObject("scripting.dictionary")
    Set sdic = CreateObject("scripting.dictionary")
    With Sheets("Sheet1")
        tbl1 = .Range("A1").Resize(.Range("A" & Rows.Count).End(xlUp).Row, BoxCount1).Value
    End With
    With Sheets("Sheet2")
        tbl2 = .Range("A1").Resize(.Range("A" & Rows.Count).End(xlUp).Row, 11).Value
    End With
    For i = 0 To BoxCount1 - 1
        For ii = 3 To UBound(tbl1, 1)
            If i = 0 Then
                ky = "_T"
            Else
                ky = ""
                For kyi = 1 To i
                    ky = ky & "_" & tbl1(ii, kyi)
                Next
                If i = BoxCom Then
                    ky = ky & "_G"
                End If
            End If
                sky = ky & "_" & tbl1(ii, i + 1)
            If Not dic.exists(ky) Then
                dic(ky) = tbl1(ii, i + 1)
            Else
                If Not sdic.exists(sky) Then
                    dic(ky) = dic(ky) & "_" & tbl1(ii, i + 1)
                End If
            End If
                sdic(sky) = Empty
        Next
    Next
    For i = 0 To BoxCount2
        For ii = 3 To UBound(tbl2, 1)
            If i = 0 Then
                ky = "_T"
            Else
                ky = ""
                For kyi = 1 To i
                    ky = ky & "_" & tbl2(ii, kyi)
                Next
                If i = BoxCom Then
                    ky = ky & "_B"
                End If
            End If
            If i < BoxCount2 Then
                sky = ky & "_" & tbl2(ii, i + 1)
                If Not dic.exists(ky) Then
                    dic(ky) = tbl2(ii, i + 1)
                Else
                    If Not sdic.exists(sky) Then
                        dic(ky) = dic(ky) & "_" & tbl2(ii, i + 1)
                    End If
                End If
                sdic(sky) = Empty
            Else
                itm = ""
                For itmi = 1 To 6
                    itm = itm & "_" & tbl2(ii, itmi + 5)
                Next
                dic(ky) = itm
            End If
        Next
    Next
    With ComboBox1
        Label_Clear
        ComboBox_Update "_T", ComboBox1
    End With
Set sdic = Nothing
End Sub
 '======
 '======
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    Set dic = Nothing
End Sub
 '======
 '======
Private Sub ComboBox_Update(ByVal stkm As String, ByVal Combo2 As MSForms.ComboBox)
    If Not dic.exists(stkm) Then Exit Sub
    With Combo2
        .List = Split(dic(stkm), "_")
        If .ListCount = 1 Then
            .ListIndex = 0
        End If
    End With
End Sub
 '======
 '======
Private Sub ComboBox_Clear(ByVal bxi As String)
Dim num As Variant
    For Each num In Split(bxi, " ")
        Controls("ComboBox" & num).Clear
    Next
End Sub
 '======
Private Sub Label_Clear()
Dim i As Long
    For i = 1 To 6
        Controls("Label" & i).Caption = ""
    Next
End Sub
 '======
 '======
Private Function ky_made(ByVal bxi As String)
Dim num As Variant
    For Each num In Split(bxi, " ")
        ky_made = ky_made & "_" & Controls("ComboBox" & num).Text
    Next
End Function
 '======
 '======
Private Sub ComboBox1_Change()
    ComboBox_Clear "2 3 4 5 6"
    Label_Clear
    ComboBox_Update ky_made("1"), ComboBox2
End Sub
 '======
Private Sub ComboBox2_Change()
    ComboBox_Clear "3 4 5 6"
    Label_Clear
    ComboBox_Update ky_made("1 2"), ComboBox3
End Sub
 '======
Private Sub ComboBox3_Change()
    ComboBox_Clear "4 5 6"
    Label_Clear
    ComboBox_Update ky_made("1 2 3") & "_G", ComboBox4
    ComboBox_Update ky_made("1 2 3") & "_B", ComboBox5
End Sub
 '======
Private Sub ComboBox5_Change()
    ComboBox_Clear "6"
    Label_Clear
    ComboBox_Update ky_made("1 2 3 5"), ComboBox6
End Sub
 '======
Private Sub ComboBox6_Change()
Dim i As Long
Dim ky As String
Dim y As Variant
    ky = ky_made("1 2 3 5 6")
    If Not dic.exists(ky) Then
        Label_Clear
        Exit Sub
    End If
    y = Split(dic(ky), "_")
    For i = 1 To 6
        Controls("Label" & i).Caption = y(i)
    Next
End Sub
 '------

 (HANA) 早速間違えてたので修正しました。2010/04/11  0:35
        もう少し(笑)修正しました。  2010/04/12 13:55

 (HANA)様 有り難う御座います。

 Sheet3にコマンドボタン2があり、それを押すとユーザーフォーム2が開き、
 そのユーザーフォーム2に質問させて頂いたコードを含むマクロを書いています。

 早速教えて頂いたコードを試してみようとしたところ、Sheet3に書いてある

 '----------------------------------
 Private Sub CommandButton2_Click() 
 UserForm2.Show
 End Sub
 '----------------------------------

 が、「アプリケーション定義又はオブジェクト定義のエラーです」となってしまいます・・・。
 原因が分かれば教えて頂けますか?
 不勉強で申し訳ありません。宜しくお願い致します。

 (T_T)

 念のためにお伺いしてみますが。。。。

 Private Sub UserForm_Initialize()
  ↓
 Private Sub UserForm2_Initialize()

 なんてやってませんよね?

 あとは。。。そのメッセージが出てデバッグボタンを押すと
 [UserForm2.Show]が黄色く成りますか?
 その後、[F8]キーを押して一行ずつコードを実行させてみて下さい。

 それから、最初に書いておきますが
 ユーザーフォームはあまり分からないので
 変なことをするかもしれません。
 その時は、許して下さい。

 (HANA)


 >Private Sub UserForm2_Initialize()
  なんてやってませんよね?
 →はい。やっていないはずです。
 (「Private Sub UserForm2_Initialize()」はNGってことで大丈夫ですよね・・・?)

 >[F8]キーを押して一行ずつコードを実行させてみて下さい
 →[UserForm2.Show]が黄色くなったまま動きません・・・。

 >ユーザーフォームはあまり分からないので変なことをするかもしれません。
 →こちらこそ何もわからずわがままばかりで・・・。
  丁寧に教えて頂き感謝しています。
  ありがとうございます。

 きっと他の部分で組んだコードで何かおかしなことをしてしまっているのでしょうね。
 少しやり直してみたいと思います。
 アドバイスを色々と本当にありがとうございます。

 (T_T)

 >(「Private Sub UserForm2_Initialize()」はNGってことで大丈夫ですよね・・・?)
 はい、変更したらNGって事です。
 UserFormの名前が変わったからと
 その部分まで変更して仕舞う方が過去に幾人か居られまして。。。

 取り敢えず、 UserForm2.Show を実行するのではなく
 VBEの方から[ F5 ]で実行してみて貰うとどうでしょう?

 >少しやり直してみたいと思います。
 でしたら、新しいブックを用意して
 ご提示のデータを使って(1・2行目が見出し。データは3行目から。
             シート名は Sheet1,Sheet2)
 Sheet2はK列までデータを用意して貰って

 ユーザーフォームに コンボボックス1〜6 リスト1〜6を作成し、コードを貼り付け。
 [F5]で実行

 してみてもらえると良いのですが。

 (HANA)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.