[RESUELTO] Hacer macro mas "elegante"

Discute sobre la aplicación de hojas de cálculo

[RESUELTO] Hacer macro mas "elegante"

Notapor davidmuma » Mié Feb 17, 2010 10:04 am

Hola a todos, basicamente tengo esta macro creada, que lo que hace es copiar un rango de celdas a otra hoja y ordenarlas por una lista previamente creada. Mi pregunta es si se puede hacer de una forma mas elegante, sin necesidad de ir haciendo saltos de hoja. Muchas gracias


Código: Seleccionar todo   Expandir vistaContraer vista
sub ORDENAR
rem define variables
dim document   as object
dim dispatcher as object

rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "Nr"
args1(0).Value = 5

dispatcher.executeDispatch(document, ".uno:JumpToTable", "", 0, args1())

dim args2(0) as new com.sun.star.beans.PropertyValue
args2(0).Name = "ToPoint"
args2(0).Value = "$A$1:$J$336"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args2())

dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())

dim args4(0) as new com.sun.star.beans.PropertyValue
args4(0).Name = "Nr"
args4(0).Value = 3

dispatcher.executeDispatch(document, ".uno:JumpToTable", "", 0, args4())

dim args5(5) as new com.sun.star.beans.PropertyValue
args5(0).Name = "Flags"
args5(0).Value = "SVDNT"
args5(1).Name = "FormulaCommand"
args5(1).Value = 0
args5(2).Name = "SkipEmptyCells"
args5(2).Value = false
args5(3).Name = "Transpose"
args5(3).Value = false
args5(4).Name = "AsLink"
args5(4).Value = false
args5(5).Name = "MoveMode"
args5(5).Value = 4

dispatcher.executeDispatch(document, ".uno:InsertContents", "", 0, args5())

dim args6(8) as new com.sun.star.beans.PropertyValue
args6(0).Name = "ByRows"
args6(0).Value = true
args6(1).Name = "HasHeader"
args6(1).Value = false
args6(2).Name = "CaseSensitive"
args6(2).Value = false
args6(3).Name = "IncludeAttribs"
args6(3).Value = true
args6(4).Name = "UserDefIndex"
args6(4).Value = 5
args6(5).Name = "Col1"
args6(5).Value = 10
args6(6).Name = "Ascending1"
args6(6).Value = true
args6(7).Name = "Col2"
args6(7).Value = 9
args6(8).Name = "Ascending2"
args6(8).Value = true

dispatcher.executeDispatch(document, ".uno:DataSort", "", 0, args6())

dim args7(0) as new com.sun.star.beans.PropertyValue
args7(0).Name = "Nr"
args7(0).Value = 1

dispatcher.executeDispatch(document, ".uno:JumpToTable", "", 0, args7())

end sub
Última edición por davidmuma el Jue Feb 25, 2010 1:20 pm, editado 1 vez en total
OpenOffice 3.2.0 en Windows 2000
davidmuma
 
Mensajes: 16
Registrado: Mié Ene 13, 2010 6:50 pm

Re: Hacer macro mas "elegante"

Notapor mauricio » Mié Feb 17, 2010 10:26 pm

Hola...

Prueba el siguiente código:
Código: Seleccionar todo   Expandir vistaContraer vista
Sub Ordenar2()
Dim oHojaActiva As Object
Dim oOrigen As Object
Dim oDestino As Object
Dim mCamposOrden(1) As New com.sun.star.table.TableSortField
Dim mDescriptorOrden()

   oHojaActiva = ThisComponent.getCurrentController().getActiveSheet()
   oOrigen = ThisComponent.getSheets.getByName("Hoja5").getCellRangeByName( "A1:J336" )
   oDestino = ThisComponent.getSheets.getByName("Hoja3").getCellRangeByName( "A1" )
   oHojaActiva.copyRange( oDestino.getCellAddress(), oOrigen.getRangeAddress() )
   
   oDestino = ThisComponent.getSheets.getByName("Hoja3").getCellRangeByName( "A1:J336" )
   mDescriptorOrden = oDestino.createSortDescriptor()
   
   mCamposOrden(0).Field = 9
   mCamposOrden(0).IsAscending = True
   mCamposOrden(0).IsCaseSensitive = False
   mCamposOrden(0).FieldType = com.sun.star.table.TableSortFieldType.AUTOMATIC

   mCamposOrden(1).Field = 8
   mCamposOrden(1).IsAscending = True
   mCamposOrden(1).IsCaseSensitive = False
   mCamposOrden(1).FieldType = com.sun.star.table.TableSortFieldType.AUTOMATIC
   
   mDescriptorOrden(1).Name = "ContainsHeader"
   mDescriptorOrden(1).Value = False
   mDescriptorOrden(3).Name = "SortFields"
   mDescriptorOrden(3).Value = mCamposOrden

   oDestino.sort( mDescriptorOrden )
End Sub

Reemplaza el nombre de las hojas de origen y destino
Código: Seleccionar todo   Expandir vistaContraer vista
getByName("Hoja5")
getByName("Hoja3")

Si prefieres usar la posición de la hoja usas:
Código: Seleccionar todo   Expandir vistaContraer vista
   oOrigen = ThisComponent.getSheets.getByIndex(4).getCellRangeByName( "A1:J336" )
   oDestino = ThisComponent.getSheets.getByindex(2).getCellRangeByName( "A1" )


Verifica si es lo que quieres y si es así, por favor, editar el título de tu primer mensaje para agregarle al inicio [RESUELTO] de este modo tenemos foros más ordenados. Gracias

Saludos
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Avatar de Usuario
mauricio
 
Mensajes: 5991
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX

Re: Hacer macro mas "elegante"

Notapor davidmuma » Jue Feb 18, 2010 1:50 pm

Lo siento no me explique bien, las celdas contienes formulas, y yo solo quiero copiar el texto o el numero que contiene cada celda.
Gracias
OpenOffice 3.2.0 en Windows 2000
davidmuma
 
Mensajes: 16
Registrado: Mié Ene 13, 2010 6:50 pm

Re: Hacer macro mas "elegante"

Notapor mauricio » Jue Feb 18, 2010 8:07 pm

Hola...

Código: Seleccionar todo   Expandir vistaContraer vista
Option Explicit

Sub Ordenar2()
Dim oOrigen As Object
Dim oDestino As Object
Dim mCamposOrden(1) As New com.sun.star.table.TableSortField
Dim mDescriptorOrden()

   'El rango origen y destino DEBEN ser del mismo tamaño
    oOrigen = ThisComponent.getSheets.getByName("Hoja5").getCellRangeByName( "A1:J336" )
    oDestino = ThisComponent.getSheets.getByName("Hoja3").getCellRangeByName( "A1:J336" )
   oDestino.setDataArray( oOrigen.getDataArray() )
       
    mDescriptorOrden = oDestino.createSortDescriptor()
       
    mCamposOrden(0).Field = 9
    mCamposOrden(0).IsAscending = True
    mCamposOrden(0).IsCaseSensitive = False
    mCamposOrden(0).FieldType = com.sun.star.table.TableSortFieldType.AUTOMATIC

    mCamposOrden(1).Field = 8
    mCamposOrden(1).IsAscending = True
    mCamposOrden(1).IsCaseSensitive = False
    mCamposOrden(1).FieldType = com.sun.star.table.TableSortFieldType.AUTOMATIC
       
    mDescriptorOrden(1).Name = "ContainsHeader"
    mDescriptorOrden(1).Value = False
    mDescriptorOrden(3).Name = "SortFields"
    mDescriptorOrden(3).Value = mCamposOrden

    oDestino.sort( mDescriptorOrden )
End Sub


Saludos
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Avatar de Usuario
mauricio
 
Mensajes: 5991
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX

Re: Hacer macro mas "elegante"

Notapor davidmuma » Jue Feb 25, 2010 1:20 pm

Gracias, me fue de gran ayuda
OpenOffice 3.2.0 en Windows 2000
davidmuma
 
Mensajes: 16
Registrado: Mié Ene 13, 2010 6:50 pm


Volver a Calc

¿Quién está conectado?

Usuarios navegando por este Foro: Google [Bot] y 3 invitados