- ベストアンサー
VBAで2つのリストボックスの連動表示に関して
- VBAを使用して2つのリストボックスを連動表示する方法について教えてください。
- Sheet1のB列とC列をListBox1に表示し、ListBox1で選択した取引会社に連動してSheet2のC列の顧客をListBox2に表示したいです。
- 具体的には、ListBox1で選択した取引会社の顧客をListBox2に表示したいです。例えば、ListBox1でA社を選択した場合、ListBox2にはA社の顧客1、顧客3、顧客5が表示されるようにしたいです。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
ACE.OLEDBプロバイダになって自ブックに使っても問題がなくなったとの事で、最近自ブックへのADOの適用に凝っています。 Excel2007以降対応です。少し変更すれば2003以前でも動きますが、バグがあるそうなのでお勧めしません。 気楽に始めましたが、意外なところ(複数)ではまってしまいました。 シート1に置いたコントロールツールボックスのListBoxで試しています。参照データのあるシートは、名前(取引名簿、顧客名簿)で指定しています。 UserF0rmへの載せ替えは容易と思います。 Worksheet_Activateで初期設定していますので、シートを一旦切り替える必要があります。 Microsoft ActiveX Data Objects Libraryに参照設定が必要です。必要により下記をご覧下さい。 http://www.asahi-net.or.jp/~ef2o-inue/vba_k/sub04_040_04.html http://www.happy2-island.com/access/gogo03/capter00307.shtml '☆ Sheet1のシートモジュールに記載 Dim cn As ADODB.Connection 'http://support.microsoft.com/kb/257819 Private Sub Worksheet_Activate() Dim rs As ADODB.Recordset Dim SQL As String Dim i As Long, j As Long Set cn = New ADODB.Connection Set rs = New ADODB.Recordset With cn .Provider = "Microsoft.ACE.OLEDB.12.0" .Properties("Extended Properties").Value = "Excel 12.0 Macro;HDR=YES" .Open ThisWorkbook.FullName End With SQL = "SELECT [取引番号],[取引社名] FROM [取引名簿$]" rs.Open SQL, cn, adOpenStatic, adLockReadOnly If rs.BOF Then MsgBox "該当するデータは存在しません", vbCritical rs.Close Set rs = Nothing Exit Sub End If Me.ListBox1.Clear Me.ListBox2.Clear With Me.ListBox1 .ColumnCount = rs.Fields.Count .ColumnWidths = "50;50" i = 0 Do Until rs.EOF .AddItem rs.Fields(0).Value For j = 1 To rs.Fields.Count - 1 .List(i, j) = rs.Fields(j).Value Next j rs.MoveNext i = i + 1 Loop End With If rs.State = 1 Then rs.Close Set rs = Nothing End Sub Private Sub Worksheet_Deactivate() On Error Resume Next cn.Close Set cn = Nothing End Sub Private Sub ListBox1_Click() Dim rs As ADODB.Recordset Dim SQL As String Dim i As Long, j As Long Set rs = New ADODB.Recordset SQL = "SELECT [顧客名] FROM [顧客名簿$] WHERE [取引社名]='myCriteria';" SQL = Replace(SQL, "myCriteria", Me.ListBox1.List(Me.ListBox1.ListIndex, 1)) rs.Open SQL, cn, adOpenStatic, adLockReadOnly If rs.BOF Then MsgBox "該当するデータは存在しません", vbCritical rs.Close Set rs = Nothing Exit Sub End If With Me.ListBox2 .Clear Do Until rs.EOF .AddItem rs.Fields(0).Value rs.MoveNext Loop End With If rs.State = 1 Then rs.Close Set rs = Nothing End Sub Private Sub ListBox2_Click() MsgBox Me.ListBox2.List(Me.ListBox2.ListIndex) End Sub ※他にもいろいろな方法がありますが、本方法はSQLの若干の知識があれば、やっている事は簡単です。 http://okwave.jp/qa/q6933753.html#answer
お礼
mitarashi さん こんにちわ。 お礼、遅くなりまして申し訳ございません。 回答頂き、本当に有難う御座いました。 Sheet上のコントロールツールボックス(ListBox)で 試して見ました。 思っていた通りに完璧に出来ました。 今度は、自分でUserF0rmへの載せ替えを 試してみます。旨く行くか不安ですけど…。 UserF0rmへの載せ替えで注意事項及び追加提案がありましたらご享受下さい。 本当に助かりました、有難う御座いました。 また、機会がありましたら、よろしくお願いします。