有什么更好的内存使用方式:在 subs 或 module 中定义常量

What better for memory usage: define constants in subs or in module

我知道这是一些 VB 基础知识,但不知道如何提问 google:

VBA 如何管理常量?在某些语言中,编译器用值替换它们。但这在 VBA 中如何运作?如果我在 sub/function 中而不是在全局 space 中声明它们会有关系吗?特别是,如果 sub/function 在 运行 时间内被多次调用。

我经常在 sub/function space 中将函数名称和一些其他字符串声明为常量 - 这对我来说更容易阅读我的代码。 例如:下面代码中 Get_AppExcel_Ref() 中的 SUB_NAME,用于记录错误事件。 如果 Get_AppExcel_Ref() 将被调用几次,而程序 运行ning - 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

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

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

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

我的信条:使用最适合您作为程序员的需求的一切 - 可读性是这一点的一个重要方面。不要太在意内存消耗或运行时速度——除非你真的遇到了问题。如果你这样做,这些很可能是由其他原因引起的。

首先,欢迎来到 SO。

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

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

您的代码可以像这样:

LOG.printLog "open Excel", Err, "GetAppExcelRef"