我想从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”是迄今为止我找到的最好的答案。
记录集包含正确的值,因此数据库连接和查询本身就可以正常工作,它与记录集的填充有关。
此代码对我有用:
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
以二维数组形式返回数据,但是,它以维度的“错误顺序”返回它们:第一维是FieldIndex,第二维是RowIndex
RecordsetArray(0, 0)
为您提供第一行的第一字段,RecordsetArray(1, 0)
为您提供第一行的第二字段,而RecordsetArray(0, 1)
为您提供第二行的第一字段。
comboBox的List
属性期望数据为二维数组,但将行作为第一个索引,将字段作为第二个索引(您可以在comboBox中显示多个列)。因此,您要做的是Transpose
您的数组:
UF_Delete_Project.Cb_DeleteProject.List = Application.WorksheetFunction.Transpose(pRecordsetArray)
但是,Transpose
方法有一些限制(字段数,字符串的最大长度,无法处理Null
值),因此,如果遇到运行时错误13(类型不匹配),可能会更容易按照braX在他的评论中建议的那样遍历记录集或数组。