0

我知道这是一些 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
4

2 回答 2

1

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

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

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

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

于 2019-03-25T10:00:26.790 回答
0

首先,欢迎来到 SO。

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

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

你的代码会像这样很好:

LOG.printLog "open Excel", Err, "GetAppExcelRef"
于 2019-03-25T10:35:45.187 回答