如何使重新打开文档时有效的 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 我冒昧地重写了你的函数。在 Excel 2010 中,转到文件->选项->信任中心->宏设置并确保已选择启用选项按钮。
【讨论】:
令我不安的不是启用,而是该功能不再起作用。 @nineside,我同意 dscarr 的 Workbook_Open 想法。以上是关于如何使重新打开文档时有效的 Excel VBA 函数?的主要内容,如果未能解决你的问题,请参考以下文章