使用Workbooks.OpenText读取CSV时保留原日期文本的问题咨询
解决VBA读取CSV时自动转换日期格式的问题
方法1:在Workbooks.OpenText中指定列数据类型为文本
Excel自动转换日期是因为它会识别内容格式并自动套用,解决核心是强制指定目标列为文本格式,通过FieldInfo参数实现:
示例代码
Dim readFile As String readFile = "C:\你的文件路径\目标文件.csv" Workbooks.OpenText _ fileName:=readFile, _ DataType:=xlDelimited, _ Comma:=True, _ FieldInfo:=Array(Array(2, xlTextFormat)) ' 假设日期在第2列,根据实际列数调整
参数说明
FieldInfo是一个二维数组,每个子数组格式为Array(列号, 格式代码):- 列号从1开始计数,对应CSV中的列顺序
xlTextFormat(或直接写数值2)表示强制将该列识别为文本,阻止Excel自动转换日期、数字等格式
- 如果需要多列设为文本,依次添加子数组即可,比如
Array(Array(1, xlTextFormat), Array(3, xlTextFormat))表示第1、3列为文本
方法2:用FileSystemObject读取纯文本后写入工作表
如果不确定日期所在列,或需要完全保留所有原始文本格式,可以直接读取CSV的纯文本内容,再手动拆分写入工作表:
示例代码
Dim fso As Object Dim ts As Object Dim lineText As String Dim arrData As Variant Dim ws As Worksheet Dim rowNum As Integer ' 初始化文件对象 Set fso = CreateObject("Scripting.FileSystemObject") Set ts = fso.OpenTextFile("C:\你的文件路径\目标文件.csv", 1) ' 1 = 只读模式 Set ws = ThisWorkbook.Sheets.Add ' 新建工作表存储数据 rowNum = 1 ' 先设置整列为文本格式,避免写入时自动转换 ws.Columns.NumberFormat = "@" ' 逐行读取并写入 Do While Not ts.AtEndOfStream lineText = ts.ReadLine arrData = Split(lineText, ",") ' 按逗号拆分每行内容 ' 将拆分后的数组写入当前行 ws.Cells(rowNum, 1).Resize(1, UBound(arrData) + 1).Value = arrData rowNum = rowNum + 1 Loop ' 清理对象 ts.Close Set ts = Nothing Set fso = Nothing
注意事项
- 如果CSV中存在用引号包裹的含逗号字段(比如
"张三,男",25),直接用Split会拆分错误,此时需要用正则表达式或专门的CSV解析逻辑处理 - 这种方法完全绕过Excel的自动格式识别,能100%保留原始文本内容
内容的提问来源于stack exchange,提问作者Brang Seng
相关产品推荐
相关产品推荐

