Necesito ayuda para convertir una macro vba a python. @elmau
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
Intenté convertir la macro de este tema del foro, logré convertir todas las funciones, excepto la función: filtrar_vacios
Macro para ordenar de mayor a menor quitando celdas sin valor - #4 by elmau
mi intento:
from com.sun.star.table import TableSortField
from com.sun.star.table.TableSortFieldType import AUTOMATIC
from com.sun.star.sheet import TableFilterField
def ordenar_y_filtrar():
CELDA_ORIGEN = 'A1'
doc = XSCRIPTCONTEXT.getDocument()
sheets = doc.Sheets
hoja = sheets[0]
celda = hoja[CELDA_ORIGEN]
rango = obtener_rango_datos(celda)
ordenar(rango, 8)
filtrar_vacios(rango, 8, True)
def obtener_rango_datos(celda):
sheet = celda.Spreadsheet
cursor = sheet.createCursorByRange(celda)
cursor.collapseToCurrentRegion()
rango = sheet[cursor.AbsoluteName]
return rango
def ordenar(rango, campo):
campos = TableSortField()
campos.Field = campo
campos.IsAscending = False
campos.IsCaseSensitive = False
campos.FieldType = AUTOMATIC
como_ordenar = rango.createSortDescriptor()
como_ordenar[1].Name = 'ContainsHeader'
como_ordenar[1].Value = True
como_ordenar[3].Name = 'SortFields'
como_ordenar[3].Value = uno.Any('[]com.sun.star.table.TableSortField', (campos,))
uno.invoke(rango, 'sort', (como_ordenar,))
def filtrar_vacios(rango, campo, son_numeros):
NOMBRE = 'datostmp'
doc = XSCRIPTCONTEXT.getDocument()
rangos = doc.DatabaseRanges
if rangos.hasByName(NOMBRE):
rangos.removeByName(NOMBRE)
rangos.addNewByName(NOMBRE, rango.RangeAddress)
data = rangos.getByName(NOMBRE)
data.AutoFilter = True
campos = TableFilterField()
campos.Field = campo
campos.Operator = com.sun.star.sheet.FilterOperator.EMPTY
campos.IsNumeric = son_numeros
como_filtrar = data.createFilterDescriptor(True)
como_filtrar.FilterFields = ((campos,))
data.filter(como_filtrar)
¡Como hacer eso! Gracias