"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
这很好用,但我总是看到那个烦人的对话框,警告我在合并时丢失数据(这正是我在我的宏中试图避免的)。
我可以摆脱那个对话框,配置 Application
的 DisplayAlerts
属性:
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
:
ActiveCell
、ActiveSheet
、ActiveWorkbook
、ActiveWindow
、Addins
、Charts
、Selection
等
Calculate
、Evaluate
、Intersect
、Run
、Union
等
(但请参阅 why/how 这行得通):
布尔值 属性 例如 DisplayAlerts
(EnableEvents
、ScreenUpdating
等)不属于上述类别。
避免落入此类陷阱的黄金法则是在编写宏时使用 Option Explicit
。
只是给@BigBen 的回答补充一些信息。如果您在代码中编写类似 Workbooks
或 ActiveSheet
的内容,则 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
这样的东西很管用。
我刚刚在 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
这很好用,但我总是看到那个烦人的对话框,警告我在合并时丢失数据(这正是我在我的宏中试图避免的)。
我可以摆脱那个对话框,配置 Application
的 DisplayAlerts
属性:
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
:
ActiveCell
、ActiveSheet
、ActiveWorkbook
、ActiveWindow
、Addins
、Charts
、Selection
等Calculate
、Evaluate
、Intersect
、Run
、Union
等
(但请参阅
布尔值 属性 例如 DisplayAlerts
(EnableEvents
、ScreenUpdating
等)不属于上述类别。
避免落入此类陷阱的黄金法则是在编写宏时使用 Option Explicit
。
只是给@BigBen 的回答补充一些信息。如果您在代码中编写类似 Workbooks
或 ActiveSheet
的内容,则 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
这样的东西很管用。