This article will explain the VBA sub or function not defined error.
When one has finished writing VBA code, it is a good idea to compile the code to check if there are any errors that may occur when running the code. If there are compile errors, a compile error warning will appear. One of these errors may be the Sub or Function not defined error. There can be a few reasons that this error occurs.
Misspelled Sub or Function
The most common reason for this error occurring is a spelling mistake!
Let us take the code below as an example:
Function GetTaxPercent(dblP as Double) As Double GetTaxPercent = dblP*0.15 End Function
Sub GetPrice() Dim dblPrice As Double Dim dblTax As Double dblPrice = Range("A1") dblTax = GetTaxPerc(dblPrice) End Sub
In the above example, we have created a function to fetch the tax percentage value (15%).
In the second procedure, I am trying to call that function to get the tax on a certain value in range A1.
However, when I run the code, I get the compile error as I have spelt the function that I am calling incorrectly. This is an easily made mistake, especially in large VBA projects with lots of procedures and modules. The best way to prevent these errors at run time, is to compile the code before releasing it to your users.
In the Menu, click Debug > Compile VBAProject.
Any compile errors will then be highlighted in the code in order for you to fix them.
Missing Sub or Function
It may be that a sub or function just does not exist! Once again, if you have a large VBA project, it can be possible to delete a sub or function by mistake. If this is the case, you would unfortunately need to re-write the function. Always a good idea to have backups for this reason!
Incorrect Scope of Sub of Function
It may be the case that the sub or function does exist, and is spelt correctly, but the scope of the sub or function is incorrect. In the example below, the GetTaxPercent function is in a different module to the GetPrice sub that is calling it, and it has been marked Private. It therefore cannot be seen by the GetPrice sub procedure.
If we remove the word private in front of the Function, then the module will compile.