2015-11-20 13 views
6

Per ottimizzare il mio codice, spengo diverse proprietà Application Object member; uno in particolare è lo .CutCopyMode property.Devo riattivare .CutCopyMode prima di uscire dalla mia sottoprocedura?

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

    ' lots of code here 

occorre rivolgersi .CutCopyMode spalle (per esempio True) di nuovo con gli altri prima i miei sub finiture?

' lots of code here 

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

Perché il tag [excel-2010]? – pnuts

+1

@pnuts - Oltre [excel-2010] essendo lo * di fatto standard * con cui indico tutti i miei contributi, volevo evitare l'associazione diretta con il comportamento degli appunti di Office pre-xl2007 che non ho testato direttamente. – Jeeped

+0

@Jeeped Ho visto un sacco di 'Application.Calculation = xlCalculationManual'-'Application.Calculation = xlCalculationAutomatic' wraps, è utile? E nel caso in cui aggiungo formule, devo attivare un evento per attivarle? –

risposta

8

La risposta breve è che Application.CutCopyMode = True o non fa niente affatto o lo fa il contrario di ciò che si pensa che fa. Se lo stato corrente di .CutCopyMode è False, impostarlo su True non attiva il "bordo di danza" e se lo stato corrente è xlCopy o xlCut (XlCutCopyMode Enumeration constants), l'impostazione di .CutCopyMode su True lo spegne. Inoltre, non è possibile impostare .CutCopyMode su xlCopy o xlCut.

La lunga storia inizia con la comprensione di quale sia lo scopo del Application.CutCopyMode property e di come la documentazione ufficiale errata implichi che è possibile riattivarla.

Quando si tagliano manualmente (Ctrl + X) o si copia (Ctrl + C) una o più celle del foglio di lavoro, le celle acquisiscono un 'bordo di danza'¹ che indica la fonte dell'operazione. A questo punto, .CutCopyMode è diverso da zero (xlCopy o xlCut) e esiste una relazione tra le operazioni di incolla successive e gli Appunti di Office e gli Appunti di Windows in quanto mantengono il contenuto dell'origine.

Se si è scelto di tagliare (aka mossa) le cellule, subito dopo aver incollato (Ctrl + V) le cellule in una nuova posizione .CutCopyMode diventa falso e si perde la 'border balla' intorno alla sorgente. Questo perché non è rimasto alcun contenuto nelle celle di origine. Il contenuto rimane accessibile dagli Appunti di Office ma viene rimosso dagli Appunti di Windows.

Se si è scelto di copiare le celle, è possibile incollare le celle in una posizione aggiuntiva e il "bordo di danza" rimane. La proprietà .CutCopyMode rimane diversa da zero (ad esempio xlCopy). Puoi spostarti in un'altra posizione e incollare lo stesso contenuto; .CutCopyMode rimane diverso da zero e il "bordo danzante" attorno al contenuto originale persiste così come la relazione con gli appunti di Office e gli Appunti di Windows.

Se si eseguiva il codice VBA che includeva Application.CutCopyMode = False a questo punto, il bordo di danza scompariva e la connessione tra qualsiasi operazione di incolla e gli Appunti di Office veniva eliminata. Si tratta di uno stato valido per l'avvio di una sottosezione VBA in modo che qualsiasi potenziale operazione di copia/incolla all'interno del codice non possa potenzialmente entrare in conflitto con lo stato di .CutCopyMode. Tuttavia, questo dovrebbe essere necessario solo in circostanze particolari (vedi il prossimo paragrafo).

Alcune operazioni di Excel sono sufficienti per interrompere questa connessione negli Appunti di Office e forzare .CutCopyMode su False. Uno di questi è l'avvio manuale di una procedura sub macro in modo che vi sia un beneficio limitato per includere Application.CutCopyMode = False all'inizio del codice. Tuttavia, potrebbe essere prudente eseguire il codice se il codice ha avviato un'operazione Range.Copy e sono state completate le operazioni Worksheet.Paste method o Range.PasteSpecial method con il contenuto della copia.

L'esame e la segnalazione dello stato corrente di .CutCopyMode possono essere eseguiti con un codice macro di eventi del foglio di lavoro.

I risultati riportati nella finestra Immediata del VBE saranno sia Modalità copia, Modalità taglio o OFF. Applicazione.CutCopyMode non riporterà mai direttamente il suo stato come True².

Mentre è possibile effettuare un cambiamento nell'ambiente operativo con Application.CutCopyMode = False, non sono mai stato in grado di trasformare .CutCopyMode Su impostando la proprietà su True. Nessun errore viene generato e la documentazione ufficiale specifica specificamente che l'impostazione della proprietà su True "Avvia la modalità Taglia o Copia e mostra il bordo in movimento." ma ho trovato che l'unico modo per recuperare le "formiche in marcia" è iniziare un'altra operazione di copia.

Quindi, a tutti gli effetti, la codifica Application.CutCopyMode = True non danneggia. Tuttavia, la codifica dello Application.CutCopyMode = False può essere utile abbandonando la memorizzazione degli appunti.

Se qualcuno può riattivare le formiche in marcia manipolando il Application.CutCopyMode property, mi piacerebbe molto vedere un esempio.


¹ Il 'border ballare' è anche conosciuto colloquialmente come 'formiche in marcia'. ² Mentre un valore booleano di Vero o Falso è un tipo distinto, a tutti gli effetti False è uguale a zero e tutto ciò che non è False è Vero. Se si risolve il numero ► booleano, un VBA False è 0 e True è sempre uguale a (-1) ma se si risolve il numero inverso ► booleano qualsiasi numero diverso da zero viene considerato Vero e uno zero è considerato Falso.

+0

Non avevo idea che stavo aspettando così tanto tempo per questa domanda/spiegazione. Impressionante scrivi! * doppio pollice in su * – BruceWayne

+2

Penso che sia solo un errore di documentazione. Mentre uno qualsiasi degli stati possibili {-1,0,1,2} può essere letto, solo {0} può essere scritto nella proprietà. Qualsiasi valore numerico viene forzato a zero durante la scrittura sulla proprietà. Questo sembra ragionevole, dal momento che tutte le volte che le formiche sono spente, l'OCB è stato rimosso. Animare nuovamente i critters lascerebbe l'interfaccia utente in uno stato ambiguo, suggerendo che è possibile un incolla, ma non lo è, poiché l'OCB è vuoto. Questo design ha senso, la documentazione no. –

+0

Hai troppo tempo a disposizione = P Sono curioso. Quanto ottimizza questo rendimento? Quante copie/incolla ci vuole per riflettere una differenza notevole? – findwindow

Problemi correlati