2015-11-20 9 views
6

Um meinen Code zu optimieren, schalte ich mehrere Application Object member Eigenschaften aus; eine davon ist die .CutCopyMode property.Sollte ich .CutCopyMode wieder einschalten, bevor ich meine Subprozedur verlasse?

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

    ' lots of code here 

Sollte ich .CutCopyMode wieder aktivieren (zum Beispiel True) wieder mit den anderen vor meinen Unter beendet?

' lots of code here 

    With Application 
     .ScreenUpdating = True 
     .EnableEvents = True 
     .CutCopyMode = True  '<~~ ??? 
    End With 
End Sub 
+0

Warum das [excel-2010] -Tag? – pnuts

+1

@pnuts - Beyond [excel-2010] ist der * De-facto-Standard *, mit dem ich alle meine Beiträge überprüfe, wollte ich direkte Verbindung mit pre-xl2007 Office Zwischenablage Verhalten vermeiden, die ich nicht direkt testen. – Jeeped

+0

@Jeeped Ich habe ziemlich viele 'Application.Calculation = xlCalculationManual'-'Application.Calculation = xlCalculationAutomatic'-Wraps gesehen, ist das nützlich? Und wenn ich Formeln hinzufüge, muss ich ein Ereignis auslösen, um diese auszulösen? –

Antwort

8

Die kurze Antwort ist, dass Application.CutCopyMode = True entweder tut nichts oder es tut das Gegenteil von dem, was Sie denken, es tut. Wenn der aktuelle Status von .CutCopyMode auf False festgelegt ist, wird durch das Festlegen auf True der 'Tanzende Rahmen' nicht aktiviert und wenn der aktuelle Status entweder xlCopy oder xlCut (XlCutCopyMode Enumeration constants) ist, wird durch Setzen von .CutCopyMode auf True deaktiviert. Darüber hinaus können Sie den .CutCopyMode nicht auf XlCopy oder XlCut festlegen.

Die lange Geschichte beginnt damit zu verstehen, welchen Zweck die Application.CutCopyMode property erfüllt und wie die offizielle Dokumentation falsch impliziert, dass Sie sie wieder einschalten können.

Wenn Sie eine oder mehrere Zellen im Arbeitsblatt manuell ausschneiden (Strg + X) oder kopieren (Strg + C), erhalten die Zellen eine "Tanzgrenze "¹, die die Quelle der Operation angibt. An diesem Punkt ist .CutCopyMode nicht Null (entweder xlCopy oder xlCut) und eine Beziehung zwischen nachfolgenden Einfügevorgängen und sowohl der Office-Zwischenablage als auch der Windows-Zwischenablage besteht darin, dass sie den Inhalt der Quelle beibehalten.

Wenn Sie gewählt zu schneiden (aka bewegen) die Zellen unmittelbar nach dem Einfügen (Strg + V), um die Zellen an eine neue Position .CutCopyMode falsch wird und Sie verlieren die ‚tanzen Grenze‘ um die Quelle. Dies liegt daran, dass in den Quellzellen kein Inhalt mehr vorhanden ist. Der Inhalt bleibt über die Office-Zwischenablage verfügbar, wird jedoch aus der Windows-Zwischenablage entfernt.

Wenn Sie ausgewählt haben, die Zellen zu kopieren, können Sie die Zellen an einem zusätzlichen Ort einfügen und die "tanzende Grenze" bleibt erhalten. Die .CutCopyMode-Eigenschaft bleibt ungleich Null (z. B. XLCopy). Sie können zu einem anderen Speicherort wechseln und denselben Inhalt einfügen. .CutCopyMode bleibt ungleich Null und der "tanzende Rand" um den ursprünglichen Inhalt besteht ebenso wie die Beziehung zur Office-Zwischenablage und der Windows-Zwischenablage.

Wenn Sie an dieser Stelle VBA-Code ausgeführt haben, der Application.CutCopyMode = False enthielt, würde der tanzende Rahmen verschwinden und die Verbindung zwischen jedem Einfügen-Vorgang und der Office-Zwischenablage würde beseitigt. Dies ist ein guter Zustand, wenn Sie eine VBA-Unterprozedur einleiten, so dass ein möglicher Copy/Paste-Vorgang innerhalb des Codes möglicherweise nicht mit dem .CutCopyMode-Status in Konflikt geraten kann. Dies sollte jedoch nur unter besonderen Umständen notwendig sein (siehe nächster Absatz).

Bestimmte Excel-Vorgänge sind ausreichend, um diese Office-Zwischenablageverbindung zu unterbrechen und .CutCopyMode auf False zu erzwingen. Eine davon ist das manuelle Initiieren einer Makrounterprozedur, so dass es einen begrenzten Nutzen gibt, Application.CutCopyMode = False am Anfang Ihres Codes einzubeziehen. Es kann jedoch ratsam sein, innerhalb Ihres Codes zu laufen, wenn Ihr Code eine Operation Range.Copy initiiert hat und Sie alle Operationen Worksheet.Paste method oder Range.PasteSpecial method mit dem Inhalt der Kopie abgeschlossen haben.

Untersuchen und Berichten des aktuellen Status des .CutCopyMode kann mit einigen Arbeitsblatt-Ereignismakro-Code durchgeführt werden.

Die dem VBE-Direktfenster angezeigten Ergebnisse sind entweder Kopiermodus, Schnittmodus oder AUS. Anwendung.CutCopyMode meldet seinen Status niemals direkt als True².

Während Sie eine Änderung in der Betriebsumgebung mit Application.CutCopyMode = False bewirken kann, habe ich nie in der Lage gewesen .CutCopyMode Auf durch Setzen der Eigenschaft auf True zu drehen. Es wird kein Fehler ausgegeben und die offizielle Dokumentation besagt ausdrücklich, dass die Eigenschaft auf True gesetzt wird. "Startet den Ausschneide- oder Kopiermodus und zeigt den beweglichen Rand an." aber ich habe herausgefunden, dass der einzige Weg, um die "Marschameisen" zurück zu bekommen, ein weiterer Kopiervorgang ist.

Also für alle Absichten und Zwecke, Codierung Application.CutCopyMode = True tut nicht schaden. Die Codierung Application.CutCopyMode = False kann jedoch etwas Gutes bewirken, indem der Zwischenablage-Speicher freigegeben wird.

Wenn jemand kann die Marsch Ameisen wieder einschalten, indem Sie die Application.CutCopyMode property manipulieren, würde ich lieb lieben, ein Beispiel zu sehen.


¹ Die ‚tanzen Grenze‘ umgangssprachlich auch als ‚marschierende Ameisen‘ bekannt ist. ² Während ein boolescher Wert von True oder False ein unterschiedlicher Typ ist, ist False für alle Absichten und Zwecke gleich Null und alles, was nicht False ist, ist True. Wenn Boolean ► number aufgelöst wird, ist ein VBA False 0 und True ist immer gleich (-1), aber wenn die Umkehrzahl aufgelöst wird, wird eine beliebige Zahl ungleich 0 als True und eine Null als False betrachtet.

+0

Ich hatte keine Ahnung, dass ich so lange auf diese Frage/Erklärung gewartet habe. Super schreiben! * double thumbs up * – BruceWayne

+2

Ich denke, es ist nur ein Dokumentationsfehler. Während jeder der möglichen Zustände {-1,0,1,2} gelesen werden kann, kann nur {0} in die Eigenschaft geschrieben werden. Jeder numerische Wert wird beim Schreiben in die Eigenschaft auf Null gesetzt. Dies scheint vernünftig, denn jedes Mal, wenn die Ameisen ausgeschaltet sind, wurde das OCB geschrubbt. Das erneute Animieren der Tierchen würde die Benutzeroberfläche in einem mehrdeutigen Zustand belassen, was darauf hindeutet, dass ein Einfügen möglich ist, dies aber nicht ist, da das OCB leer ist. Dieses Design macht Sinn, die Dokumentation nicht. –

+0

Sie haben zu viel Zeit auf Ihren Händen = P Ich bin neugierig. Wie viel Optimierung bringt das? Wie viele Kopien/Pasten braucht es, um einen spürbaren Unterschied zu reflektieren? – findwindow

Verwandte Themen