更好地利用内存:在子程序或模块中定义常量

时间:2019-03-25 09:30:24

标签: vba variables memory vba6

我了解这是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

2 个答案:

答案 0 :(得分:0)

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

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

正如Paul Ogilivie在其评论中所写,请将常量视为只读变量-并不要浪费任何关于exaxt实现的想法(但我认为假定只将字符串放入记忆)。您的VBA代码有足够的可用内存,并且字符串处理是如此之快,以至于您将永远不会遇到任何运行时问题。

我的信条:使用一切适合您的程序员最佳需求的方法-可读性对此很重要。不必太在意内存消耗或运行时速度-除非您确实遇到问题。如果这样做,则很可能是其他原因引起的。

答案 1 :(得分:0)

最重要的是,欢迎来到SO。

与其他语言一样,我认为VBA编译器也确实将常量替换为其值。 因此它们与变量不同

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

您的代码将像这样:

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