SEPARAR TEXTO COM FORMATO DE FORMULAS EM PARTES

EDCRONOS 30/09/2015 23:39:15
#451984
ola
primeiro tópico aqui
Eu eu estou tentando fazer uma função em VBA que separa as partes de formulas em texto
 [Ô]!setor1,@E(1,2,3,@Ou(1,4,12,31,@E(3,1,2,3)),@Ou(1,4,12,31))[Ô]
[Ô]!setor1,@OU(@E(1,4,12,31,@Ou(3,1,2,3),@Ou(a,b,c)),@E(1,4,12,31))[Ô]

de inicio e me perdi na sintaxe da formula
mas consegui fazer uma função que [Ô]Quase[Ô] deu certo para oq eu queria

como podem ver seguem um pouco da sintaxe das formulas do excel
a formula precisa ser separada em partes
inteiras,
@OU(@E(1,4,12,31,@Ou(3,1,2,3),@Ou(a,b,c)),@E(1,4,12,31))
@E(1,4,12,31,@Ou(3,1,2,3),@Ou(a,b,c))
@Ou(3,1,2,3)
@Ou(a,b,c)
@E(1,4,12,31)
nucleos
1,4,12,31
3,1,2,3
a,b,c
a função que chegou perto foi
  Public Function Contfor(ByVal TextoX As String, ByVal OcorrenciaX As Long, Optional ByVal ss 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 Function

tex:
For Ax = ax2 To lent1
lety = Mid(TextoX, Ax, 1)
If lety = [Ô]([Ô] Then
nucle = nucle + 1
If dd = 0 Then nucle0 = Ax
dd = 1
End If
If lety = [Ô])[Ô] Then nucle = nucle - 1

If nucle = 0 And dd = 1 Then
If ss = 1 Then
dfg = InStr(nucle0, TextoX, [Ô],@[Ô], 1) - 2
dfg1 = InStr(nucle0, TextoX, [Ô])[Ô], 1) - 1 [ô] --<<--
If dfg < 1 Or dfg1 < dfg Then dfg = dfg1 - 1 Else dfg = dfg - 2

Contfor = Mid(TextoX, nucle0 + 1, dfg - ax2 - 1)
Exit Function
Else
Contfor = Mid(TextoX, ax2, Ax - ax2 + 1)
End If
Exit Function
End If
Next
Contfor = [Ô]erro[Ô]
End Function


mas dependendo da parte da formula e do ajuste que eu faça sempre come uma valor do final do núcleo ou deixa alguma virgula ou )
Contfor(formula, 2, 0) >>pega a parte da formula inteira contada por @
Contfor(formula, 2, 1) >>pega o núcleo da formula
claro que ainda estou meio perdido com as operações dentro das operações @E(OU(E(),E()),OU())
mas separando corretamente eu tento fazer um contador tipo
 Do While Contfor(Formulax, D, 0) <> [Ô]erro[Ô]: D = D + 1: Loop: D = D - 1   [ô]total de partes da formula
e coloco um verificador duplo

não sei se vc's vão poder me ajudar já que é em VBA

até e deste já agradeço
JABA 01/10/2015 00:26:11
#451985
Pra separar em partes inteiras, você poderia fazer assim:

Dim vetor() As String

vetor = Split([Ô]!setor1,@OU(@E(1,4,12,31,@Ou(3,1,2,3),@Ou(a,b,c)),@E(1,4,12,31))[Ô], [Ô]@[Ô])

Dim i As Integer

For i = 0 To UBound(vetor)
MsgBox vetor(i)
Next

EDCRONOS 01/10/2015 01:08:35
#451986
eu já tinha feito algo parecido, mas não fica correto
pq esse tbm tenho que considerar um inteiro
@E( 1,4,12,31, @Ou(3,1,2,3), @Ou(a,b,c) )

pq o resultado do primeiro E depende dos 2 OU
como pode ver o E tem 3 núcleos
então eu tenho que desmembrar a formula por partes
como pode ver na função que delimitei a contagem das aspas ( e )
eu tinha acertado a função, e olha que nem sou de mexer com string e tive que ficar fazendo pesquisa de como trabalhar com as funções
mas fui fazer uns ajustes, e sabe como é, as vezes estamos com a cabeça tão ruim que em vez de melhorar estragamos

o pior que as outras partes da macro já estão praticamente prontas e eu já tinha feito até algumas filtragens de teste

até.
EDCRONOS 01/10/2015 04:25:40
#451987
Acho que consegui ajeitar alguma coisa, pela hora não fiz muitos testes,
mas ainda cho que está exagerada
  
Public Function Contfor(ByVal TextoX As String, ByVal OcorrenciaX As Long, Optional ByVal ss As Long) As String
Dim pos As Long, Ax As Long, ltx As Long, ax2 As Long, dd As Long

lent1 = Len(TextoX)
For Ax = 1 To lent1
If Mid(TextoX, Ax, 1) = [Ô]@[Ô] Then pos = pos + 1
If pos = OcorrenciaX Then
ax2 = Ax
GoTo tex:
End If
Next
Contfor = [Ô]erro[Ô]
Exit Function

tex:
dd = 0: nucle = 0:
For Ax = ax2 To lent1
lety = Mid(TextoX, Ax, 1)
If lety = [Ô]([Ô] Then
nucle = nucle + 1
If dd = 0 Then nucle0 = Ax
dd = 1
End If
If lety = [Ô])[Ô] Then nucle = nucle - 1

If nucle = 0 And dd = 1 Then
If ss = 1 Then
If Mid(TextoX, nucle0, 2) = [Ô](@[Ô] Then Contfor = [Ô]no[Ô]: Exit Function

dfg = InStr(nucle0, TextoX, [Ô],@[Ô], 1) - 1
dfg1 = InStr(nucle0, TextoX, [Ô])[Ô], 1) - 1

If dfg < 1 Or dfg1 < dfg Then dfg = dfg1 - 1 Else dfg = dfg - 2
dfg1 = Mid(TextoX, nucle0 + 1, dfg - ax2 - 1)
If Right(dfg1, 1) = [Ô])[Ô] Or Right(dfg1, 1) = [Ô],[Ô] Then dfg1 = Left(dfg1, Len(dfg1) - 1)
Contfor = dfg1
Exit Function
Else
Contfor = Mid(TextoX, ax2, Ax - ax2 + 1)
End If
Exit Function
End If
Next
Contfor = [Ô]erro[Ô]
End Function

alem de ter limitações na sintaxe da formula

permite assim
@Or([txt-color=#e80000]1,4,12,31,[/txt-color]@And(a,a,a,a))

e assim não
@Or(@And(a,a,a,a)[txt-color=#e80000],1,4,12,31[/txt-color])
TUNUSAT 01/10/2015 08:04:06
#451998
EDCRONOS,

Você pode fazer [Ô]experiências[Ô] em um site [Ô]regex tester[Ô].
Exemplos:
===========================================
Regular Expressions
https://regex101.com/
===========================================
Regex Pal 0.1.4 - a JavaScript regular expression tester
http://regexpal.com/
===========================================
Regex Tester and Debugger Online - Javascript, PCRE, PHP
Online Regex Tester
http://www.regextester.com/
===========================================
Welcome to RegExr v2.0 by gskinner.com!
http://www.regexr.com/
===========================================
Regex HERO
http://regexhero.net/tester/
===========================================
.NET Regex Tester - Regex Storm
http://regexstorm.net/tester
===========================================
Regular Expression Test Page for Java
http://www.regexplanet.com/advanced/java/index.html
===========================================
Rubular: a Ruby regular expression editor and tester
http://rubular.com/
===========================================
Free Formater - Regular Expression Tester
http://www.freeformatter.com/regex-tester.html
===========================================
Debuggex: Online visual regex tester. JavaScript, Python
https://www.debuggex.com/
===========================================

Teste TODOS e escolha o que você acha mais bacanudo.

[][ô]s,
Tunusat.
EDCRONOS 01/10/2015 10:05:39
#452009
ola TUNUSAT
os testes que tenho que fazer é em cima das formulas

a função é uma macro em VBA
TUNUSAT 01/10/2015 13:23:07
#452021
EDCRONOS,

Você sabe rodar código VBA passo-a-passo com [Ô]F8[Ô] dentro?
Aposto que sabe, mas se não sabe:
- Vá até a guia [Ô]Desenvolvedor[Ô] ... procure um esquadro azul [Ô]Modo de Design[Ô].
- Clique duas vezes no botão e abrirá o código. Clique na tecla [Ô]F8[Ô] e acompanhe o processamento passo-a-passo.

[][ô]s,
Tunusat.
EDCRONOS 01/10/2015 16:56:35
#452052
os teste seria com o retorno de diferentes tipos de formulas e suas partes
creio que o passo a passo da execução na maioria se aplica quando se tem erros
e a maioria dos valores da função são numericos que indicam a posição onde se encontra o caractere na frase

Function( input string , X , y )

x=1 , y=0 -->> @And(@Or(1,4,12,31,@And(a,a,a,a)),@Or(b,b,b,b))
x=1 , y=0 -->> [Ô]no[Ô]
x=2 , y=0 -->> @Or(1,4,12,31,@And(a,a,a,a))
x=2 , y=1 -->> 1,4,12,31
x=3 , y=0 -->>@And(a,a,a,a)
x=3 , y=1-->> a,a,a,a
x=4 , y=0 -->>@Or(b,b,b,b)
x=4 , y=1-->>b,b,b,b



mas ao que parece a função está funcionando e retornando valores corretamente, [Ô]pelo menos foi oq consegui fazer com os meus conhecimentos [Ô]

me indicaram excel formula parser
não é oq eu pretendo já que a sintaxe da formula é algo para o meu uso

http://forum.clubedohardware.com.br/topic/1134086-logica-intuitiva-para-filtro/
é para uma macro que funciona como o Select do SQL mas é para trabalhar na planilha
somente dependo de fazer a leitura da formula na sequencia de importância

se eu jogo a formula
[Ô]!teste,$Fixa (3),@ou(#5,%Dez,47,1)[Ô]
na macro
ela já traz os resultados corretos
que seria todas as linhas do setor teste da aba fixa (3) em que a coluna 5 [Ô]do setor e não da aba[Ô] tenha valores terminados com 47 OU 01
no caso se eu omitir o operador # a macro verifica em todas as colunas se tem algum dos valores

ainda tenho que colocar um tradutor de cabeçalho, assim em vez de colocar #5 eu coloco #nome da coluna
pelo menos para mim ficou mais intuitivo do que usar o select do banco de dados

bem ainda tenho coisa para fazer para ficar como eu quero, mas minha maior dificuldade é no tradutor das formulas, no caso essa função que separa




EDCRONOS 03/10/2015 13:44:29
#452143
O titulo do topico deveria ser (separar formulas, [Ô]A saga[Ô])
http://forum.clubedohardware.com.br/topic/1134086-logica-intuitiva-para-filtro/
http://forum.chandoo.org/threads/break-string-to-formula.25815/

acho que a parte mais difícil é organizar as ideias
de certa forma os tópicos que abri serviram apenas para isso,
me auto entender

mas aos pouco eu estou chegando

  
Type LPart
Operador As String
Formula As String
Nucleo As String
End Type

Public Function FormuLPart(ByVal FormulaX As String, Optional ByVal OcorrenciaX As Long) As LPart
Dim pos As Long, Ax As Long, Ax1 As Long, ltx As Long, ax2 As Long, dd As Long, posi As Long, aa As String

OcorX = OcorrenciaX + 1
lent1 = Len(FormulaX)
For Ax = 1 To lent1
aa = Mid(FormulaX, Ax, 1)
If aa = [Ô]([Ô] Then
If pos = 0 Then Ax1 = Ax
pos = pos + 1
End If
If aa = [Ô])[Ô] Then pos = pos - 1: If pos = 0 Then ax2 = Ax: dd = dd + 1
If dd = OcorX Then GoTo tex:
Next
FormuLPart.Formula = [Ô]erro[Ô]
FormuLPart.Nucleo = [Ô]erro[Ô]
Exit Function
tex:
FormuLPart.Nucleo = Mid(FormulaX, Ax1 + 1, ax2 - Ax1 - 1)
For Ax = Ax1 To 1 Step -1
If Mid(FormulaX, Ax, 1) = [Ô]@[Ô] Then
FormuLPart.Operador = Mid(FormulaX, Ax + 1, Ax1 - Ax - 1)
Ax1 = Ax
Exit For
End If
Next
FormuLPart.Formula = Mid(FormulaX, Ax1, ax2 - Ax1 + 1)

End Function


  Sub sdfadfadf2()

Aaaa = [Ô]!q,@Ou(#2,%Semana,1,2,3)[Ô]
Aaaa = [Ô]!q,@E(@Ou(1,2,34,@E(1,2,3)),@Ou(1,4,12,31))[Ô]
[ô]Aaaa = [Ô]!setor1,@E(1,2,3,@Ou(1,4,12,31,@E(3,1,2,3)),@Ou(1,4,12,31))[Ô]

Aaaa = [Ô]!Setor,$Sheet,@E(1,@Ou(2,@E(3,@ou(4),@ou(5))),@Ou(6,@E(7,@ou(@e(8),@e(9)))))[Ô]
MsgBox FormuLPart(Aaaa).Operador
MsgBox FormuLPart(FormuLPart(Aaaa).Nucleo, 1).Formula

End Sub

eu tenho que mandar as partes da formula junto dos operadores mestres e esclavos

é coisa de maluco não é?
eu consigo fazer uma macro que pega uma area [Ô]setores[Ô] da planilha , de qualquer aba, qualquer posição, e qualquer tamanho
passa para um array, faz a varredura, passa as linhas que corresponda as regras da formula o setor que pode ser qualquer um e de qualquer tamanho [Ô]a quantidade de colunas é reajustado[Ô]
mas não consigo separar um simples texto da maneira que eu quero
Faça seu login para responder