Dom*_*que 3 excel vba excel-365
我刚刚在 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
Run Code Online (Sandbox Code Playgroud)
这工作正常,但我总是看到那个烦人的对话框,警告我在合并时丢失数据(这正是我在宏中试图避免的情况)。
我可以摆脱该对话框,配置Application的DisplayAlerts属性:
Application.DisplayAlerts = False
Selection.Merge
Selection.Value = Temp
Application.DisplayAlerts = True
Run Code Online (Sandbox Code Playgroud)
这工作正常。
因此,与Application默认对象一样,我尝试清理我的代码,如下所示:
DisplayAlerts = False
Selection.Merge
Selection.Value = Temp
DisplayAlerts = True
Run Code Online (Sandbox Code Playgroud)
如您所见,我只是省略了提及该Application对象。这是允许的事情,我过去也做过。(如果不是 VBA,那么 Delphi,也许?)
...但令我惊讶的是,该对话框再次出现(尽管按 F1 会将我带到官方“Application.DisplayAlerts”文档)。
这给我留下了一个简单的问题:
如果简单DisplayAlerts = ...不再等于Application.DisplayAlerts = ...,它意味着什么以及如何使用它?
供您参考,我正在使用 Excel-365。
只是为了在@BigBen 的答案中添加一些信息。如果您在代码中编写类似Workbooks或 的内容ActiveSheet,VBA 不会查找Application-object - 它会查找名为 的(相当隐藏的)对象Global。
全局对象公开了 - 对象的一些(但不是全部)属性和方法Application,因此ActiveSheet引用Application.ActiveSheet- 但不是因为 -Application有一个具有此名称的成员,而是因为全局对象定义了该ActiveSheet含义Application.ActiveSheet。事实上,甚至Application-object 也是通过 Global 对象访问的。
几乎没有任何关于这个 Global 对象或其概念的信息。我找到了Microsoft的一个页面,描述了 MS Word 的 Global 对象,但唯一的解释是“包含不需要在 Application 属性前面的顶级属性和方法”。。对于 Excel,我找到了这个页面。
有时您会收到奇怪的错误消息,例如“Excel VBA Method 'Range' of object '_global' failed” - 这是指向 Global 对象的指针。我很高兴了解更多关于这个物体的概念和机制,但恐怕周围只有极少数人知道更多(当然除了Mathieu Guindon,又名橡胶鸭先生......)。在日常生活中,我们理所当然地认为这样的事情ActiveSheet很有效。
DisplayAlerts是一个未声明的变量。
某些Application属性和方法可以(有效地)省略Application:
ActiveCell,ActiveSheet,ActiveWorkbook,ActiveWindow,Addins,Charts,Selection, ETC。Calculate,Evaluate,Intersect,Run,Union, ETC。(但请参阅这个答案为什么/如何工作):
DisplayAlerts诸如( EnableEvents、等)之类的布尔属性ScreenUpdating不属于上述类别。
为了不陷入这样的陷阱,一条黄金法则是使用Option Explicitwhile 编写宏。
| 归档时间: |
|
| 查看次数: |
252 次 |
| 最近记录: |