使用VBA打开以制表符分隔的.txt文件以保存为.xlsx格式

使用VBA打开以制表符分隔的.txt文件以保存为.xlsx格式,vba,excel,xlsx,Vba,Excel,Xlsx,我正在尝试使用Excel中的VBA自动将.txt文件(以制表符分隔)转换为.xlsx文件。以下是我所拥有的: Set WB = Workbooks.Open(folder + file, , , 1) If Right(file, 3) = "txt" Or Right(file, 3) = "xls" Then Application.DisplayAlerts = False WB.SaveAs filename:=folder + milestone + "_" + loa

我正在尝试使用Excel中的VBA自动将.txt文件(以制表符分隔)转换为.xlsx文件。以下是我所拥有的:

Set WB = Workbooks.Open(folder + file, , , 1)
If Right(file, 3) = "txt" Or Right(file, 3) = "xls" Then
    Application.DisplayAlerts = False
    WB.SaveAs filename:=folder + milestone + "_" + loadtype + "_" + Left(file, Len(file) - 4) + "_" + metricDate + "_.xlsx", _
        FileFormat:=51
    Application.DisplayAlerts = True
Else
    Application.DisplayAlerts = False
    WB.SaveAs filename:=folder + milestone + "_" + loadtype + "_" + Left(file, Len(file) - 5) + "_" + metricDate + "_.xlsx", _
        FileFormat:=51
    Application.DisplayAlerts = True
End If
WB.Close
当然,这只是代码的一小部分,我认为代码的第一部分是最相关的。我只是开始检查转换后的.txt文件,因为它们的大小是保存后的10%。结果是,这二十列被一分为三,所有的空格和制表符都被删除了。不确定发生了什么,因为我不经常使用VBA

我认为关键在于:

Set WB = Workbooks.Open(folder + file, , , 1)
末尾的1表示制表符分隔。不确定它会对它也打开的.xls文件做什么,但我会担心下一步

谢谢你的指点


编辑

我改变了代码,以不同的方式对待.txt和.xls,这是我首先应该做的。以下是当前代码:

Dim WB As Workbook
'Dim WBS As Workbooks

If Right(file, 3) = "txt" Then
    Set WB = Workbooks.OpenText Filename:=folder + file, DataType:=xlDelimited, Tab:=True
    Application.DisplayAlerts = False
    WB(1).SaveAs filename:=folder + milestone + "_" + loadtype + "_" + Left(file, Len(file) - 4) + "_" + metricDate + "_.xlsx", _
        FileFormat:=51
    Application.DisplayAlerts = True
    WB.Close
ElseIf Right(file, 3) = "xls" Then
    Set WB = Workbooks.Open(folder + file)
    Application.DisplayAlerts = False
    WB.SaveAs filename:=folder + milestone + "_" + loadtype + "_" + Left(file, Len(file) - 4) + "_" + metricDate + "_.xlsx", _
        FileFormat:=51
    Application.DisplayAlerts = True
    WB.Close
Else
    Set WB = Workbooks.Open(folder + file)
    Application.DisplayAlerts = False
    WB.SaveAs filename:=folder + milestone + "_" + loadtype + "_" + Left(file, Len(file) - 5) + "_" + metricDate + "_.xlsx", _
        FileFormat:=51
    Application.DisplayAlerts = True
    WB.Close
End If

让我们用你自己的代码再试一次,在这里我有更多的空间。尝试以下内容并阅读我的评论。我想你会发现它是有效的:

'I'm adding this line.  I'm assuming you have it in your code, but just to be certain...
Dim WB As Excel.Workbook
'This line opens your tab delimeted text file.
Set WB = Workbooks.OpenText(Filename:=folder + file, DataType:=xlDelimited, Tab:=True
If Right(file, 3) = "txt" Or Right(file, 3) = "xls" Then
    'This section turns off alerts, saves the workbook opened in the previous step as xlsx and turns alerts back on.
    Application.DisplayAlerts = False
    WB.SaveAs filename:=folder + milestone + "_" + loadtype + "_" + Left(file, Len(file) - 4) + "_" + metricDate + "_.xlsx", FileFormat:=xlOpenXMLWorkbook
    Application.DisplayAlerts = True
Else
    'Again, this section saves the workbook opened in the previous step as xlsx.
    Application.DisplayAlerts = False
    WB.SaveAs filename:=folder + milestone + "_" + loadtype + "_" + Left(file, Len(file) - 5) + "_" + metricDate + "_.xlsx", FileFormat:=xlOpenXMLWorkbook
    Application.DisplayAlerts = True
End If
WB.Close
我还在争论你是否真的需要那个If声明。看起来您正在做完全相同的事情,并使用相同的约定命名工作簿。你可能不需要它。我留下它是因为你没有特别问。我想你可以跳过它,直接保存工作簿

编辑:您需要If语句来选择用于打开工作簿的方法

'I'm adding this line.  I'm assuming you have it in your code, but just to be certain...
Dim WB As Excel.Workbook
If Right(file, 3) = "txt" then
    'This line opens your tab delimeted text file.
    Set WB = Workbooks.OpenText(Filename:=folder + file, DataType:=xlDelimited, Tab:=True
Else
    'This line opens your xls and xlsx books
    Set WB = Workbooks.Open(folder + file) 'no additional parameters should be needed
End If
Application.DisplayAlerts = False
WB.SaveAs filename:=folder + milestone + "_" + loadtype + "_" + Left(file, Len(file) - 4) + "_" + metricDate + "_.xlsx", FileFormat:=xlOpenXMLWorkbook
Application.DisplayAlerts = True
WB.Close
如果您正在迭代这些输入工作簿,您可能需要执行以下操作

Set WB = Nothing
为了安全起见


编辑:我会让我的耻辱挂在那里。。。
OpenText
方法不会返回对象,因此,如果
file
是包含扩展名的完整文件名,则必须使用
set WB=Workbooks(file)
来设置
WB
对象。我的不好。

你有没有试过
工作簿。OpenText
?这似乎对我有用。试试
Workbooks.OpenText文件名:=“C:\filenameandpath”,数据类型:=xlDelimited,制表符:=True
,这是一个很好的开始,但之后我不知道如何将其保存为xlsx。对于工作簿(复数),我看不到内置的保存功能,而对于工作簿(单数)。Excel对单个工作簿的方法调用是复数
工作簿
。它应该可以工作。我只看到你打开了1个工作簿,所以saveas方法应该适合你。将wb设置为工作簿wb.SaveAs“fileNameHere”、Excel.XlFileFormat.xlopenxmlworkbook您已经在使用
工作簿
打开文件。只需使用
Set WB=Workbooks.OpenText文件名:=…
,您就可以打开(一个)工作簿。要保存,您可以使用当前使用的内容,也可以使用
FileFormat:=xlOpenXMLWorkbook
属性保存。输入文件可以是.txt、.xls或.xlsx。我需要解析文件名以在文件扩展名之前添加前缀。它将始终保存为.xlsx。这就是为什么我有If,为什么我需要以多种方式打开。啊!我懂了。在打开工作簿之前,需要使用if语句。看看保存的部分。它不会改变。一旦打开工作簿,它就不会出现。您需要查看文件名的末尾,并设置一个if语句,以便使用workbooks.OpenText和
.xls
.xlsx
使用
工作簿打开
.txt
。我将编辑我的答案。更新代码在顶部,编辑行下方。包括暗淡的声明。得到编译错误与您的行;可能是我的Dim和你的代码的组合。(应为:语句结尾-突出显示文件名)哪一行?你可能有一个额外的逗号在那里或什么。我从你最近的更新中看到的一切看起来都很好。语句的预期结尾只是告诉您该行的语法有问题。您键入的参数不正确或有问题。找到了它。OpenText不返回对象,因此Set在这里不起作用。