Macro de Filtro Avançado no Calc

.

Olá, Pessoal!

Já pesquisei aqui digitando “filtro” e “avançado”, sem obter o êxito de que preciso.

Estou querendo usar a ferramenta Macro para realizar um Filtro Avançado de critérios em J2:J3 e na própria tabela de intervalo A4:J20.

Eu tentei, seguindo os seguintes passos:

1º) Fui em Ferramentas → Macros → Gravar macro (habilitei em Ferramentas->Opções->LibreOffice->Avançado);

2º) Selecionei o intervalo A4:J20;

3º) Acionei as teclas de atalho Alt+D+F+F+A;

4º) Em “Ler os critérios de filtragem de”, selecionei os dados no intervalo J2:J3 e cliquei em OK; e

5º) Por fim, parei a gravação da macro, gravando no Módulo1 como “FiltrarDPs”.

Ao selecionar o intervalo A4:J20 e pedir para mostrar linhas (em Formatar->Linha->Mostrar),
nada acontece se tentar executar a macro gravada. Apenas seleciona o intervalo A4:J20, apesar de ter mostrado o resultado esperado antes de interromper a gravação da macro.

Seguem abaixo a macro gravada e o arquivo-modelo:

sub FiltrarDPs
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"
args1(0).Value = "$'PLANILHA ÚNICA'.$A$4:$J$20"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())

rem ----------------------------------------------------------------------
rem dispatcher.executeDispatch(document, ".uno:DataFilterSpecialFilter", "", 0, Array())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:FilterExecute", "", 0, Array())


end sub

Macro do filtro avançado

Grato pela atenção!

Orlando Souza

Boa noite,


Respondi uma questão sobre macro de filtro avançado poucos dias atrás. Dê uma olhada:

Edição2: Limpar código e acrescentar “RemoverFiltros”

Olá,

Entendi que você precisa que o filtro aconteça sobre o intervalo com dados de origem. Para isso, precisamos suprimir as popriedades “CopyOutput” e “OutputPosicion” para que o fitro avançado volte ao seu comportamento padrão e filtre sobre o intervalo de origem sem eliminar dados.

O código, então, ficaria:

Sub FiltroAvancado
Dim oDoc As Object, oPlan1 As Object
Dim oIntervalo As Object, oCriterios As Object
Dim oFiltro As Object

   oDoc = ThisComponent
   oPlan1 = oDoc.Sheets.getByName( "PLANILHA ÚNICA" )

   oIntervalo = oPlan1.getCellRangeByName( "A4:J1000000" )
   oCriterios = oPlan1.getCellRangeByName( "J2:J3" )

   oFiltro = oCriterios.createFilterDescriptorByObject( oIntervalo )
   oFiltro.ContainsHeader = True

   'Filtrar'
   oIntervalo.Filter( oFiltro )
End Sub

**Completando:** para o "limpar" qualquer filtro:
Sub RemoverFiltros
Dim oDoc As Object, oPlan1 As Object
Dim oFiltroVazio As Object

   oDoc = ThisComponent
   oPlan1 = oDoc.Sheets.getByName( "PLANILHA ÚNICA" )
   
   oFiltroVazio = oPlan1.createFilterDescriptor( True )
   oPlan1.Filter( oFiltroVazio )
End Sub

Atte,

.

Oi, Grafeno!

Eu vi, mas o código só filtra executando várias vezes, além de eliminar as linhas ocultas. Como segue:

Sub FiltroAvancado
Dim oDoc As Object, oPlanAtiva As Object, oPlan1 As Object
Dim oIntervalo As Object, oCriterios As Object
Dim oDestino As Object, oFiltro As Object

   oDoc = ThisComponent
   oPlanAtiva = oDoc.CurrentController.ActiveSheet
   oPlan1 = oDoc.Sheets.getByName( "PLANILHA ÚNICA" )

(continua…)

(…continuação)

   oIntervalo = oPlan1.getCellRangeByName( "A4:J1000000" )
   oCriterios = oPlanAtiva.getCellRangeByName( "J2:J3" )
   oDestino = oPlanAtiva.getCellRangeByName( "A4" )

   oFiltro = oCriterios.createFilterDescriptorByObject( oIntervalo )
   oFiltro.CopyOutputData = True
   oFiltro.OutputPosition = oDestino.CellAddress
   oFiltro.ContainsHeader = True

   'Filtrar'
   oIntervalo.Filter( oFiltro )
End Sub

@Orlando, veja a edição da minha resposta. Atte,

.

\o/ perfeito, @Grafeno !

Antes de marcar a sua resposta, conhece outro código para retornar as linhas ocultas por esse filtro na tabela?

obrigado!!

Ok,@Orlando, acrescentei uma macro para limpar o filtro.

.

Ficou ótimo, @Grafeno!!

Mais uma vez, muito obrigado!! :smiley:

.

Resolvi depois deixar Autofiltros nos rótulos das colunas, colocando no final dessa macro as instruções abaixo:

document = ThisComponent.CurrentController.Frame

dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ---------------------
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"
args1(0).Value = "$PLANILHA ÚNICA.$A$4:$I$4"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())

rem --------------------
dispatcher.executeDispatch(document, ".uno:DataFilterAutoFilter", "", 0, Array())