SEPARAR TEXTO COM FORMATO DE FORMULAS EM PARTES
ola
primeiro tópico aqui
Eu eu estou tentando fazer uma função em VBA que separa as partes de formulas em texto
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
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
não sei se vc's vão poder me ajudar já que é em VBA
até e deste já agradeço
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 duplonão sei se vc's vão poder me ajudar já que é em VBA
até e deste já agradeço
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
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é.
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é.
Acho que consegui ajeitar alguma coisa, pela hora não fiz muitos testes,
mas ainda cho que está exagerada
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])
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])
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.
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.
ola TUNUSAT
os testes que tenho que fazer é em cima das formulas
a função é uma macro em VBA
os testes que tenho que fazer é em cima das formulas
a função é uma macro em VBA
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.
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.
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
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
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 macroela 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
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
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
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