2017-03-16 64 views
0

完全新手到VBA,請原諒這個小問題。我只是試圖在保存爲csv之前打開xls文件。運行時錯誤424所需對象 - 只是在轉換爲csv之前嘗試打開文件

Workbooks.Open行給我的運行時錯誤。我在做什麼錯

Sub vba_code_to_convert_excel_to_csv() 

Set wb = Workbooks.Open("C:\EOD_Files\PROALPHA_08022017.xls") 

wb.SaveAs FileName:="C:\EOD_Files\PROALPHA_08022017.csv", FileFormat:=xlCSV, CreateBackup:=False 

End Sub 
+0

你沒有聲明wb! Dim wb as Workbook – basslo

回答

0

您宏的工作對我來說,如果你有顯式的選項,你需要聲明WB爲工作簿見下文。

Sub vba_code_to_convert_excel_to_csv() 
Dim wb as workbook 

Set wb = Workbooks.Open("C:\EOD_Files\PROALPHA_08022017.xls") 

wb.SaveAs FileName:="C:\EOD_Files\PROALPHA_08022017.csv", FileFormat:=xlCSV,  CreateBackup:=False 

End Sub 
+0

在Outlook *中按原樣運行*? –

2

我在做什麼錯?

您在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