Ir ao conteúdo

Logica intuitiva para filtro


Ir à solução Resolvido por edcronos,

Posts recomendados

Postado

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ó

Postado

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
Postado

é , 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

  • Solução
Postado

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

Postado

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

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!