2011-12-19 12 views
5

Sto cercando di risolvere un problema relativamente semplice ma non riesco a realizzarlo. Il mio obiettivo è copiare un intervallo di celle in un foglio di lavoro dell'Applicazione Excel principale in un altro intervallo (della stessa dimensione) in un foglio di lavoro di una seconda applicazione Excel appena creata. Creo la seconda applicazione utilizzandoVB: copia un intervallo in un'altra applicazione Excel

Set secondExApp = CreateObject("Excel.Application") 

Sto usando questo riferimento per ulteriori informazioni. Fino ad ora ho provato due modi diversi. Entrambi non funzionano correttamente.

0 .: Preparazione/Introduzione

Set srcWb = Application.ActiveWorkbook 
Set srcSheet = srcWb.Worksheets("example") 

Set dstApp = CreateObject("Excel.Application") 
Set dstWb = dstApp.Workbooks(1) 
Set dstSheet = dstWb.Worksheets(1) 

1 .: PasteSpecial - l'immagine è invece di gamma

srcSheet.Range("A1:B2").Copy 
dstSheet.Range("A1:B2").PasteSpecial xlPasteAll 

2 .: Range.Copy [Destinazione (!) ] - non funziona - È giusto che io possa usare questo metodo solo per i fogli nella stessa applicazione?

srcSheet.Range(srcSheet.Cells(..., ...), srcSheet.Cells(..., ...)).Copy _ 
dstSheet.Range(dstSheet.Cells(..., ...), dstSheet.Cells(..., ...)) 

Qualsiasi aiuto è apprezzato.


Edit: Ho già giocato con la funzionalità "record di macro", ma io preferisco la codifica per conto mio senza "selezione" o "l'attivazione di" cellule/fogli/ecc


Edit (risolto): Grazie sia GSerg e iDevlop molto, consegnato un buon un'ulteriore punto di partenza per me. Ho fatto qualche ricerca per quanto riguarda le costanti di Excel come xlClipboardFormatDspText.

Ciò che mi ha veramente aiutato è il fatto che l'apertura di una nuova istanza di Excel cambia il menu Incolla (speciale).

Così invece di creare una nuova istanza ora aggiungo semplicemente una cartella di lavoro (che può essere nascosta) e uso questo oggetto per aggiungere il mio contenuto. Dato che è tenuto nella stessa istanza (anche dare un'occhiata al task manager) il menu Incolla (Speciale) è completamente lo stesso.

Ora è possibile utilizzare Range.Copy [destinazione] anche senza selezionare!

Risultato:

'Hides the new workbook 
Application.ScreenUpdating = False 

Set dstWb = Workbooks.Add 
Set dstSheet = dstWb.Worksheets(1) 

srcSheet.Range(srcSheet.Cells(..., ...), srcSheet.Cells(..., ...)).Copy 
dstSheet.Paste dstSheet.Range(dstSheet.Cells(..., ...), dstSheet.Cells(..., ...)) 

'Avoids the often seen dashed border around the copied range 
Application.CutCopyMode = False 

'Setting the initial change back 
Application.ScreenUpdating = True 

Software: Excel 2007

+0

Perché utilizzare una seconda app Excel invece di un'altra cartella di lavoro nella stessa istanza di Excel? L'unico bonus che posso vedere è quello di sfruttare il processore dual core per calcoli enormi. Ma è più lento se non ne hai bisogno. –

+0

@iDevlop Che strano. Ho appena letto il tuo commento dopo che ho scoperto su me stesso. Commento molto utile! – Mic

risposta

4

Come determinato dal frugando Excel con un bastone, è necessario utilizzare Worksheet.Paste per l'inter-excel roba:

srcSheet.Range("A1:B2").Copy 
dstSheet.Paste dstSheet.Range("A1") 

Poking Excel con un bastone più spessa ha rivelato che le formule vengono preservati quando si incolla dagli Appunti come xlClipboardFormatDspText:

srcSheet.Range("A1:B2").Copy 
dstSheet.Range("A1").Select 
dstSheet.PasteSpecial xlClipboardFormatDspText, False 

Tuttavia, questo richiede la selezione di un cellulare su dstSheet primo luogo, perché Worksheet.PasteSpecial usa cella attiva.

+0

Grazie, GSerg! Funziona bene, tranne per il fatto che ** le formule ** non vengono trasmesse. C'è un modo per includere le formule? E perché il metodo PasteSpecial non funziona? – Mic

+0

@Mic Funziona, ma non usa il formato che desideri. Vedi la mia modifica. – GSerg

+0

@Mic Ok, un'altra modifica. Sembra funzionare. – GSerg

Problemi correlati