在VBA中将Excel工作簿转换为CSV

时间:2020-02-14 21:49:26

标签: excel vba csv

我在将Excel工作簿转换为CSV的VBA脚本中遇到错误。 VBA脚本通过Microsoft Word VBA脚本运行。

Private Sub CommandButton1_Click()

Dim objExcel As New Excel.Application
Dim wb_xl As Excel.Workbook
Dim wb As Excel.Worksheet

Set wb_xl = objExcel.Workbooks.Open("O:\documents\folder.xlsx")
wb_xl.SaveAs FileName:="O:\documents\folder.csv", FileFormat:=xlCSV
Set wb = objExcel.Workbooks.Open("O:\documents\folder.csv")
wb_xl.Close savechanges:=False

End Sub

这似乎很简单,并且正在生成CSV,但是我收到错误消息:

运行时错误'1004':无法访问'folder.csv'

错误在第8行(wb_xl.SaveAs...)上。

1 个答案:

答案 0 :(得分:4)

Dim objExcel As New Excel.Application

如果现在这没有引起任何问题,那么以后再说。拆分声明和赋值,通常避免使用自动实例化的对象,尤其是对于在创建时生成外部进程的对象。

Dim objExcel As Excel.Application
Set objExcel = New Excel.Application

...并且完成操作后,请不要忘记.Quit

'...
objExcel.Quit

现在,错误1004。

wb_xl.SaveAs FileName:="O:\documents\folder.csv", FileFormat:=xlCSV

这似乎很简单,并且正在生成CSV

不合格的xlCSV常量不是什么大问题,但请记住,它仅由于引用了Excel库而有效;考虑将其合格:

wb_xl.SaveAs FileName:="O:\documents\folder.csv", FileFormat:=Excel.xlCSV

如果正在生成CSV,则SaveAs调用将起作用,并且失败的语句将是以下内容:

Set wb = objExcel.Workbooks.Open("O:\documents\folder.csv")

您无法Open该文件,因为它已经打开-这就是该语句引发错误1004的原因:如果您在Excel UI中使用.xlsm文件尝试过该操作,则会得到更详细的信息错误消息:

Sorry, Excel can't open two workbooks with the same name at the same time

但是错误消息与.csv文件不同:

Run-time error 1004: Sorry, we couldn't find C:\Dev\test123.csv. Is it possible it was moved, renamed or deleted?

通过在即时窗格中键入此错误消息,并打开了一个新的空白工作簿:

ThisWorkbook.SaveAs "C:\Dev\test123.csv", xlCSV
Set b = Workbooks.Open("C:\Dev\VBA\test123.csv")

我认为这正是您得到的错误。

删除wb,则不需要它(请注意:如果Open成功,则分配将抛出类型不匹配错误,因为您不能将Workbook对象分配给Worksheet引用; Dim wb As Excel.Worksheet看起来是错误的)。还要删除Workbooks.Open操作,CSV已经打开。

换句话说:

Private Sub CommandButton1_Click()

    Dim xlApp As Excel.Application
    Set xlApp = New Excel.Application

    Dim wb As Excel.Worksheet
    Set wb = xlApp.Workbooks.Open("O:\documents\folder.xlsx")

    wb.SaveAs FileName:="O:\documents\folder.csv", FileFormat:=Excel.xlCSV
    wb.Close savechanges:=False

    xlApp.Quit

End Sub