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)