Macro para ordenar de mayor a menor quitando celdas sin valor

Estoy cambiando de excel a calc, y tengo problemas para grabar macros; tengo una hoja con 5 columnas y 450 filas, (que con mucho esfuerzo logré crear porque son un tipo reporte de datos de otra hoja con 25 columnas y 1800 filas y contando -.-), pero me he topado con que no puedo crear una macro que haga lo siguiente:

  1. filtre los datos de columna D y no muestre las filas vacías
  2. luego, filtre de mayor a menor los datos de la columna D
    talvez es una cuestión muy sencilla para quien maneja Basic pero ya llevo luchando con esto 10 meses pero hasta ahora no he logrado avances porque no entiendo muchas cosas. Agradezco mucho el mucho o poco apoyo que puedan darme.

¿Realmente necesitas una macro? A veces las cosas se hacen mejor sin macros:

  • Selecciona Datos > Filtro automático

  • Haz clic sobre la flecha que se muestra en la cabecera de la columna que quieres quitar las celdas vacías y desmarca la casilla de (vacío)

  • Haz clic sobre la flecha de la columna que quieres ordenar y selecciona el orden deseado (la columna puede ser la misma que antes)

Gracias por la pronta respuesta muy explicativa. La cuestión es que como indiqué al inicio, la macro la quiero para una hoja (hoja_reporte) cuyos datos vienen de otra hoja (hoja_db), y la macro me serviría para que cada vez que modifique datos en la hoja_db, con un solo click pueda actualizar los valores de la hoja_reporte. Actualmente uso la solución propuesta, pero tengo que volver aplicar el filtro cada vez que modifico, creo o elimino datos de la hoja_db porque el “filtro automático” no se actualiza automáticamente, y dado que tengo que hacerlo muchas veces considero que una macro sería muy útil.

El siguiente código hace exactamente como lo planteas.

He dividido el código en funciones y subrutinas para que fuera más claro y puedas reusarlas, por ejemplo, si cambia la columna a ordenar y filtrar.

Sub ordenar_y_filtrar()
	CELDA_ORIGEN = "A1"
	
	doc = ThisComponent
	hoja = doc.CurrentController.ActiveSheet
	
	celda = hoja.getCellRangeByName(CELDA_ORIGEN)
	rango = obtener_rango_datos(celda)
	
	ordenar(rango, 3)
	filtrar_vacios(rango, 3, True)
	
End Sub

Function obtener_rango_datos(celda)
	sheet = celda.SpreadSheet
	cursor = sheet.createCursorByRange(celda)
	cursor.collapseToCurrentRegion()
	rango = sheet.getCellRangeByName(cursor.AbsoluteName)
	obtener_rango_datos = rango
End Function 

Sub ordenar(rango, campo)
Dim campos (0) As New com.sun.star.table.TableSortField

    campos(0).Field = campo
    campos(0).IsAscending = False
    campos(0).IsCaseSensitive = False
	campos(0).FieldType = com.sun.star.table.TableSortFieldType.AUTOMATIC
     
	como_ordenar = rango.createSortDescriptor()	
	como_ordenar(1).Name = "ContainsHeader"
    como_ordenar(1).Value = True
    como_ordenar(3).Name = "SortFields"
    como_ordenar(3).Value = campos
     
    rango.sort(como_ordenar)
End Sub

Sub filtrar_vacios(rango, campo, son_numeros)
Dim campos(0) As New com.sun.star.sheet.TableFilterField

	NOMBRE = "datostmp"
	
	doc = ThisComponent
    rangos = doc.DataBaseRanges()
    If rangos.hasByName(NOMBRE) Then
    	rangos.removeByName(NOMBRE)
    End If
    
    rangos.addNewByName(NOMBRE, rango.RangeAddress)
    data = rangos.getByName(NOMBRE)    
    data.AutoFilter = True
    
	como_filtrar = data.getFilterDescriptor()
	
	campos(0).Field = campo
    campos(0).Operator = com.sun.star.sheet.FilterOperator.NOT_EMPTY
	campos(0).IsNumeric = son_numeros
	como_filtrar.FilterFields = campos
	
	data.refresh()
End Sub

Si los datos de la columna NO son números, usa:

filtrar_vacios(rango, 3, False)

Excelente! muchas gracias por el apoyo :+1: 5 estrellas :+1::+1::grin: