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]

Responder a