[RESUELTO] Hacer macro mas "elegante"

Discute sobre la aplicación de hojas de cálculo
Responder
davidmuma
Mensajes: 16
Registrado: Mié Ene 13, 2010 6:50 pm

[RESUELTO] Hacer macro mas "elegante"

Mensaje por davidmuma »

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

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
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Hacer macro mas "elegante"

Mensaje por mauricio »

Hola...

Prueba el siguiente código:

Código: Seleccionar todo

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

getByName("Hoja5")
getByName("Hoja3")
Si prefieres usar la posición de la hoja usas:

Código: Seleccionar todo

	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
davidmuma
Mensajes: 16
Registrado: Mié Ene 13, 2010 6:50 pm

Re: Hacer macro mas "elegante"

Mensaje por davidmuma »

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
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Hacer macro mas "elegante"

Mensaje por mauricio »

Hola...

Código: Seleccionar todo

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
davidmuma
Mensajes: 16
Registrado: Mié Ene 13, 2010 6:50 pm

Re: Hacer macro mas "elegante"

Mensaje por davidmuma »

Gracias, me fue de gran ayuda
OpenOffice 3.2.0 en Windows 2000
Responder