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

时间:2011-05-26 14:01:33

标签: vba

在编译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

3 个答案:

答案 0 :(得分:3)

据我所知(之前我错了),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)中最常见的做法是在例程的开头声明所有变量,尽管有些人认为保持声明尽可能接近第一次使用是“更清楚”(不是我们这些人条件是在开始时期望它们全部,它不是......)。

答案 1 :(得分:0)

受过教育的猜测:这不会有任何区别,但是,来自C的prgrammers保持习惯在代码/函数的开头声明所有变量。

答案 2 :(得分:0)

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

这实际上是Scott Meyers的一本有效C ++书籍中的一个提示,它阻止变量声明直到最后一刻,以避免不必要的构造函数开销,如果(在这种情况下)你根本不需要基于失败的对象条件。

我认为这在VB中是类似的。 Dim ofdSelected As FileDialogSelectedItems是否实例化对象或仅声明引用?