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 图像
所以我检查了一些例子,似乎有很多人将表格从 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)