如何创建在重新打开文档时有效的Excel VBA功能?

时间:2011-07-27 20:22:17

标签: excel vba user-defined-functions excel-2010

好的,我刚刚编写了一个非常简单的VBA脚本,该脚本关闭并抓取在指定位置找到的文件的文件大小( 编辑 更新代码来自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!,我所做的任何事情都不会使该功能再次起作用。有没有人见过这个,谁能指出我在这里犯的错误?

编辑 :问题似乎是由我使用相对路径引起的。我无法解释为什么它适用于新工作簿,但不能保存和重新打开,但使用绝对路径解决了问题,正如dscarr所识别的那样,是“找不到文件”问题。

2 个答案:

答案 0 :(得分:3)

我在Excel 2007 Macro Enabled工作簿中复制了您的代码,发现它可以正常使用以下警告

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

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

答案 1 :(得分:0)

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