为了优化我的代码,我关掉了几个Application Object member属性;一个特别是.CutCopyMode property。
Sub MyProcedure()
With Application
.ScreenUpdating = False
.EnableEvents = False
.CutCopyMode = False
End With
' lots of code here
我应该在我的子画面完成之前再与其他人一起重新打开.CutCopyMode(例如True)吗?
' lots of code here
With Application
.ScreenUpdating = True
.EnableEvents = True
.CutCopyMode = True '<~~ ???
End With
End Sub
答案 0 :(得分:13)
简短的回答是Application.CutCopyMode = True
要么根本不做任何事情,要么与你的想法相反。如果.CutCopyMode的当前状态为False,则将其设置为True不会打开“跳舞边框”,如果当前状态为xlCopy或xlCut(XlCutCopyMode Enumeration constants),则将.CutCopyMode设置为True会有效地将其设置为关闭。此外,您不能将.CutCopyMode设置为xlCopy或xlCut。
长篇故事首先要了解Application.CutCopyMode property执行的目的以及官方文档错误意味着您可以将其“打开”。
当您在工作表上手动剪切(Ctrl + X)或复制(Ctrl + C)一个或多个单元格时,单元格将获得一个指示操作源的“跳舞边框”¹。此时,.CutCopyMode不为零(xlCopy或xlCut),并且后续粘贴操作与Office剪贴板和Windows剪贴板之间存在关系,因为它们保留了源的内容。
如果您选择剪切(也就是移动)单元格,请在粘贴(Ctrl + V)后立即将单元格移动到新位置.CutCopyMode将变为false并且您将丢失围绕该单元格的“跳舞边框”资源。这是因为源单元格中没有剩余内容。内容仍可从Office剪贴板访问,但会从Windows剪贴板中删除。
如果您选择复制单元格,则可以将单元格粘贴到其他位置,并保留“跳舞边框”。 .CutCopyMode属性保持非零(例如xlCopy)。您可以移动到其他位置并粘贴相同的内容; .CutCopyMode保持非零,原始内容周围的“跳舞边框”仍然存在,与Office剪贴板和Windows剪贴板的关系也是如此。
如果此时运行包含Application.CutCopyMode = False
的VBA代码,则跳舞边框将消失,并且将删除任何粘贴操作与Office剪贴板之间的连接。在启动VBA子过程时,这是一个很好的状态,因此代码中的任何潜在复制/粘贴操作都不会与.CutCopyMode状态发生冲突。但是,这只应在特殊情况下才有必要(见下一段)。
某些Excel操作足以破坏此Office剪贴板连接并强制.CutCopyMode为False。其中之一是手动启动宏子程序,因此在代码开头包含Application.CutCopyMode = False
的好处有限。但是,如果您的代码已启动Range.Copy操作并且您已完成对副本内容的任何Worksheet.Paste method或Range.PasteSpecial method操作,则可能需谨慎运行代码。
检查并报告.CutCopyMode的当前状态可以使用一些工作表事件宏代码完成。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Select Case Application.CutCopyMode
Case True
Debug.Print "CutCopyMode is ON"
Case xlCopy
Debug.Print "CutCopyMode is in Copy mode"
Case xlCut
Debug.Print "CutCopyMode is in Cut mode"
Case False
Debug.Print "CutCopyMode is OFF"
Case Else
Debug.Print "???"
End Select
End Sub
向VBE的立即窗口报告的结果将是复印模式,剪切模式或关闭。 Application.CutCopyMode永远不会直接将其状态报告为True²。
虽然您可以使用Application.CutCopyMode = False
对操作环境进行更改,但我无法通过将属性设置为True来关闭.CutCopyMode 开启。没有错误被抛出,官方文档明确指出将属性设置为True “开始剪切或复制模式并显示移动边框。”但我发现只有这样才能恢复'行进蚂蚁'将启动另一个复制操作。
因此,对于所有意图和目的,编码Application.CutCopyMode = True
没有任何伤害。但是,编码Application.CutCopyMode = False
可以通过放弃剪贴板存储来实现一些好处。
如果有人可以通过操纵Application.CutCopyMode property重新开启行军蚂蚁,我非常希望看到一个例子。
¹'舞蹈边界'俗称“行军蚂蚁”。
²虽然布尔值True或False是一个不同的类型,但对于所有意图和目的,False等于零,任何非False都是True。如果解析布尔值►,则VBA False为0且True始终等于(-1)但是如果解析反向数字►布尔值,则任何非零数字都被视为True,零被视为False。