【发布时间】:2021-02-23 06:14:35
【问题描述】:
我有要转换为 xlsx 的制表符分隔的 csv 文件。所以每个 csv 都应该转换为 xlsx。文件名应该相同。但是,这些文件是制表符分隔的。例如,看这个测试文件截图:
当我运行我的代码时(我之前创建了一个子文件夹 xlsx):
Sub all()
Dim sourcepath As String
Dim sDir As String
Dim newpath As String
sourcepath = "C:\Users\PC\Desktop\Test\"
newpath = sourcepath & "xlsx\"
'make sure subfolder xlsx was created before
sDir = Dir$(sourcepath & "*.csv", vbNormal)
Do Until Len(sDir) = 0
Workbooks.Open (sourcepath & sDir)
With ActiveWorkbook
.SaveAs Filename:=Replace(Left(.FullName, InStrRev(.FullName, ".")), sourcepath, newpath) & "xlsx", FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
.Close
End With
sDir = Dir$
Loop
End Sub
它确实有效,但是当我查看 excel 文件时:
我可以看到未检测到制表符分隔符。我认为我的本地设置是分隔符是分号,这就是它不起作用的原因。现在我想将 dataType 设置为 xlDelimited 并将 tab 设置为 True,将一行更改为:
Workbooks.Open (Spath & sDir), DataType:=xlDelimited, Tab:=True
我也试过
Workbooks.Open (Spath & sDir, DataType:=xlDelimited, Tab:=True)
或
Workbooks.Open FileName:=Spath & sDir, DataType:=xlDelimited, Tab:=True
但这会导致错误消息。然后我尝试了另一种方法,将分隔符设置为 Chr(9)(制表符)并将本地设置为 false:
Sub all()
Dim wb As Workbook
Dim strFile As String
Dim strDir As String
strDir = "C:\Users\PC\Desktop\Test\"
strFile = Dir(strDir & "*.csv")
Do While strFile <> ""
Set wb = Workbooks.Open(Filename:=strDir & strFile, Delimiter:=Chr(9), Local:=False)
With wb
.SaveAs Replace(wb.FullName, ".csv", ".xlsx"), 51
.Close True
End With
Set wb = Nothing
strFile = Dir
Loop
End Sub
它不会导致错误。但是当我打开文件时,它看起来像:
同样的问题,制表符分隔符无法识别。我该如何解决这个问题?
(我也尝试使用 local:True 和 Delimiter:=Chr(9),但同样的问题,我也尝试添加 Format:=6)
我在 csv 中尝试过这种方式,因为我不想在 txt 文件扩展名中采用同样的方式。原因是使用 csv 很容易允许特殊语言字符,如“ö”和“ü”。所以这就是为什么我想将 csv 转换为 xlsx 而不是使用使用 txt 的解决方法,因为然后我遇到了一个问题,当我尝试将 txt 转换为 xlsx 时,某些特殊字符无法正确识别,我希望避免这种情况使用 csv 的问题。
csv(或者实际上这些是 tsv,因为它们将制表符作为分隔符而不是分号)文件具有不同的列。所以可能一个 csv 文件有 5 列,其他 6 列,数据类型也不同。
编辑:
回应 EEM 的回答:
检查这个 Test.csv 文件,它看起来像这样:
由制表符分隔。不是分号。
当我运行代码(加上 .TextFileDecimalSeparator = "." 到代码中)并检查生成的 xlsx 文件时,它看起来像这样:
第二列 (ColumnÄ) 中的值,如 9987.5 被正确转换为 9987,5。但是最后一列 (ColumnI) 中的值被错误地转换。这是我现在的问题。 (我不知道为什么特殊字符不能正确转换,因为在我的原始文件中这确实有效。)
【问题讨论】:
-
您应该能够使用“数据”菜单下的功能区命令“文本到列”来处理工作表;将其设置为分隔符并包含“制表符”作为分隔符。录制宏以更轻松地获取所需的 VBA 代码。
-
回答更新关注数值数据的新信息,请测试。
-
感谢您一直以来的支持,我会接受您的回答。但是,最后一个问题:在生成的 xlsx 文件中,所有文件的工作表名称都是“Sheet1”。我想从文件名中继承这个。这样生成的工作表名与文件名相同(没有 .xslx)。这可能吗?