内存使用更好:在subs或模块中定义常量

问题描述 投票:0回答:2

我理解这是一些VB基础知识,但无法弄清楚如何问谷歌:

VBA如何管理常量?在某些语言中,编译器会用值替换它们。但是在VBA中如何运作?如果我在子/函数中声明它们,而不是在全局空间中,它是否重要。特别是,如果在运行时多次调用子/函数。

我经常在子/函数空间中声明函数名和一些其他字符串作为常量 - 我更容易阅读我的代码。例如:下面代码中的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
vba variables memory vba6
2个回答
0
投票

Const声明为全局将毫无意义,因为它会显示相同的字符串,无论您在何处使用它。

您可以将它声明为全局变量(例如,将额外参数保存到日志记录例程中)并指定例程的名称,但您也可以在代码中将例程的名称作为(常量)字符串(因此使用相同的内存量)。最后,它会完全搞乱你的逻辑,因为在调用子程序时,内容将被覆盖,并且在调用之后发生错误时,您的日志将显示错误的例程名称。所以不要走那条路。

正如Paul Ogilivie在他的评论中所写,将常量视为只读变量 - 并且不要浪费任何关于exaxt实现的想法(但我认为假设字符串只在内存中放置一次就可以了)。您有足够的内存可用于您的VBA代码,字符串处理速度非常快,您将永远不会遇到任何运行时问题。

我的信条:使用Everyhing,因为它最符合您的程序员需求 - 可读性是这方面的一个重要方面。不要过多关心内存消耗或运行时速度 - 除非你真的遇到问题。如果你这样做,这很可能是由其他事情引起的。


0
投票

首先,欢迎来到SO。

我认为VBA编译器也会像其他语言一样用常量替换常量。所以它们与变量不同。

我认为这里不需要常数。我只倾向于将它们用于参数,而不仅仅是替换任何字符串。

你的代码就像这样:

LOG.printLog "open Excel", Err, "GetAppExcelRef"
© www.soinside.com 2019 - 2024. All rights reserved.