Home » excel » How do I make an Excel VBA Function that works when I reopen the document?

How do I make an Excel VBA Function that works when I reopen the document?

Posted by: admin May 14, 2020 Leave a comment


OK, I’ve just written a very simple VBA script that goes off and grabs the file size of a file found at a specified location (edit update code from 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

If I import this into a new workbook, save the document as a “Excel Macro-Enabled Workbook” alongside an empty file called readme.txt and then put “./readme.txt” in A1 and “=FileSize(A1)” in A2, A2 evaluates properly to the file size of readme.txt, 0 bytes. Great. If I then save the document, close and reopen it, I’m warned that macros are disabled. If I enable them, the content of A2 has changed to #VALUE! and nothing I do will make the function work again. Has anyone seen this before, can anyone point out the mistake that I’m making here?

edit: the issue seems to be caused by me using relative paths. I can’t explain why it works for a new workbook, but not once saved and reopened, but using absolute paths solves the problem, which as dscarr identified, was a “File Not Found” issue.

How to&Answers:

I duplicated your code in an Excel 2007 Macro Enabled workbook and found that it worked just fine with the following caveats

  1. It does not automatically update the value (e.g. run the FileSize function) when you open the workbook. This can be compensated for by adding some code to the Worrkbook_Open event handler that calculates the workbook.

  2. I get the #VALUE error when it cannot find the file that is specified. Indeed, when the file is missing or incorrectly named the line “Set file = filesys.GetFile(path)” throws the error number 53 “File Not Found”. In this case the return value is never set because the line of code that sets it is never called. You could try setting a default value of “File Not Found” before actually attempting to retrieve the file size.


In Excel 2010, Go File->Options->Trust Center->Macro Settings and make sure the Enable option button has been selected.