2011-12-19 16 views
5

Estoy tratando de resolver un problema relativamente simple pero no me puedo dar cuenta. Mi objetivo es copiar un rango de celdas en una hoja de trabajo de la aplicación principal de Excel a otro rango (del mismo tamaño) en una hoja de trabajo de una segunda aplicación de Excel recién creada. Creo la segunda aplicación usandoVB: Copie un rango a otra aplicación de Excel

Set secondExApp = CreateObject("Excel.Application") 

Estoy usando esta referencia para un manejo posterior. Hasta ahora lo he intentado de dos maneras diferentes. Ambos no funcionan correctamente.

0 .: Preparación/Introducción

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 - ofrece una imagen en lugar de sólo la gama

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

2 .: Range.Copy [Destino (!) ] - no funciona - ¿Es correcto que solo puedo usar este método para hojas en la misma aplicación?

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

Cualquier ayuda es apreciada.


Edición: Ya he jugado con la funcionalidad "Grabar macro" pero yo prefiero la codificación por mi cuenta sin "seleccionar" o "activación" células/hojas/etc


Editar (resuelto): Gracias a los dos GSerg y iDevlop mucho, que entregan un buen punto de partida más para mí. Investigué en cuanto a las constantes de Excel como xlClipboardFormatDspText.

Lo que realmente me ayudó fue el hecho de que la apertura de una nueva instancia de Excel cambia el menú Pegar (Especial).

Así que en lugar de crear una nueva instancia que ahora simplemente añadir un libro (que se puede ocultar) y utilizar este objeto para agregar el contenido de mi. Dado que se mantiene en la misma instancia (también eche un vistazo al administrador de tareas), el menú Pegar (Especial) es completamente el mismo.

Ahora es posible usar Range.Copy [destino] incluso sin seleccionar!

Resultado:

'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

¿Por qué utilizar una segunda aplicación de Excel en lugar de otro libro en la misma instancia de Excel? La única ventaja que puedo ver es aprovechar el procesador de doble núcleo para cálculos enormes. Pero es más lento si no necesitas eso. –

+0

@iDevlop Qué gracioso. Acabo de leer tu comentario después de que me enteré. ¡Muy útil comentario! – Mic

Respuesta

4

Según lo determinado por meter Excel con un palo, usted tiene que utilizar Worksheet.Paste para inter-excel cosas:

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

Empuje de Excel con un palo más grueso reveló que las fórmulas quedan conservados al pegar desde el portapapeles como xlClipboardFormatDspText:

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

Sin embargo, esto requiere la selección de una celda en dstSheet primero, porque Worksheet.PasteSpecial utiliza celda activa.

+0

Gracias GSerg! Esto funciona bien, excepto por el hecho de que ** formulas ** no se transmiten. ¿Hay alguna manera de incluir fórmulas? ¿Y por qué el método PasteSpecial no funciona? – Mic

+0

@Mic Funciona, pero no usa el formato que desea. Ver mi edición – GSerg

+0

@Mic Ok, otra edición. Parece funcionar. – GSerg

Cuestiones relacionadas