"Application" 作为 Excel VBA 中的默认对象怎么样?

What about "Application" as default object in Excel VBA?

我刚刚在 Excel VBA 中编写了这个简单的宏,用于合并一组选定的单元格:

Sub Macro_Merge()
Dim Temp As String
Dim S As Variant

Temp = ""
For Each S In Selection
  If Temp = "" Then
    Temp = CStr(S.Value)
  Else:
    Temp = Temp + "," + CStr(S.Value)
  End If
Next

Selection.Merge
Selection.Value = Temp
Selection.VerticalAlignment = xlTop
  
End Sub

这很好用,但我总是看到那个烦人的对话框,警告我在合并时丢失数据(这正是我在我的宏中试图避免的)。

我可以摆脱那个对话框,配置 ApplicationDisplayAlerts 属性:

Application.DisplayAlerts = False
Selection.Merge
Selection.Value = Temp
Application.DisplayAlerts = True

这工作正常。
因此,由于 Application 是默认对象,我尝试清理我的代码,如下所示:

DisplayAlerts = False
Selection.Merge
Selection.Value = Temp
DisplayAlerts = True

如您所见,我只是省略了提及 Application 对象。这是允许的事情,我过去也做过。 (如果不在 VBA,那么 Delphi,也许吧?)

...但令我惊讶的是,对话框再次出现(尽管按 F1 将我带到 the official "Application.DisplayAlerts" documentation)。
这给我留下了一个简单的问题:

如果一个简单的 DisplayAlerts = ... 不再等于 Application.DisplayAlerts = ...,那是什么意思,我该如何使用它?

供您参考,我正在使用 Excel-365。

DisplayAlerts 是未声明的变量。

某些 Application 属性和方法可以(有效地)省略 Application

  • ActiveCellActiveSheetActiveWorkbookActiveWindowAddinsChartsSelection
  • CalculateEvaluateIntersectRunUnion

(但请参阅 why/how 这行得通):

布尔值 属性 例如 DisplayAlertsEnableEventsScreenUpdating 等)不属于上述类别。

避免落入此类陷阱的黄金法则是在编写宏时使用 Option Explicit

只是给@BigBen 的回答补充一些信息。如果您在代码中编写类似 WorkbooksActiveSheet 的内容,则 VBA 不会查看 Application-object - 它正在查看一个名为(隐藏得很好)的对象Global.

全局对象公开了 Application 对象的一些(但不是全部)属性和方法,因此 ActiveSheet 指的是 Application.ActiveSheet - 但不是因为 Application 有一个具有此名称的成员,但是因为 Global 对象定义 ActiveSheet 表示 Application.ActiveSheet。事实上,甚至 Application-object 也是通过 Global 对象访问的。

几乎没有关于此全局对象或其概念的任何信息。我在 O'Reilly 上找到了 Microsoft describing the Global object of MS Word, but the only explanation there is "Contains top-level properties and methods that don't need to be preceded by the Application property.". For Excel, I found this page 的一个页面。

有时您会收到奇怪的错误消息,例如 "Excel VBA 对象'_global' 的方法 'Range' 失败" -这是指向全局对象的指针。我很乐意了解有关此对象的概念和机制的更多信息,但恐怕周围只有极少数人知道更多(当然除了 Mathieu Guindon AKA Rubberduck 先生...)。在日常生活中,我们理所当然地认为 ActiveSheet 这样的东西很管用。