VBA Excel用ADODB读Excel时Recordset字段值无法转字符串问题
问题原因
- 微软ACE OLEDB驱动读取Excel时,默认会扫描前8行数据自动推断每列的数据类型,不会读取Excel内设置的单元格格式
- 你的表头位于第8行,前7行中报错列的内容为空/全为数值,驱动就将该列判定为Double类型,读取第8行的文本类型表头时就会触发类型不匹配错误
解决方案
1. 修改连接字符串的扩展属性
在原有Extended Properties参数中新增IMEX=1和MaxScanRows=0两个配置:
IMEX=1:启用导入模式,遇到混合数据类型的列时统一按文本类型处理MaxScanRows=0:指定驱动扫描全表数据判断列类型,避免仅扫描前8行导致的类型判定错误
修改后的连接字符串示例:
.ConnectionString = "Data Source=" & _ pathFile & _ ";" & "Extended Properties=""Excel 12.0;HDR=No;IMEX=1;MaxScanRows=0;"";"
2. 优化SQL查询直接定位表头行
不需要多次调用MoveNext跳行,直接在SQL中指定读取起始行,代码更稳定,避免记录集行数不足触发的错误:
' 直接从Sheet1的第8行开始读取所有列 sql = "SELECT * FROM [Sheet1$A8:XFD]"
修改后的完整可用代码
Dim objConnect As Object Dim objRecordset As Object Dim sql As String Dim pathFile as String ''' Path of Raw file pathFile = "C:\TEST\RAW_EXCEL_FILE.xlsx" ''' Start Connection Set objConnect = CreateObject("ADODB.Connection") With objConnect .Provider = "Microsoft.ACE.OLEDB.12.0" .ConnectionString = "Data Source=" & _ pathFile & _ ";" & "Extended Properties=""Excel 12.0;HDR=No;IMEX=1;MaxScanRows=0;"";" .Open End With ''' SQL 直接从第8行开始读取 sql = "SELECT * FROM [Sheet1$A8:XFD]" ''' Read record Set objRecordset = objConnect.Execute(sql) ''' TEST OUTPUT MsgBox CStr(objRecordset.Fields(0).Value) MsgBox CStr(objRecordset.Fields(1).Value) ''' Close Connection objRecordset.Close objConnect.Close Set objRecordset = Nothing Set objConnect = Nothing
内容的提问来源于stack exchange,提问作者moostang
相关产品推荐
相关产品推荐

