我了解这是VB的一些基础知识,但无法弄清楚如何向Google询问:
VBA如何管理常量?在某些语言中,编译器用值替换它们。但是在VBA中如何工作?如果我在sub / function中声明它们,而不是在全局空间中声明,那会很重要。特别是,如果子元素/函数在运行时被多次调用。
我经常在子/函数空间中将函数名称和一些其他字符串声明为常量-对我来说,读取代码更容易。 例如:下面代码中的Get_AppExcel_Ref()中的SUB_NAME,用于记录错误事件。 如果在程序运行时将Get_AppExcel_Ref()调用两次,那么SUB_NAME将在内存中分配一次,第一次运行还是每次调用?也许存在某种性能问题,最好将SUB_NAME声明为全局。
Private Sub Get_AppExcel_Ref(ByRef appObject As Object)
Const SUB_NAME As String = "Get_AppExcel_Ref"
On Error GoTo ERR_NOT_OPENNED
Set appObject = GetObject(, "Excel.Application")
Exit Sub
ERR_NOT_OPENNED:
If Err.Number = 429 Then
Err.Clear
Set appObject = CreateObject("Excel.Application")
Else
Call LOG.printLog("open Excel", Err, SUB_NAME)
End If
End Sub
'LOG - user class type variable, printLog params: Description, Error, Source Name
答案 0 :(得分:0)
将Const
声明为全局将毫无意义,因为无论您在何处使用它,它都将显示相同的字符串。
您可以将其声明为全局变量(例如,将额外的参数保存到日志记录例程中)并分配该例程的名称,但是您会将例程的名称作为代码中的(恒定)字符串也(因此使用相同的内存量)。最后,它将完全弄乱您的逻辑,因为在调用子例程时,内容将被覆盖,并且在调用之后发生错误时,您的日志将显示错误的例程名称。所以不要走那条路。
正如Paul Ogilivie在其评论中所写,请将常量视为只读变量-并不要浪费任何关于exaxt实现的想法(但我认为假定只将字符串放入记忆)。您的VBA代码有足够的可用内存,并且字符串处理是如此之快,以至于您将永远不会遇到任何运行时问题。
我的信条:使用一切适合您的程序员最佳需求的方法-可读性对此很重要。不必太在意内存消耗或运行时速度-除非您确实遇到问题。如果这样做,则很可能是其他原因引起的。
答案 1 :(得分:0)
最重要的是,欢迎来到SO。
与其他语言一样,我认为VBA编译器也确实将常量替换为其值。 因此它们与变量不同。
我认为这里不需要常量。我只会将它们用于参数,而不仅仅是替换任何字符串。
您的代码将像这样:
LOG.printLog "open Excel", Err, "GetAppExcelRef"