本文利用excel圖表記錄集技巧,創建級聯列表框。
示例效果如下圖1所示。
圖1
正如上圖1所演示的,創建的一組列表框-Region,Market和State可以聯動工作。也就是說,如果選擇列表框Region中的某項,那么列表框Market和State僅顯示在所選擇的Region項中與該項關聯的值。同樣,選擇列表框Market中的某項,列表框State中僅顯示與Market項中與該項關聯的值。
解決方法
使用ADO記錄集為子列表框提取記錄,使用父列表框的值作為條件。在這種情況下,Region和Markets都是父列表框,因為它們影響如何提供下一級的值。Market和State作為子列表框,因為它們的值取決于其上一級列表框。
在本示例中,創建一個函數,接受子列表框作為其參數,然后使用該列表框判斷提取什么數據以及填充哪個列表框。
打開VBE,插入一個標準模塊,輸入下列代碼:
Function CascadeChild(TargetChild As OLEObject)
Dim Myconnection As Connection
Dim Myrecordset As Recordset
Dim Myworkbook As String
Dim strSQL As String
Set Myconnection = NewConnection
Set Myrecordset = NewRecordset
‘識別要引用的工作簿
Myworkbook =Application.ThisWorkbook.FullName
‘打開對該工作簿的連接
Myconnection.Open”Provider=Microsoft.Jet.OLEDB.4.0;” & _ ? ?“Data Source=”& Myworkbook & “;” & _ ? ?“ExtendedProperties=Excel 8.0;” & _ ? ?“Persist SecurityInfo=False”
‘確定正確的SQL語句,在父列表框中使用該值作為查詢的參數
Select CaseTargetChild.Name
Case Is =”lstMarket”
strSQL = “SelectDistinct [Market] AS [tgtField] from [Sheet1$A1:C40] Where [Region]='”& Sheet1.lstRegion.Value & “‘”
Case Is =”lstState”
strSQL = “SelectDistinct [State] AS [tgtField] from [Sheet1$A1:C40] Where [Market]='”& Sheet1.lstMarket.Value & “‘”
End Select
‘裝載查詢到記錄集中
Myrecordset.Open strSQL,Myconnection, adOpenStatic
‘填充目標子列表框
With TargetChild.Object
.Clear
Do
.AddItemMyrecordset![tgtField]
Myrecordset.MoveNext
Loop UntilMyrecordset.EOF’自動選擇列表框中的第一個值
.Value = .List(0) ? ?End With
‘清理 ? ?Myconnection.Close
Set Myrecordset = Nothing
Set Myconnection =Nothing
End Function
每個父列表框的OnClick事件只是簡單地調用上面的函數,傳遞目標子列表框作為函數的參數:
Private Sub lstMarket_Click() ? ?CallCascadeChild(ActiveSheet.OLEObjects(Sheet1.lstState.Name))End Sub Private Sub lstRegion_Click() ? ?Call CascadeChild(ActiveSheet.OLEObjects(Sheet1.lstMarket.Name))End Sub
說明
1.示例中使用的是ActiveX列表框控件。
2.需要在VBE中設置對Microsoft ActiveX Data Objects Library的引用,如下圖2所示。
圖2