编译 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 语句?的主要内容,如果未能解决你的问题,请参考以下文章