在退出我的子程序之前,是否应该再次打开.CutCopyMode?

为了优化我的代码,我closures了几个Application Object成员属性; 其中一个特别是.CutCopyMode属性 。

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 

简单的答案是, Application.CutCopyMode = True或者什么也不做,或者它与你所想的相反。 如果.CutCopyMode的当前状态为False,那么将其设置为True不会打开“跳舞边框”,如果当前状态为xlCopy或xlCut( XlCutCopyMode枚举常量 ),则将.CutCopyMode设置为True会将其closures。 此外,您不能将.CutCopyMode设置为xlCopy或xlCut。

长长的故事从了解Application.CutCopyMode属性执行的目的开始,官方文档错误意味着您可以将其重新打开。

当您在工作表上手动剪切(Ctrl + X)或复制(Ctrl + C)一个或多个单元格时,单元格将获取指示操作源的“跳舞边框”1。 此时,.CutCopyMode非零(xlCopy或xlCut),并且后续粘贴操作与Office剪贴板和Windows剪贴板之间的关系存在,因为它们保留源的内容。

如果你select了剪切(又名移动 )单元格,粘贴(Ctrl + V)之后立即将单元格移动到一个新的位置.CutCopyMode变成虚假的,你将失去源代码的“跳舞边界”。 这是因为源单元格中没有剩余内容。 内容仍然可以从Office剪贴板访问,但从Windows剪贴板中删除。

如果select复制单元格,则可以将单元格粘贴到其他位置,并保留“跳舞边框”。 .CutCopyMode属性保持非零(例如xlCopy)。 您可以移动到另一个位置并粘贴相同的内容; .CutCopyMode保持非零,围绕原始内容的“跳舞边框”保持不变,与Office剪贴板和Windows剪贴板的关系也一样。

如果此时运行了包含Application.CutCopyMode = False VBA代码,跳舞边框将消失,任何粘贴操作与Office剪贴板之间的连接将被消除。 在启动VBA子程序时,这是一个很好的状态,以便代码中的任何潜在的复制/粘贴操作都不可能与.CutCopyMode状态发生冲突。 但是,这只有在特殊情况下才有必要(见下一段)。

某些Excel操作足以打破此Office剪贴板连接并强制.CutCopyMode为False。 其中之一就是手动启动一个macros子程序,所以在你的代码开始处包含Application.CutCopyMode = False是有限的。 但是,如果代码已经启动了Range.Copy操作,并且已经使用副本的内容完成了任何Worksheet.Paste方法或Range.PasteSpecial方法操作,那么在代码中运行可能是谨慎的。

检查和报告.CutCopyMode的当前状态可以使用一些工作表事件macros代码完成。

 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立即窗口的结果将是复制模式,剪切模式或closures。 Application.CutCopyMode永远不会直接报告其状态为True²。

尽pipe您可以通过Application.CutCopyMode = False改变操作环境,但我从来没有能够通过将属性设置为True来打开.CutCopyMode On 。 没有错误抛出,官方文件明确指出,将属性设置为True “开始剪切或复制模式并显示移动边界”。 但是我发现取回“行军ant”的唯一办法就是开始另一个复制行动。

所以对于所有的意图和目的,编码Application.CutCopyMode = True并没有什么坏处。 但是,编码Application.CutCopyMode = False可以通过放弃剪贴板存储来执行某些操作。

如果任何人都可以通过操作Application.CutCopyMode属性来重新打开行军的ant,我会非常喜欢看到一个例子。


¹ “舞蹈边界”俗称“行军ant”。
² 对于所有意图和目的,True或False的布尔值是不同的types,False等于零,任何不是False的都是True。 如果parsing布尔值►数字,则VBA False为0,True总是等于(-1),但是如果parsing反向数字►布尔值,则将任何非零数字视为True,并将零视为False。