如何使用VBA将MySQL指定库表名填充到用户窗体ComboBox
VBA用户窗体ComboBox填充MySQL表名解决方案
问题根因
rst.GetRows返回的二维数组默认是列优先的存储顺序,格式为(列索引, 行索引),而VBA用户窗体的ComboBox.List属性要求输入行优先的数组,格式为(行索引, 列索引),直接赋值就会出现仅显示第一条数据的问题- 运行时错误91是对象变量未绑定,大概率是遍历记录集前没有判断记录集是否已初始化、是否存在返回数据,或者记录集指针已经移动到EOF位置
修复后可用代码
方法1:数组转置后直接赋值(执行效率更高)
Private Sub UserForm_Initialize() Dim strMysql As String Dim rst As New ADODB.Recordset ' 确保记录集对象正确初始化 Dim arrTables As Variant Application.Run "Connect_to_SQL_DB.ConnectToDB" ' 更稳定的查询语句,替换DBname为实际数据库名 strMysql = "SELECT table_name FROM information_schema.tables WHERE table_schema = 'DBname' ORDER BY table_name;" ' 确保游标类型正确,已经修复RecordCount的话这部分你已经配置正确 rst.Open strMysql, conn, adOpenKeyset, adLockReadOnly If Not (rst.EOF And rst.BOF) Then ' 有返回数据才操作 arrTables = rst.GetRows ' 转置数组,适配ComboBox.List的格式要求 Me.cboComboBox.List = WorksheetFunction.Transpose(arrTables) End If ' 释放资源,避免内存泄漏 rst.Close Set rst = Nothing Set conn = Nothing End Sub
方法2:循环AddItem(兼容性更强,适配低版本Excel)
Private Sub UserForm_Initialize() Dim strMysql As String Dim rst As New ADODB.Recordset Application.Run "Connect_to_SQL_DB.ConnectToDB" strMysql = "SELECT table_name FROM information_schema.tables WHERE table_schema = 'DBname' ORDER BY table_name;" rst.Open strMysql, conn, adOpenKeyset, adLockReadOnly If Not (rst.EOF And rst.BOF) Then rst.MoveFirst ' 指针移动到第一条记录 Do While Not rst.EOF Me.cboComboBox.AddItem rst.Fields(0).Value rst.MoveNext Loop End If rst.Close Set rst = Nothing Set conn = Nothing End Sub
注意事项
- 如果使用
Show Tables查询,返回的字段名是Tables_in_你的库名,取字段值的时候注意对应,更推荐使用information_schema查询语句,逻辑更清晰,也可以灵活过滤不需要的系统表 - 执行查询前必须确保
conn数据库连接对象已经正确初始化并连接成功
内容的提问来源于stack exchange,提问作者xvpnkr
相关产品推荐
相关产品推荐

