VBA使用ADODB读取大体积CSV文件时长字符串被截断为255字符如何解决?
VBA 导入大体积CSV文件OLEDB长文本截断问题解决方案
问题根因
截断问题本质是ACE OLEDB驱动读取文本文件时,默认仅扫描前8行数据判断字段类型,若前8行无超过255字符的内容,会将字段判定为String(255)类型,后续更长的文本会被强制截断。
可行解决方案(按推荐优先级排序)
方案1:创建schema.ini强制指定字段类型(优先推荐,无需修改系统配置)
在你要读取的CSV文件同目录下创建名为schema.ini的配置文件,手动指定对应字段为Memo(长文本)类型,即可跳过驱动自动类型判断,从根源避免截断。
示例配置如下:
[你要读取的目标文件名.csv] Format=CSVDelimited ColNameHeader=True MaxScanRows=0 ; 按实际字段数量、字段名、类型逐个定义,需要保留为长文本的字段指定为Memo类型即可 Col1=序号 Integer Col2=用户名 Text(50) Col3=备注内容 Memo Col4=创建日期 Date
配置完成后直接运行你原有代码即可,无需修改连接字符串或查询逻辑。
方案2:修改注册表调整驱动扫描行数
如果不想单独维护schema.ini文件,可以修改ACE OLEDB驱动的注册表配置,调高扫描行数上限:
- 32位Office路径:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\14.0\Access Connectivity Engine\Engines\Text - 64位Office路径:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\14.0\Access Connectivity Engine\Engines\Text
找到其中的MaxScanRows项,默认值为8,修改为0即可扫描全表判断类型,也可根据长文本首次出现的位置调整为足够大的数值(比如1000)。
注意:修改注册表前建议备份对应项,避免配置错误影响其他Office功能。
方案3:低内存占用流式读取(极端场景备用)
如果上述两种方案都受权限限制无法使用,可以用ADODB.Stream对象逐行流式读取CSV,不会触发Excel整文件加载导致崩溃,示例代码如下:
Sub 流式读取CSV() Dim stream As Object, lineArr As Variant, i As Long Set stream = CreateObject("ADODB.Stream") stream.Charset = "UTF-8" ' 按实际文件编码调整,GBK编码填"GB2312" stream.Open stream.LoadFromFile "你的CSV文件完整路径" i = 1 Do While Not stream.EOS lineArr = Split(stream.ReadText(-2), ",") ' -2代表读取一行,按实际分隔符调整 Cells(i, 1).Resize(1, UBound(lineArr) + 1) = lineArr i = i + 1 Loop stream.Close Set stream = Nothing End Sub
原有代码优化提示
你当前使用的连接字符串已经开启了IMEX=1和ImportMixedTypes=Text,配合上述方案可以进一步避免混合数据类型的判断异常。
内容的提问来源于stack exchange,提问作者1S1a4m9
相关产品推荐
相关产品推荐

