Ordenar array alfabeticamente

Desarrollo de Macros y programación en UNO, usar las API, llamar programas externos...
Avatar de Usuario
JoePublic
Mensajes: 36
Registrado: Dom Sep 06, 2020 5:34 pm

Ordenar array alfabeticamente

Mensaje por JoePublic »

Hola,
Me gustaria poder almacenar una tabla en un array matriz bidimensional y ordenar alfabeticamente el array de forma ascendente por una columna.
Es posible hacer eso utilizando los recursos y/o funciones nativas que tiene Calc?

He visto que Calc tiene funciones nativas y le puedes pasar el rango en forma de array a la funcion y te devuelve el valor que necesitas y me pregunto si existe alguna funcion nativa para ordenar en orden alfabetico. Vean el ejemplo macro "Sub numeroMayor" donde se ve

Código: Seleccionar todo

oCellRange = oSheet.getCellRangeByName("A2:A12")
	arg = Array(oCellRange)
	ElMayor = serFun.callFunction("Max",arg)
	Print ElMayor

De momento solo he encontrato este macro que funciona y ordena la tabla de la Hoja1 alfabeticamente.
A mi me gustaria pasar mi array myTableArray() como parametro a la "Function ordenaDatos_Por1Columna"
para que estas funciones nativas ordenaran el array alfabeticamente sin ordenar el rango de la tabla de la Hoja1 al mismo tiempo.
algo como esto:
'*** Ordenamos con los parámetros establecidos en la funcion "ordenaDatos_Por1Columna"
Rango.Sort(DescriptorOrden()) 'Este funciona.
'miArray().Sort(DescriptorOrden()) 'Este no funciona, pero seria posible pasar el array de algun modo por ejemplo asi ????
¿Se podria pasar el array matriz como Rango a alguna funcion nativa?. Solo pretendo ordenar alfabeticament un array para luego poblarlo (pegar sus valores) en otra hoja. He visto que en EXCEL existe una funcion nativa llamda ORDENARPOR, pero en Calc no la encuentro.

O ¿alguien sabe alguna manera de ordenar alfabeticamente un array con una macro simple?
Gracias.

Código: Seleccionar todo

Sub ordenar
'macro ordena array por una columna.
Dim oSheet as Object
Dim oCellRange as Object
Dim oRango as Object

	oSheet = ThisComponent.Sheets.getByName("Hoja1")
	oCellRange = oSheet.getCellRangeByName("A1:D12")
	'nom = oCellRange.Name()
	myTableArray = oCellRange.getDataArray()
	oRango = ordenaDatos_Por1Columna(oCellRange) 
	Print "Fin"
End Sub

'***********************************************************
Function ordenaDatos_Por1Columna(Rango as Object) as Object
'Ordena Alfabeticamente una tabla o rango de una hoja de calc

	Dim CamposOrden(0) As New com.sun.star.util.SortField 'El 0 equivale a que se ordena por 1 columna. El 1 a que se ordena por 2 columna y asi sucesivamente.
	Dim DescriptorOrden(1) As New com.sun.star.beans.PropertyValue 'No se lo que es.


	'Columna Coincidencias es la 1.
	CamposOrden(0).Field = 3 'Es la columna por la que se ordena.  El 0 es la primea, 1 es la segunda y asi sucesivamente.
	CamposOrden(0).SortAscending = True 'false si quieres que sea Descending  y True si quieres que sea Ascending
	CamposOrden(0).FieldType = com.sun.star.table.TableSortFieldType.ALPHANUMERIC
	
	'****** Configuració tabla o array y que tipo de orden quieres ***********
	DescriptorOrden(0).Name = "ContainsHeader"
	DescriptorOrden(0).Value = True 'con False No hay Cabecera o header. Poner True para cuando haya cabecera.
	DescriptorOrden(1).Name = "SortFields"
	DescriptorOrden(1).Value = CamposOrden()
	
	'*** Ordenamos con los parámetros establecidos
	Rango.Sort(DescriptorOrden()) 'Este funciona.
	'miArray().Sort(DescriptorOrden()) 'Este no funciona, pero seria posible pasar el array de algun modo por ejemplo asi ????
	
ordenaDatos_Por1Columna = Rango
End Function


'******************************************
Sub numeroMayor
'*** ejemplo Funcion nativa **************
'Nos dice cual es numero mayor dentro de un rango
'Pasamos el rango como array, pero tambien podemos pasarle un array unidimensional

	serFun = createUnoService("com.sun.star.sheet.FunctionAccess")
	oSheet = ThisComponent.Sheets.getByIndex(0)
	oCellRange = oSheet.getCellRangeByName("A2:A12")
	
	arg = Array(oCellRange)
	ElMayor = serFun.callFunction("Max",arg)  'El numero Maximo o mayor de una columna.
	Print ElMayor
End Sub
Ordenar_Alfabeticamente_Array.ods
El archivo contiene una Tabla con datos a ordenar por orden alfabetico.
(22.66 KiB) Descargado 96 veces
Usuario apasionado de las hojas de cálculo. Novato aprendiz de macros con OOo Basic y VBA.
LibreOffice Version: 6.4.3.2 (x64) y Sistema Operativo Windows 10 Home.
Responder