【问题标题】:can excel vba function open a file?excel vba函数可以打开文件吗?
【发布时间】:2018-03-28 16:30:58
【问题描述】:

我正在定义一个函数来将文件保存为 .xls 格式:

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 函数有限制吗?我只知道它不能写入其他单元格。

【问题讨论】:

  • 检查this answer
  • 可能相关Excel VBA can't open Workbook(如果不是重复
  • 我刚刚添加了 [excel-udf] 标签,因为问题的主要部分是这是一个用作 UDF 的函数。但是,我不能 100% 确定我 应该 添加了标签,因为标签本身就给出了问题的答案。因此,如果您愿意,请随时再次删除它。 (只需单击edit history 链接并回滚到原始版本。)
  • @omegastripes 谢谢你的作品!

标签: vba excel excel-udf


【解决方案1】:

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")

【讨论】:

  • 这是什么意思?如果我把这些放在A.xlsm中,那么当A.xlsm关闭时,关闭前Workbook_BeforeClose会被触发,这怎么触发SaveAsXls
  • @athos 打开工作簿时,一旦创建了 Excel 的后期绑定实例,它就会保留在内存中以提高性能。 Workbook_BeforeClose 只是退出该 Excel 实例以释放内存,并避免在进程中挂起 Excel。与SaveAsXls 无关。
  • @athos 这个答案应该可以实现您尝试对问题中的代码执行的操作。
  • @YowE3K 啊,我明白了。我对退出部分感到困惑。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多