编译 vba 代码时何时处理 Dim 语句?

Posted

技术标签:

【中文标题】编译 vba 代码时何时处理 Dim 语句?【英文标题】:When is a Dim statement processed when vba code is compiled? 【发布时间】:2011-05-26 14:01:32 【问题描述】:

VBA代码编译时什么时候处理Dim语句?如果我这样做,是否会提高效率?:

Dim oFileDiag As FileDialog

Set oFileDiag = Application.FileDialog(msoFileDialogFilePicker)                
If oFileDiag.Show = -1 Then

    '// Dim statement further down in the code...
    Dim ofdSelected As FileDialogSelectedItems
    Set ofdSelected = .SelectedItems

End If

与此相反?:

'// Dim statement at the beginning of the code...
Dim oFileDiag As FileDialog
Dim ofdSelected As FileDialogSelectedItems

Set oFileDiag = Application.FileDialog(msoFileDialogFilePicker)                
If oFileDiag.Show = -1 Then

    Set ofdSelected = .SelectedItems

End If

【问题讨论】:

【参考方案1】:

据我了解(我以前错了),VB(A) 的效率没有提高。在例程中的任何位置声明任何变量都将使用相同的资源(尽管您的变量在其声明之前不会可用)。

对象变量(Dim)的声明只创建引用,直到Set才实例化对象。但是,请注意这种构造中的相反问题:

Dim rsFoo As New ADODB.Recordset

'other statements

With rsFoo
    .LockType = adBatchOptimistic
    'other statements
End With

这似乎很方便,因为您不必显式地使用Set... = New...。但问题是每次在运行时使用rsFoo 时,代码必须检查它是否已被实例化。这样会好很多:

Dim rsFoo As ADODB.Recordset

'other statements

Set rsFoo = New ADODB.Recordset
With rsFoo
    .LockType = adBatchOptimistic
    'other statements
End With

在某种程度上,这是一种“宗教”差异,至少在开销没有任何实际差异的语言中是这样。 VB(A) 中最常见的做法是在例程开始时声明所有变量,尽管有些人认为保持声明尽可能接近第一次使用是“更清晰”(不是我们这些一开始就习惯于期待它们,这不是......)。

【讨论】:

@Hari,这里还有更多要添加到@Roland 的答案:***.com/questions/2478097/…【参考方案2】:

有根据的猜测:这不会有任何区别,但是,来自 C 语言的程序员保持习惯在代码/函数的开头声明所有变量。

【讨论】:

【参考方案3】:

我会说轻微,因为它是您永远不会注意到的交互式用户界面的一部分。

这实际上是 Scott Meyers 的 Effective C++ 书籍之一中的一个技巧,用于将变量声明推迟到最后一刻,以避免不必要的构造函数开销,如果(如在本例中)您实际上不需要基于失败的对象条件。

我认为这在 VB 中是相似的。 Dim ofdSelected As FileDialogSelectedItems 是实例化一个对象还是仅仅声明一个引用?

【讨论】:

我不确定,因为如果 vba 是一种脚本语言,它是否设置了构造函数开销,不管它在哪里。为了回答您的问题,ofdSelected 声明了对对象的引用。在 Set 语句之前,它没有被实例化(我不认为......)。感谢您的信息...

以上是关于编译 vba 代码时何时处理 Dim 语句?的主要内容,如果未能解决你的问题,请参考以下文章

VBA - 在“IF语句”中嵌套“带语句”

用VBA筛选日期区间

vba中怎么遍历单元格中所有字符串

何时在 SQL 语句中使用单引号?

VB.NET的dim语句的区别

VBA编程06.控制语句