Excel實戰技巧68:創建級聯列表框(使用ADO技巧)

  • 2019 年 12 月 24 日
  • 筆記

在《Excel實戰技巧67:在組合框中添加不重複值(使用ADO技巧)》中,我們使用記錄集技巧給組合框添加了不重複值,並概要講述了ADO記錄集基礎知識。本文利用記錄集技巧,創建級聯列表框。

示例效果如下圖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

3.可以使用如下所示的命名區域代替硬編碼單元格區域:

Myrecordset.Open 「Select Distinct [Market] from [命名區域]」