我在做什麼錯?
您在Outlook中,並使用其他Office應用程序的對象模型,但未對其進行限定;你得到的「Object Required」錯誤是因爲VBA不知道Workbooks
是指什麼,所以Workbooks.Open
成員調用(它知道它是一個成員調用,因爲在語法上,它只能是這樣)無法在編譯或運行時間,所以...繁榮。
除此之外:
- 你不聲明
wb
,因此您的代碼將不會與Option Explicit
編譯打開(如果它不是一個已經習慣,使一個 - VBA將愉快地編譯代碼包含沒有它的拼寫錯誤)。實際上,只有你得到運行時錯誤的事實告訴我Option Explicit
沒有被指定,因爲如果它是那麼你的代碼會拒絕編譯,因爲Workbooks
是未定義的。
- 程序是含蓄地
Public
。
- 如果該過程是寫在一個類(或文檔或表單)模塊中,那麼你的公共過程的名字中有下劃線,這意味着沒有其他類可以
Implements
該類(它不會編譯,因爲下劃線爲) - 這可能會也可能不是問題,但很高興知道。約定是命名PascalCase
中的程序,就像所有VBA對象模型中的所有內容一樣。
- 你是假設
Workbooks.Open
正在返回一個有效的對象引用,並且它不會引發任何運行時錯誤。
- 您正在對文件路徑進行硬編碼,這使得該過程成爲一筆交易;運行一次後,它完全沒用。
- 您未打開正在打開的工作簿。
假設到Excel對象模型的引用,我的實現應該是這樣的:
Option Explicit
Public Sub SaveExcelWorkbookAsCSV(ByVal path As String)
On Error GoTo CleanFail
Dim app As Excel.Application
Set app = GetExcelInstance
Dim wb As Excel.Workbook
Set wb = app.Workbooks.Open(path)
Dim newName As String
newName = GetFileNameWithoutExtension(path) & ".csv"
wb.SaveAs FileName:=newName, _
FileFormat:=xlCSV, _
CreateBackup:=False
CleanExit:
On Error Resume Next
wb.Close
app.Quit
On Error GoTo 0
Exit Sub
CleanFail:
MsgBox Err.Description
Resume CleanExit
End Sub
Private Function GetExcelInstance() As Excel.Application
'you can look that one up
End Function
Private Function GetFileNameWithoutExtension(ByVal path As String) As String
'you can look that one up
End Function
沒有一個項目引用Excel對象模型,你將不得不使用後期綁定 - 這意味着您不能使用Excel類型庫中定義的任何類型,包括常量和枚舉值;你需要自己定義它們:
Public Sub SaveExcelWorkbookAsCSV(ByVal path As String)
On Error GoTo CleanFail
Dim app As Object
Set app = GetExcelInstance
Dim wb As Object
Set wb = app.Workbooks.Open(path)
Const xlCSV As Long = 6
Dim newName As String
newName = GetFileNameWithoutExtension(path) & ".csv"
wb.SaveAs FileName:=newName, _
FileFormat:=xlCSV, _
CreateBackup:=False
CleanExit:
On Error Resume Next
wb.Close
app.Quit
On Error GoTo 0
Exit Sub
CleanFail:
MsgBox Err.Description
Resume CleanExit
End Sub
你沒有聲明wb! Dim wb as Workbook – basslo