使用 ADODB 记录集填充组合框
Populating a Combobox with a ADODB Recordset
我想从 Excel Vba 查询数据库(使用 ADODB)并用检索到的值列表填充组合框。不幸的是,只有返回列表的最后一个值显示在下拉字段中。我假设记录集是所有返回行的完整字符串,因此只有最后一个是可见的。
我搜索了该主题,但只能找到有关 Access 的信息,这似乎没有帮助。
这应该是代码的重要部分,如果需要我可以提供更多:
'-- Create database query
SQLStatement = "SELECT Project_Name FROM ressourceplanning.projects"
'-- Execute query
Recordset.Open SQLStatement, Connection
'-- Write report into combobox (dropdown)
RecordsetArray = Recordset.GetRows
UF_Delete_Project.Cb_DeleteProject.List = RecordsetArray
'UF_Delete_Project.Cb_DeleteProject.RowSourceType = RecordsetArray
最后一行在使用时导致类型不匹配(错误 13)。但是使用 "RowSourceType" 是我迄今为止找到的最佳答案。
Recordset 包含正确的值,因此 DB Connection 和查询本身是有效的,它只是关于记录集的填充。
这段代码对我有用:
RecordsetArray = Recordset.GetRows
For i = LBound(RecordsetArray, 2) To UBound(RecordsetArray, 2)
UF_Delete_Project.Cb_DeleteProject.AddItem RecordsetArray(0, i)
Next i
感谢@braX 和@FunThomas
命令 Recordset.GetRows
returns 将数据作为二维数组,然而,它 returns 它们在 "wrong order" 的维度: 第一维是FieldIndex,第二个是RowIndex
RecordsetArray(0, 0)
给出第一行的第一个字段,RecordsetArray(1, 0)
给出第一行的第二个字段,而 RecordsetArray(0, 1)
给出第二行的第一个字段。
comboBox 的 List
-属性 期望数据为二维数组,但行作为第一个索引,字段作为第二个(您可以在其中显示多个列一个组合框)。所以你要做的是 Transpose
你的数组:
UF_Delete_Project.Cb_DeleteProject.List = Application.WorksheetFunction.Transpose(pRecordsetArray)
但是,Transpose
-方法有一些限制(字段数,字符串的最大长度,无法处理Null
-值),所以如果遇到运行时错误 13 (类型不匹配),按照 braX 在他的评论中建议的那样,遍历记录集或数组可能更容易。
我想从 Excel Vba 查询数据库(使用 ADODB)并用检索到的值列表填充组合框。不幸的是,只有返回列表的最后一个值显示在下拉字段中。我假设记录集是所有返回行的完整字符串,因此只有最后一个是可见的。
我搜索了该主题,但只能找到有关 Access 的信息,这似乎没有帮助。
这应该是代码的重要部分,如果需要我可以提供更多:
'-- Create database query
SQLStatement = "SELECT Project_Name FROM ressourceplanning.projects"
'-- Execute query
Recordset.Open SQLStatement, Connection
'-- Write report into combobox (dropdown)
RecordsetArray = Recordset.GetRows
UF_Delete_Project.Cb_DeleteProject.List = RecordsetArray
'UF_Delete_Project.Cb_DeleteProject.RowSourceType = RecordsetArray
最后一行在使用时导致类型不匹配(错误 13)。但是使用 "RowSourceType" 是我迄今为止找到的最佳答案。
Recordset 包含正确的值,因此 DB Connection 和查询本身是有效的,它只是关于记录集的填充。
这段代码对我有用:
RecordsetArray = Recordset.GetRows
For i = LBound(RecordsetArray, 2) To UBound(RecordsetArray, 2)
UF_Delete_Project.Cb_DeleteProject.AddItem RecordsetArray(0, i)
Next i
感谢@braX 和@FunThomas
命令 Recordset.GetRows
returns 将数据作为二维数组,然而,它 returns 它们在 "wrong order" 的维度: 第一维是FieldIndex,第二个是RowIndex
RecordsetArray(0, 0)
给出第一行的第一个字段,RecordsetArray(1, 0)
给出第一行的第二个字段,而 RecordsetArray(0, 1)
给出第二行的第一个字段。
comboBox 的 List
-属性 期望数据为二维数组,但行作为第一个索引,字段作为第二个(您可以在其中显示多个列一个组合框)。所以你要做的是 Transpose
你的数组:
UF_Delete_Project.Cb_DeleteProject.List = Application.WorksheetFunction.Transpose(pRecordsetArray)
但是,Transpose
-方法有一些限制(字段数,字符串的最大长度,无法处理Null
-值),所以如果遇到运行时错误 13 (类型不匹配),按照 braX 在他的评论中建议的那样,遍历记录集或数组可能更容易。