Ordem Natural Por Macro CALC

perguntadas 2021-04-29 23:55:37 +0200

imagem do gravatar de Jedison

updated 2021-04-30 00:08:38 +0200

Olá gurus. Eu utilizo em uma planilha o recurso de ORDEM NATURAL disponibilizado no CALC. Esse tipo de ordenação cria a seguinte Ordem, muito útil quando se trabalha com códigos (de mercadoria, de itens, contábeis, etc)

   121
    121.1
    121.1.1
    121.1.2
    121A.1
    121A.2
    122
1000.1.A
....

Porém, quando se quer usar esse tipo de ordem por meio de macros, o melhor que consegui criar foi esse código:

Sub OrdemNatural

Doc     = ThisComponent
' Cria Chave
'Plan   = Doc.CurrentController.ActiveSheet()
Plan    = Doc.Sheets.GetbyName("Crimes")
Cods    = Plan.GetCellRangeByName("A2:A816").getDataArray()
Bloco   = Plan.GetCellRangeByName("A1:D816")
' Insere a Chave na coluna adicional
For x = 0 to uBound(Cods)
    Plan.GetCellRangeByName("D"&4+x).value = CInt(Cods(x)(0))
Next

'Campos(x) = Serão usadas X colunas como Chaves
'SortDesc(x) = Serão estabelecidos 2 Parâmetros de Ordenação
Dim Campos(2) As New com.sun.star.util.SortField
Dim SortDesc(2) As New com.sun.star.beans.PropertyValue

' Primeira Chave (A chave criada = COLUNA D) - Ascendente 
 Campos(0).Field = 3
 Campos(0).SortAscending = True
' Segunda Chave - Código Humano (Coluna A)- Ascendente
 Campos(1).Field = 0
 Campos(1).SortAscending = True

' Parâmetros do Descritor
' Campos a considerar
 SortDesc(0).Name = "SortFields"
 SortDesc(0).Value = Campos()
' Contem cabeçalho
 SortDesc(1).Name = "ContainsHeader"
 SortDesc(1).Value = True

' Realizar Ordenação
 Bloco.Sort(SortDesc())

' Limpa Coluna da chave
Plan.GetCellRangeByName("D4:D" & x+3 ).ClearContents(1+4)

end sub

Ocorre que, assim, é necessário criar uma coluna adicional para que o Ordenador faça a filtragem numérica primeiro. Mas nesse caso, dependendo do número de dados que se está ordenando, ou do tamanho da planilha como um todo, o processo pode se tornar BEM demorado. Tentei, intuitivamente, um SortDesc(2).Name = "NaturalSort" mas não funcionou. Sei que usando as rotinas UNO dá pra fazer, e de fato fiz, mas daí o código fica um pouco poluído, e queria evitá-lo. Alguém tem uma solução, ou sabe se o recurso SORT() possui algum parâmetro para isso?

editar alterar tag assinalar como ofensivo fechar mesclar Excluir

Comentários

Ola @Jedison, tem algum arquivo para amostra dos dados.

imagem do gravatar de SchiavinattoSchiavinatto ( 2021-04-30 01:00:17 +0200 )editar