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

Vba 我应该在退出子过程之前重新打开.CutCopyMode吗?,vba,excel,excel-2010,Vba,Excel,Excel 2010,为了优化我的代码,我关闭了几个属性;一个特别的例子是 我是否应该在我的sub完成之前与其他人一起再次打开.CutCopyMode(例如True) ' lots of code here With Application .ScreenUpdating = True .EnableEvents = True .CutCopyMode = True '<~~ ??? End With End Sub ”这里有很

为了优化我的代码,我关闭了几个属性;一个特别的例子是

我是否应该在我的sub完成之前与其他人一起再次打开.CutCopyMode(例如True)

    ' lots of code here

    With Application
        .ScreenUpdating = True
        .EnableEvents = True
        .CutCopyMode = True     '<~~ ???
    End With
End Sub
”这里有很多代码
应用
.ScreenUpdate=True
.EnableEvents=True

.CutCopyMode=True'简单的回答是,
Application.CutCopyMode=True
要么什么都不做,要么与您认为的相反。如果.CutCopyMode的当前状态为False,则将其设置为True不会打开“跳舞边框”;如果当前状态为xlCopy或xlCut(),则将.CutCopyMode设置为True会有效地将其关闭。此外,您不能将.CutCopyMode设置为xlCopy或xlCut

长话短说,首先要理解它的目的是什么,以及官方文档错误如何暗示您可以“打开”它

手动剪切(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
的好处有限。但是,如果您的代码已经启动了一个操作,并且您已经使用副本的内容完成了一个或多个操作,那么在您的代码中运行可能是明智的

可以使用一些工作表事件宏代码来检查和报告.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
可以通过放弃剪贴板存储来执行一些良好的操作

如果有人能通过操纵按钮把行进中的蚂蚁重新打开,我非常希望看到一个例子


“跳舞的边界”通俗地称为“行军的蚂蚁”。

²虽然布尔值True或False是一种不同的类型,但出于所有目的,False等于零,任何非False的值都是True。如果解析布尔► 数字,VBA False为0,True始终等于(-1),但如果解析相反的数字► 布尔任何非零的数字都被认为是真的,零被认为是假的。

我不知道我等这个问题/解释等了这么久。写得真棒!我想这只是一个文档错误。虽然可以读取任何可能的状态{-1,0,1,2},但只能将{0}写入属性。写入属性时,任何数值都强制为零。这似乎是合理的,因为每当蚂蚁离开时,OCB都会被清除。再次设置小动物的动画会使用户界面处于模糊状态,这表明粘贴是可能的,但不是,因为OCB是空白的。这个设计很有意义,文档却没有。你手头的时间太多了。这会产生多少优化效果?需要多少拷贝/粘贴才能反映出明显的差异?@findwindow-tbh,这一问答是针对最近发布成问题的一些代码段中出现的
Application.CutCopyMode=True
。我甚至很少在VBA中使用a,而是更喜欢直接值传输。lol我真想知道你为什么要复制/粘贴,但后来你撒谎了。您编写
是为了优化我的代码
。。。标记这个=P@pnuts-除了[excel-2010]是我衡量所有贡献的事实标准之外,我希望避免与xl2007之前的Offi直接关联
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