如何使重新打开文档时有效的 Excel VBA 函数?

Posted

技术标签:

【中文标题】如何使重新打开文档时有效的 Excel VBA 函数?【英文标题】:How do I make an Excel VBA Function that works when I reopen the document? 【发布时间】:2011-07-27 20:22:17 【问题描述】:

好的,我刚刚编写了一个非常简单的 VBA 脚本,它会启动并抓取在指定位置找到的文件的文件大小(edit 更新代码来自dscarr):

Public Function FileSize(path As String) As Variant 
    On Error GoTo Err_FileSize:
    Dim retVal As Variant 
    Dim filesys As Object 
    Dim file As Object 
    retVal = "" 
    Set filesys = CreateObject("Scripting.FileSystemObject") 
    Set file = filesys.GetFile(path) 
    retVal = file.Size 

    Exit_FileSize: On Error Resume Next 
    FileSize = retVal 
    Exit Function 

    Err_FileSize: retVal = "Error: " & Err.Description 
    Resume Exit_FileSize 
End Function

如果我将其导入新工作簿,请将文档另存为“启用 Excel 宏的工作簿”以及名为 readme.txt 的空文件,然后将“./readme.txt”放入 A1 和“=FileSize(A1 )" 在 A2 中,A2 正确评估为 readme.txt 的文件大小,0 字节。伟大的。如果我然后保存文档,关闭并重新打开它,我会收到宏被禁用的警告。如果我启用它们,A2 的内容将更改为#VALUE!,我所做的任何事情都不会使该功能再次起作用。有没有人见过这个,谁能指出我在这里犯的错误?

edit:问题似乎是我使用相对路径引起的。我无法解释为什么它适用于新工作簿,但一旦保存并重新打开后就无法使用,但使用绝对路径可以解决问题,正如 dscarr 所确定的,这是一个“找不到文件”问题。

【问题讨论】:

【参考方案1】:

我在 Excel 2007 启用宏的工作簿中复制了您的代码,发现它在以下警告中运行良好

    当您打开工作簿时,它不会自动更新值(例如运行 FileSize 函数)。这可以通过向计算工作簿的 Workbook_Open 事件处理程序添加一些代码来补偿。

    当它找不到指定的文件时,我收到 #VALUE 错误。实际上,当文件丢失或名称不正确时,“Set file = filesys.GetFile(path)”行会引发错误号 53“File Not Found”。在这种情况下,永远不会设置返回值,因为永远不会调用设置它的代码行。在实际尝试检索文件大小之前,您可以尝试设置默认值“未找到文件”。

【讨论】:

啊进步!出色的工作,我的朋友!问题似乎是相对路径的分辨率。如果我使用完整路径,它会完美运行(正如您指出的那样,无需在打开时重新评估)。如何找回错误代码?我试图“监视”filesys 对象,但是当 GetFile 失败时它就超出了范围。 另外,该单元格似乎没有重新计算,因为它所依赖的单元格没有改变。要强制 Excel 重新计算所有内容,不管它是否已更改,请将语句“Application.CalculateFull”添加到 Workbook_Open 事件中。 可以使用 Err 对象检索错误号。示例:Err.Number 我冒昧地重写了你的函数。 有什么办法可以解决相对路径问题吗?你能重现这种行为,还是我要疯了?【参考方案2】:

在 Excel 2010 中,转到文件->选项->信任中心->宏设置并确保已选择启用选项按钮。

【讨论】:

令我不安的不是启用,而是该功能不再起作用。 @nineside,我同意 dscarr 的 Workbook_Open 想法。

以上是关于如何使重新打开文档时有效的 Excel VBA 函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Excel VBA 中读写word文档 步骤

Excel VBA操作word文件

如何破解vba工程密码

用VBA取消EXCEL文件VBA保护密码。

如何打开 Excel VBA 及 我的第一个代码

Excel 未通过 VBA 显示打开的 Excel 文档