为了优化我的代码,我关闭了几个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

最佳答案

简短的答案是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 methodRange.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来使重新打开行进的 Ant ,我将非常希望看到一个示例。

¹“跳舞的边界”也俗称“行军蚁”。
²虽然 bool 值True或False是一个不同的类型,但就所有意图和目的而言,False等于零,而非False的则为True。如果解析 bool 值►数字,则VBA False为0,而True始终等于(-1);但是,如果解析反向数字► bool 值,则任何非零数字均被视为True,而零则被视为False。

09-25 22:15