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

3phpmpom  于 2021-07-24  发布在  Java
关注(0)|答案(3)|浏览(701)

因此,我检查了一些示例,似乎有很多人将表单从sql填充到excel中,但在我的例子中,我有一个与sql记录集链接的多选excel列表框。基本上,我设法将完整的sql记录集发送到电子表格中。它是一个表(1500行,9列),在我的电子表格中,在这个生成的表上面我有9个列表框,每个列表框应该代表它链接列的所有条目。我想从简单开始,在excel列表框中填充一列,这样用户就可以在列表框中选择他们想要的任何条目。我的问题是我没有找到正确的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

我从前面的问题中考虑了一些评论,我会尽快回到可能的答案上来!
提前多谢,祝你今天愉快

yhuiod9q

yhuiod9q1#

当你使用 GetRows -方法,将数据放入二维数组中。有点违反直觉的是,第一个索引是对字段的索引,第二个索引是对记录集行的索引。
可以将二维数组指定给 List -属性-但第一个索引必须是行,第二个索引必须是字段号(如果处理多列列表框)。因此,您只需在分配数组之前对其进行转置:

a = rs.GetRows
 shtEquity.ListBoxCcy.List = Application.WorksheetFunction.Transpose(a)
omtl5h9j

omtl5h9j2#

对于那些想知道的人来说,答案如下:
dim rs as 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
bhmjp9jg

bhmjp9jg3#

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)

控件对象图像(&O)

相关问题