Ir ao conteúdo
  • Cadastre-se

Logica intuitiva para filtro


Ir à solução Resolvido por edcronos,

Posts recomendados

Ola,
Fiquei em duvida em onde colocar a pergunta, mas como tem a ver com estrutura

 

Estou fazendo um filtro em VBA que funciona como formulas com E, OU , >= , <= , = ,< , SE
no momento somente tem a estrutura de E e OU
No caso esse filtro vai funcionar como o select do SQL, trazendo apenas as informações pertinentes

 

Estrutura da planilha se assemelha a um Banco de Dados
Abas = BD
Setores = Tabelas "limitado em 10"
Colunas dos setores = colunas das tabelas
"Min=3 colunas [dados] (Mais colunas Fixas [ cod , data , 2 aux ] ), Max =500 colunas (não vi motivo para ter mais)"

 

para o E e o OU usei ":" e ";" como símbolos
no caso eu uso um userform com caixas de textos e combo box para escolher a aba e o setor que eu quero filtrar e para onde vai o resultado(qualquer setor da aba ativa)
exemplo
Ana:Saída:25;1200
vai retornar todas as linhas do setor escolhido que tenha( (Ana "E" Saída) "E" (25 "OU" 1200 ))
no excel seria =E("Ana";"Saída";Ou(25;1200))

 

agora vou refazer o filtro e deixar mais dinâmico e completo
Vou adicionar o uso de ( ) para separar conjuntos de regras

 

Pois bem,
Não tenho dificuldades para fazer as macros, mas...
Que tipo de simbologia usar e que tipo de estrutura usar para não criar conflito entre dados e comandos e ficar fácil de escrever e de entender ?

 

Pensei em usar
& para a aba
! para iniciar nomes de setores
# para ficar na frente de nomes de colunas
e virgula como separador padrão
algo como
&Controle,!Despesas, #Data, >= , 06/05/2015 : <= , 05/12/2015
filtraria todas as linha do setor Despesas da aba controle em que a coluna Data tivesse valor >= 06/05/2015 E <= 05/12/2015

 

Certo,
seria algo simples se fosse somente isso , mas eu quero colocar alguns comandos para valores fragmentados
tipo Filtrar dias da semana que o dia fosse um dia especifico
algo como @ para comandos
!Despesas, #Data,( @ Semana,1;2;3) : ( @ Dia,1;4;12;31)
não sei se ficaria legal e fácil de lembrar a estrutura

 

ainda tem os comandos de estrutura como coluna, linha e retorno

 

@ Se,( !Despesas, #Data,( @ Semana,1;2;3) : ( @ Dia,1;4;12;31) ), @ Lin ,!Renda
seria Se dia da semana for ( 1 ou 2 ou 3 ) E o dia for (1 ou 2 ou 12 ou 31) então retorne valor da mesma linha do setor renda

 

@ Se,( !Despesas, #Data, ( @ Semana,1;2) : ( @ Dia,1) : # Tipo, carro ), @ data , ! manutenção
retornaria a linha do setor manutenção que tivesse a mesma data carro aparece no setor despesas nos dias de semana 1 ou 2 e que o sia do mes fosse 1

 

a estrutura da macro eu já sei como fazer mas antes tenho que definir como fica a escrita das "Formulas"
o que eu coloquei aí em cima seria apenas uma ideia padrão sem nada definido ainda

 

para a macro eu não tenho duvidas uso arrays loops for next , if then, e funções e macros que já fiz

 

Se alguém que tenha base e que possa me ajudar nessa estruturação

 


Olha, qualquer ajuda é bem vinda,

 

o que eu não quero é ter que ficar remendando depois
pode parecer algo bobo mas eu sempre tenho problemas com isso, tudo que eu faço funciona e de maneira bem otimizada, mas acaba ficando uma bagunça só

Link para o comentário
Compartilhar em outros sites

Achar uma sintaxe que facilite está mais difícil do que eu imaginei

 

estou fazendo funções para quebrar a formula


estou mudando a sintaxe de acordo para facilitar

!Despesas ( @E ( #Data (@ E (@ Ou ( %Semana (1,2,3 ) ),@ Ou (% Dia(1,4,12,31 ))))

 

 

essa macro é apenas para teste e desenvolvimento das funções e ordem de execução

Sub testesdfsadf()    Dim Comandx As String, Aaaa As String    Aaaa = "!Despesas(@E(#Data(@E(@Ou(%Semana(1,2,3)),@Ou(%Dia(1,4,12,31))))"    MsgBox FormulaPart(Aaaa, 1)    Comandx = Left(Aaaa, 1)    If Comandx = "$" Then Nome_Plan = Mid(Aaaa, 2, Postring(Aaaa, "(", 1) - 2)    If Comandx = "!" Then Nome_Setor = Mid(Aaaa, 2, Postring(Aaaa, "(", 1) - 2)    If Comandx = "#" Then Nome_Coluna = Mid(Aaaa, 2, Postring(Aaaa, "(", 1) - 2)    If Comandx = "@" Then Nome_funcao = Mid(Aaaa, 2, Postring(Aaaa, "(", 1) - 2)End Sub

estou fazendo essa para quebrar a formula, mas a sintaxe da formula que está me quebrando

Public Function FormulaPart(ByVal FormulaX As String, ByVal OcorrenciaX As Long) As String   v = ContLetra(FormulaX, "(", ")")    FormulaPart = Left(FormulaX, Postring(FormulaX, ")", v))End Function

retorna quantidade de letras da frase com opção de contar até achar uma letra especifica

ContLetra("casa","a")

=2

ContLetra("casa de ferias","a","s")

=1

Public Function ContLetra(ByVal TextoX As String, ByVal LetraX As String, Optional ByVal Ate_Letrab As String) As Long    Dim pos As Long, Ax As Long, ltx As Long    ltx = Len(LetraX)    lty = Len(Ate_Letrab)    For Ax = 1 To Len(TextoX)        If LetraX = Mid(TextoX, Ax, ltx) Then pos = pos + 1        If Ate_Letrab = Mid(TextoX, Ax, lty) Then ContLetra = pos: Exit Function    Next    ContLetra = posEnd Function

   

função que retorna a posição de uma letra ou conjunto pela ocorrência

Postring("casa","a",2)

=4

Public Function Postring(ByVal TextoX As String, ByVal LetraX As String, ByVal OcorrenciaX As Long) As Long    Dim pos As Long, Ax As Long, ltx As Long    pos = 0    ltx = Len(LetraX)    For Ax = 1 To Len(TextoX)        If LetraX = Mid(TextoX, Ax, ltx) Then            pos = pos + 1            If pos = OcorrenciaX Then Postring = Ax: Exit Function        End If    Next    Postring = 0End Function

parece que para não complicar muito vou ter que colocar algumas coisas como obrigatórias

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

é , está brabo

pensei em deixar do  jeito que estava para E e ou

 

mas não acho uma maneira de quebrar a formula e que fique fácil executar por estágios corretos

 

 

função que  separa por estágios em uma array  que uso para o antigo e para outras coisas

Sub SplitVALArray(ByVal StringsVal As String, ByVal Separador As String, ByRef nomeArrayRetorno)    cotin = Split(StringsVal, Separador)    ReDim nomeArrayRetorno(1 To UBound(cotin) + 2)    For h = 0 To UBound(cotin)        v = cotin(h)        If IsNumeric(v) = True Then            nomeArrayRetorno(h + 1) = Val(v)        Else            nomeArrayRetorno(h + 1) = v        End If    NextEnd Sub
    Dim Comand()    Aaaa = "!Despesas(#Data(@E(@Ou(%Semana,1,2,3))(@Ou(%Dia,1,4,12,31)))))"    Call SplitVALArray(Aaaa, "(", Comand)

ficaria assim:

 

!Despesas --- #Data --- @E --- @Ou --- %Semana,1,2,3)) --- @Ou --- %Dia,1,4,12,31))))) ---  

 

pensando agora enquanto escrevo uma nova ideia

pode ver como a posição  e a simbologia é importante para facilitar a programação " ainda mais para quem sabe quase nada"

 ""|@E:@Ou(!Despesas,#Data,%Semana,1,2,3): @Ou(%Dia,1,4,12,31)]|""""|@Ou:@E(!Despesas,#Data,%Semana,1,2,3): @Ou(%Dia,1,4,12,31)]|""

= "!,@,#,$,%"    ' simbolos dos comandos $ =plan ou BD, !=setor ou tabela, # =coluna,@ =comandos

 

Ainda está difícil separar corretamente, mas já facilita

Se a primeira letra for um @ ele separa por ":"  no array

se varre o array a partir da 2ª e verifica a primeira letra,

se for novamente um @ o valor é novamente dividido

se for ! define um array de dados do setor

se for # define a coluna do setor a ser varrido

se for % converte o valor da coluna na função especificada e usa a função de varredura no caso E,Ou se a função retornar true prosegue com a formula senão dependendo se for E ou OU para

 

bem, seguindo com os testes e adaptações

Link para o comentário
Compartilhar em outros sites

  • Solução

bem

acho que defini uma sintaxe apropriada para o que eu quero

@E(!Despesas,1,2,3,@Ou(#Data,%Semana,1,2,3),@Ou(%Dia,1,4,12,31))@E(@Ou(!Despesas,#Data,%Semana,1,2,3,@E(nada,tudo)),@Ou(%Dia,1,4,12,31))

fiz uma função para separar as partes da formula 1º pela chave @ e depois por (***)

Public Function Contfor(ByVal TextoX As String, Optional ByVal OcorrenciaX As Long) As String    Dim pos As Long, Ax As Long, ltx As Long, ax2 As Long    lent1 = Len(TextoX)    For Ax = 1 To lent1        lety = Mid(TextoX, Ax, 1)        If lety = "@" Then pos = pos + 1        If pos = OcorrenciaX Then            nucle = 0: ax2 = Ax            dd = 0            GoTo tex:        End If    Next      Contfor = "Erro"    Exit Functiontex:    For Ax = ax2 To lent1    lety = Mid(TextoX, Ax, 1)        If lety = "(" Then nucle = nucle + 1: dd = 1        If lety = ")" Then nucle = nucle - 1        If nucle = 0 And dd = 1 Then            Contfor = Mid(TextoX, ax2, Ax - ax2 + 1)           Exit Function        End If    Next  End Function
MsgBox Contfor(@E(@Ou(!Despesas,#Data,%Semana,1,2,3,@E(nada,tudo)),@Ou(%Dia,1,4,12,31)), 2)=@Ou(!Despesas,#Data,%Semana,1,2,3,@E(nada,tudo))
MsgBox Contfor(@E(@Ou(!Despesas,#Data,%Semana,1,2,3,@E(nada,tudo)),@Ou(%Dia,1,4,12,31)), 3)=@E(nada,tudo)
MsgBox Contfor(@E(@Ou(!Despesas,#Data,%Semana,1,2,3,@E(nada,tudo)),@Ou(%Dia,1,4,12,31)), 4)=@Ou(%Dia,1,4,12,31)

ainda preciso ajeitar alguns pontos importantes como as sub formulas que fazem parte das internas ou externas

mas daqui para frente creio ser mais fácil

Link para o comentário
Compartilhar em outros sites

Depois de uma boa dor de cabeça e seguindo para a execução do filtro e ser obrigado a mudar a sintaxe novamente

me veio a cabeça se não era melhor executar a formula sequencialmente

"!Despesas,@E(@Ou(#Data,%Semana,1,2,3,@E(nada,tudo)),@Ou(%Dia,1,4,12,31))"

!Despesas>passa o setor para um array

@E aciona o operador (E) qualquer valor falso descarta o resto da formula pertencente a ele

@Ou Aciona o operador (OU) qualquer valor verdadeiro valida o resto da formula pertencente a ele

...

 

eu consegui fazer um teste de filtragem aqui, mas não estou conseguindo elaborar questões mais complexas,

tipo (filtrar a linha do setor se na mesma data o outro setor tiver certo valor)

varredura sequencial facilitaria testes mais complexos, mas deixaria mais lento a operação

 a não ser que eu transformasse os operadores em numéricos e passasse para um array

 

bem o fato é, ainda estou totalmente enrolado com isso

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!