Pergunte aqui
1

Macro de Filtro Avançado no Calc

perguntadas 2017-02-28 22:55:06 +0100

imagem do gravatar de Orlando

updated 2017-05-24 18:46:58 +0100

imagem do gravatar de Grafeno

.

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

8)

editar alterar tag assinalar como ofensivo fechar mesclar Excluir

1 Resposta

2

respondidas 2017-02-28 23:31:20 +0100

imagem do gravatar de Grafeno

updated 2017-03-01 17:16:25 +0100

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,

editar assinalar como ofensivo Excluir Link mais

Comentários

.

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...)

imagem do gravatar de OrlandoOrlando ( 2017-03-01 01:28:03 +0100 )editar

(...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
imagem do gravatar de OrlandoOrlando ( 2017-03-01 01:29:27 +0100 )editar

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

imagem do gravatar de GrafenoGrafeno ( 2017-03-01 14:54:33 +0100 )editar

.

\o/ perfeito, @Grafeno !

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

obrigado!!

imagem do gravatar de OrlandoOrlando ( 2017-03-01 15:37:21 +0100 )editar

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

imagem do gravatar de GrafenoGrafeno ( 2017-03-01 17:37:12 +0100 )editar

.

Ficou ótimo, @Grafeno!!

Mais uma vez, muito obrigado!! :D

.

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

imagem do gravatar de OrlandoOrlando ( 2017-03-01 22:21:57 +0100 )editar

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())
imagem do gravatar de OrlandoOrlando ( 2017-03-01 22:27:35 +0100 )editar
Login/Registrar para responder

Ferramentas de perguntas

1 seguidor

Estatísticas

Perguntadas: 2017-02-28 22:55:06 +0100

Lidas: 160 vezes

Última atualização: Mar 01