You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 10:24:03