VBA 将 sql 查询直接填充到电子表格中的列表框中(无用户表单)

VBA populate sql query into ListBox directly into the spreadsheet (no userform)

所以我检查了一些例子,似乎有很多人将表格从 SQL 填充到 excel 但就我而言,我有一个多 selection Excel 与 Sql 记录集链接的列表框。 基本上,我设法将完整的 SQL 记录集发送到我的电子表格中。这是一个 table(1500 行,9 列),在我的电子表格中,在此生成的 table 之上,我有 9 个列表框,每个列表框应代表其链接列的所有条目。 我想从简单开始,将一列填充到我的 excel 列表框中,这样用户就可以 select 他们想要的任何条目进入列表框。我的问题是我没有找到正确的 ListBox 方法来显示我的条目。到目前为止,这是我的代码:

将记录集填充到 SQL(这是为需要它的人工作):

Sub Get_Datas_From_SQL()

    Dim mobjConn As ADODB.Connection
    Dim strConn As String
    Set mobjConn = New ADODB.Connection
    Dim strSQL As String
    
    strConn = "Provider=SQLOLEDB; Data Source=My_server;" _
               & "Initial Catalog=My_db;Integrated Security=SSPI;"
    
    mobjConn.Open strConn
    
    Dim rs As ADODB.Recordset
    Dim Rn As Range
    Set rs = New ADODB.Recordset
    Set Rn = My_sheet.Range("A20")

    My_sheet.Range(Rn, Rn.Offset(2000, 20)).ClearContents
    
    strSQL = "SELECT * FROM Stocks_table"
      
    With rs
        .ActiveConnection = mobjConn
        .Open strSQL
        Rn.CopyFromRecordset rs
        .Close
    End With
    
    mobjConn.Close
    
    Set rs = Nothing
End Sub

现在,作为开始,我添加了应该填充九个列表框之一的代码

Sub init_()

    Dim mobjConn As ADODB.Connection
    Dim strConn As String
    Set mobjConn = New ADODB.Connection
    Dim strSQL As String
    
    strConn = "Provider=SQLOLEDB; Data Source=My_server;" _
               & "Initial Catalog=My_db;Integrated Security=SSPI;"
    
    mobjConn.Open strConn
    
    strSQL = "SELECT DISTINCT Currency FROM Stocks_table "
    
    Dim rs As ADODB.Recordset
    Set rs = New ADODB.Recordset
    
    With rs
        .ActiveConnection = mobjConn
        .Open strSQL
         Dim a()
         a = rs.GetRows
        ?
        .Close
    End With
End Sub

我考虑了之前问题中的一些评论,我会尽快回复可能的答案!

提前致谢,祝您有愉快的一天

想要知道的小伙伴们,这里是答案:

将 rs 调暗为 ADODB.Recordset 设置 rs = 新建 ADODB.Recordset

With rs
    .ActiveConnection = mobjConn
    .Open strSQL
     Dim a
     a = rs.GetRows
     For Each Row In a
       shtEquity.ListBoxCcy.AddItem Row
     Next
    .Close
End With

当您使用记录集的GetRows-方法时,数据将被放入一个二维数组中。有点违反直觉的是,第一个索引是字段的索引,第二个是记录集行的索引。

您可以将二维数组分配给列表框的 List-属性 - 但第一个索引需要是行,第二个索引是字段编号(如果您处理多列列表框)。所以你需要做的就是在分配之前转置数组:

 a = rs.GetRows
 shtEquity.ListBoxCcy.List = Application.WorksheetFunction.Transpose(a)
a = Rs.GetRows
Worksheets(1).Shapes(1).ControlFormat.List = a 'control ListBox
Worksheets(1).OLEObjects(1).Object.List = WorksheetFunction.Transpose(a) 'Oleobject listbox

如果您的列表框是 MSForms.ListBox,请参阅下文。

Dim Ws As Worksheet
Dim oleObjt As MSForms.ListBox

Set Ws = Worksheets(1)
Set oleObjt = Ws.OLEObjects("ListBox1").Object 'Ws.OLEObjects(1).Object
oleObjt.Clear
oleObjt.List = WorksheetFunction.Transpose(a)

控件和 Oleobject 图像