Hola Leonardo... El problema del primero método que usas es que como celda destino el método copyRange solo acepta la estructura de una celda
http://api.openoffice.org/docs/common/ref/com/sun/star/sheet/XCellRangeMovement.html#copyRange Pero haciendo el ciclo en las ocho filas no queda tan mal y no se tarda tanto, claro, depende el equipo donde lo ejecutes... hice pruebas copiando 100, 1000 y 10000, que se tardo 0, 1 y 13 segundos respectivamente... Sub CopiarRango1() Dim oHojaActual As Object Dim oRangoOrigen As Object Dim oRangoDestino As Object Dim co1 As Integer dim Inicio As Long 'Bloqueamos la actualizacion de la pantalla ThisComponent.LockControllers() 'Referencia a la hoja actual oHojaActual = ThisComponent.getCurrentController.getActiveSheet() 'Referencia al rango a copiar oRangoOrigen = oHojaActual.getCellRangeByName("C4:E4") For co1 = 7 To 14 'Referencia a la celda destino oRangoDestino = oHojaActual.getCellByPosition( 6, co1 ) 'Copiamos el rango oHojaActual.copyRange( oRangoDestino.getCellAddress() , oRangoOrigen.getRangeAddress() ) Next co1 'Desbloqueamos la actualizacion de pantalla ThisComponent.UnLockControllers() End Sub Puedes usar la interface XTransferableSupplier http://api.openoffice.org/docs/common/ref/com/sun/star/datatransfer/XTransferableSupplier.html Que si no me equivoco, hace uso del portapapeles, este método lo aprendí del compañero Ariel Este método es mucho más rápido, hice la prueba con 15,000 filas de destino y se tardo 1 segundo, pero en lo personal no me gusta, en código, seleccionar rangos como si se estuviera en la interfaz... Sub CopiarRango2() Dim oHojaActual As Object Dim oRangoOrigen As Object Dim oRangoDestino As Object Dim oDatos As Object ThisComponent.LockControllers() oHojaActual = ThisComponent.getCurrentController.getActiveSheet() oRangoOrigen = oHojaActual.getCellRangeByName("C4:E4") oRangoDestino = oHojaActual.getCellRangeByName("G8:I15") 'Seleccionamos el rango origen ThisComponent.getCurrentController.select( oRangoOrigen ) 'Obtenemos sus datos oDatos = ThisComponent.getCurrentController().getTransferable() 'Seleccionamos el destino ThisComponent.getCurrentController.select( oRangoDestino ) 'Insertamos los datos ThisComponent.getCurrentController().insertTransferable( oDatos ) ThisComponent.UnLockControllers() End Sub Haz tus pruebas y nos cuentas... Saludos a todos... Mauricio -----Mensaje original----- De: [EMAIL PROTECTED] en nombre de Leonardo Spaltro Enviado el: mar 24/06/2008 0:06 Para: [email protected] Asunto: [usr] OOo BASIC: copiar un rango y pegarlo en uno de mayor tamaño. Hola comunidad, nuevamente acudo a vuestra ayuda. Resuta que estoy intentando hacer en una macro lo que puedo hacer con el puntero del mouse pero no puedo conseguirlo. Ejemplo de lo que hago con el mouse: selecciono las celdas C4:E4, copio su contenido (el cual son fórmulas), selecciono las celdas G8:I15, pego su contenido. De esta forma lo que logro es -en un solo paso- copiar las formulas de las primeras celdas en todas las celdas de la segunda selección. Bueno, a lo mejor que llegué fue a esto: ---------------------------- CÓDIGO ------------------------------------------------------------------ Dim CopyRangoOrigen As New com.sun.star.table.CellRangeAddress Dim CopyRangoDestino As New com.sun.star.table.CellAddress For i = 1 to 8 CopyRangoOrigen.Sheet = 0 CopyRangoOrigen.StartColumn = 2 'Columna C CopyRangoOrigen.StartRow = 3 'Fila 4 CopyRangoOrigen.EndColumn = 4 'Columna E CopyRangoOrigen.EndRow = 3 'Fila 4 iProxLineaVacia = oHoja1.GetCellRangeByName("A1").Value 'En esta celda hay una fórmula que devuelve el número de la siguiente fila vacía. CopyRangoDestino.Sheet = 0 CopyRangoDestino.Column = 6 'Columna G CopyRangoDestino.Row = iProxLineaVacia 'Próxima fila vacía (suponemos que al inicio la condición se cumple en la fila 8) oHoja1.CopyRange(CopyRangoDestino, CopyRangoOrigen) Next ---------------------------------------------- FIN CÓDIGO -------------------------------------------------------------------- Es decir, acá lo que haría sería más o menos esto: selecciono el contenido de las celdas C4:E4, lo copio, selecciono la celda G8 y pego, y así 8 veces. En este ejemplo no hay demasiados problemas ya que el número de repeticiones no es tan elevado, pero se complica cuando estas repeticiones aumentan en gran cantidad. ¡¡Y ni que pensar si este proceso se debería volver a hacer en algún otro lugar del código!! También estuve analizando esto otro: -------------------------------- CÓDIGO ------------------------------------------ oRangoOrigen = oHoja1.getCellRangeByName( "C4:E4" ) oRangoDestino = oHoja1.getCellRangeByPosition( "G8:I15" ) oRangoDestino.setDataArray( oRangoOrigen.getDataArray() ) -------------------------------- FIN CÓDIGO ------------------------------------ Pero esto únicamente me permite copiar los datos en el mismo tamaño de rango que el origen, es decir, así como está, daría error. ¿Alguna sugerencia? Desde ya, muchas gracias. Leonardo.
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
