2017-10-17 58 views
1

我正在定義一個函數來保存文件爲.xls格式:可以擅長vba功能打開文件?

Public Function save_as_xls(full_file_path As String) As String 
    save_as_xls = "" 

    Dim src_file As Workbook 
    Set src_file = Workbooks.Open(full_file_path) 
    src_file.SaveAs filename:=full_file_path, FileFormat:=xlExcel8 
    src_file.Close 

    save_as_xls = "OK" 
End Function 

然後調用它在Excel單元格中公式=save_as_xls("c:\temp\test.xls")

但是,它不工作,src_fileWorkbooks.Open得到Nothing

對無法打開文件的vba函數有限制嗎?我只知道它不能寫入其他單元格。

+2

檢查[此答案](https://stackoverflow.com/a/23232311/2165759)。 – omegastripes

+0

可能相關[Excel VBA無法打開工作簿](https://stackoverflow.com/questions/7693530/excel-vba-cant-open-workbook)(如果不是*重複*) – AntiDrondert

+0

我剛添加了[excel- udf]標記,因爲問題的主要部分是這是一個用作UDF的函數。然而,我並不是100%肯定我**應該**添加了標籤,因爲標籤本身給出了問題的答案。所以如果你願意的話,隨時去除它。 (只需點擊[編輯歷史記錄](https://stackoverflow.com/posts/46782402/revisions)鏈接並回滾到原始版本。) – YowE3K

回答

4

Excel UDF有一定的侷限性,所以不能保存工作簿。如下面的代碼所示,您可以使用Excel的後期綁定實例來嘗試解決方法。

將這個代碼的標準模塊:

Public objExcel As Application 

Public Function SaveAsXls(FilePath As String) As String 

    If objExcel Is Nothing Then 
     Set objExcel = CreateObject("Excel.Application") 
     With objExcel 
      .Visible = True ' for debug 
      .DisplayAlerts = False 
     End With 
    End If 
    With objExcel 
     With .Workbooks.Open(FilePath) 
      .SaveAs _ 
       Filename:=FilePath, _ 
       FileFormat:=xlExcel8 
      .Close True 
     End With 
    End With 
    SaveAsXls = "OK" 

End Function 

將這個代碼ThisWorkbook部分:

Private Sub Workbook_BeforeClose(Cancel As Boolean) 

    If TypeName(objExcel) = "Application" Then objExcel.Quit 

End Sub 

所以,你可以把它在Excel單元格公式爲=SaveAsXls("c:\temp\test.xls")

+0

這是什麼意思?如果我把它們放在A.xlsm中,那麼當A.xlsm關閉時,在關閉之前,會觸發'Workbook_BeforeClose',這是如何觸發'SaveAsXls'的? – athos

+0

@athos打開工作簿時,一旦創建了Excel的後期綁定實例,它就會保留在內存中以提高性能。 'Workbook_BeforeClose'只是退出該Excel的實例以釋放內存,並避免在進程中掛起Excel。這與'SaveAsXls'無關。 – omegastripes

+0

@athos這個答案應該實現你正在試圖用你的問題中的代碼。 – YowE3K