繁体   English   中英

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

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

So I checked some examples and it seems there are a lot of peoples that populate forms from SQLinto excel but in my case, I have a multi selection Excel listBox that is linked with a Sql recordset. 基本上,我设法将完整的 SQL 记录集发送到我的电子表格中。 这是一个表(1500 行,9 列),在我的电子表格中,在这个生成的表上方我有 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

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

非常感谢,祝您有美好的一天

想知道的小伙伴们,答案如下:

Dim rs As ADODB.Recordset Set rs = New 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框的 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 图像

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM