我在将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...
)上。
答案 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文件尝试过该操作,则会得到更详细的信息错误消息:
但是错误消息与.csv文件不同:
通过在即时窗格中键入此错误消息,并打开了一个新的空白工作簿:
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