2017-10-17 35 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