我应该在退出子程序之前重新打开.CutCopyMode吗?

8 excel vba excel-vba excel-2010

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

Sub MyProcedure()
    With Application
        .ScreenUpdating = False
        .EnableEvents = False
        .CutCopyMode = False
    End With

    ' lots of code here
Run Code Online (Sandbox Code Playgroud)

在我的子查询完成之前,我应该再与其他人一起重新打开.CutCopyMode(例如True)吗?

    ' lots of code here

    With Application
        .ScreenUpdating = True
        .EnableEvents = True
        .CutCopyMode = True     '<~~ ???
    End With
End Sub
Run Code Online (Sandbox Code Playgroud)

小智 14

简短的回答是,Application.CutCopyMode = True要么根本不做任何事情,要么与你的想法相反.如果.CutCopyMode的当前状态为False,则将其设置为True不会打开"跳舞边框",如果当前状态为xlCopy或xlCut(XlCutCopyMode枚举常量),则将.CutCopyMode设置为True会有效地将其关闭.此外,您不能将.CutCopyMode设置为xlCopy或xlCut.

长篇故事首先要了解Application.CutCopyMode属性执行的目的以及官方文档错误意味着您可以将其"打开".

当您手动剪切(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方法Range.PasteSpecial方法操作,则在您的代码中运行可能是谨慎的.

检查和报告.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
Run Code Online (Sandbox Code Playgroud)

报告到VBE的立即窗口的结果将是复制模式,切割模式或关闭.Application.CutCopyMode永远不会直接将其状态报告为True².

虽然您可以在操作环境中实现更改,但Application.CutCopyMode = False我从未能通过将属性设置为True 来关闭.CutCopyMode On.不会抛出任何错误,官方文档明确指出将属性设置为True "开始剪切或复制模式并显示移动边框".但是我发现回到"行军蚂蚁"的唯一方法就是启动另一个复制操作.

因此,对于所有意图和目的,编码Application.CutCopyMode = True没有害处.但是,编码Application.CutCopyMode = False可以通过放弃剪贴板存储来执行一些好处.

如果有人可以通过操纵Application.CutCopyMode属性来重新启动行军蚂蚁,我非常希望看到一个例子.


¹ "舞蹈边界"俗称"行军蚂蚁".
² 虽然布尔值True或False是一个不同的类型,但对于所有意图和目的,False等于零,任何非False都是True.如果解析布尔值►数字,则VBA False为0且True始终等于(-1)但是如果解析反向数字►布尔值,则任何非零数字都被视为True,零被视为False.

  • 我认为这只是一个文档错误.虽然可以读取任何可能的状态{-1,0,1,2},但只能将{0}写入属性.写入属性时,任何数值都被强制为零.这似乎是合理的,因为任何时候蚂蚁都关闭,OCB已被擦洗.再次动画生物将使用户界面处于模糊状态,表明粘贴是可能的,但不是,因为OCB是空白的.这种设计很有意义,文档没有. (2认同)