Notifications
Clear all

sintaxe if varios and or e <> no vba

18 Posts
2 Usuários
0 Reactions
2,671 Visualizações
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

Qual a sintaxe no vba para formula de comparação com IF ?

no excel ficaria assim
Se( E (Plan_Aq<>Plan_Princ ; De_1<>""); OU (Quant > 2; Quant<1001; Fixacopy=True;Para_2<>"") Then

Se( E(A<>B; C<>""); ou( q>2; q<1001 ; F=Verdadeiro; p <> "")

Mas e no vba?
If Plan_Aq <> Plan_Princ And De_1 <> "" And Quant > 2 Or Quant < 1001... tentei mas deu nó no raciocínio

 
Postado : 30/03/2014 6:28 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa noite!!

Não testado!!!!!!!!!!

Sub AleVBA_11130()
    If (Plan_Aq <> Plan_Princ And De_1 <> "") Or (Quant > 2 Or Quant < 1001 Or Fixacopy = True Or Para_2 <> "") Then
        '.....Continuação caso verdadeiro.....
    End If
  
  End Sub

Att

 
Postado : 30/03/2014 6:48 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa noite!!

Leia também:
http://www.homeandlearn.org/excel_vba_l ... ators.html

Att

 
Postado : 30/03/2014 6:52 pm
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

Desculpe, eu errei

if (Plan_Aq <> Plan_Princ And De_1 <> "") And (Quant > 2 Or Quant < 1001 Or Quant > 2 Or Quant < 1001 Or Fixacopy = True Or Para_2 <> "")

Se( E(A<>B; C<>""; OU( q>2; q<1001 ; F=Ver.; p <> ""))

Se( E (Plan_Aq<>Plan_Princ ; De_1<>""; OU (Quant > 2; Quant<1001; Fixacopy=True;Para_2<>""))Then

Sempre que tento fazer essas formulas no vba dá um nó e não consigo nem uma nem outra
para falar a verdade apesar de fazer formulas mais complexas já deu branco e nem dessa do excel tenho mais certeza.

 
Postado : 30/03/2014 7:05 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Se( E(A<>B; C<>""; OU( q>2; q<1001 ; F=Ver.; p <> ""))
Algo assim:

If A <> B And C <> "" And q > 2 Or _
   A <> B And C <> "" And q < 1001 Or _
   A <> B And C <> "" And F = Ver Or _
   A <> B And C <> "" And p <> "" Then
 
Postado : 31/03/2014 5:03 am
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

será que posso fazer assim?

if a<>b and C <>"" then
if q>2 or q<1001 or f=Ver or p<>"" then
......codigo
end if
end if

apesar de ter usado essa sintaxe num tk95 para fazer programas em BASIC quando tinha 13 anos,
depois que aprendi essa do excel, as duas não batem.
eu penso em uma e meu cérebro tenta converter para a outra, oq acaba embolando o meio do caminho

desculpa a enrolação com algo tão simples.

 
Postado : 31/03/2014 8:17 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

É nas funções do Excel pode-se mesclar E com Ou, que é feito o desmembramento internamente; porem na programação VBA não há.
Sim pode utilizar sem problemas um If dentro de outro, conforme o demonstrado acima,
eu, por preferência pessoal, utilizo conforme meu post anterior.

 
Postado : 31/03/2014 8:36 am
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

vou usar um if dentro do outro para não atrapalhar o meu raciocínio nas outras coisas

sei que vai ser apagado mas ...
no meu caso é uma questão de cavalo teimoso...
tipo, eu tenho que ir para a cidade, mas sempre vou pelo mesmo caminho no meu cavalo (subconsciente),
só que como tenho que entrar por outro portão, preciso pegar outro caminho um pouco mais longo,
sei o caminho e tento seguir por ele
Mas o cavalo teima em ir pelo caminho de sempre :roll:

olhando sua resposta realmente é oq eu quero mais nem vou nem tentar reescrever

 
Postado : 31/03/2014 9:06 am
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

Acabou que nisso a minha linha de raciocínio que falhou

q>2 Or q<1001
deveria ser
q>2 And q<1001

pq "OU" na primeira opção verdadeira ignora as outras,
se q for 2000 vai ser executado pq a primeira já foi aceita.

ficando assim

if a<>b and C <>"" then
if (q>2 And q<1001) Or (f=Ver Or p<>"") then
......codigo
end if
end if

ou meu raciocínio já deu pane geral?

 
Postado : 31/03/2014 9:42 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Sempre em uma comparação deve-se atentar para o principio da precedência, ou seja assim que uma determinada condição for atendida, não é " verificada" as demais.
Então em : q>2 Or q<1001 -->para qualquer valor de q superior a 2 os demais "ou's" não serão avaliados, e considerado como condição atendida.
Assim para se ter um valor entre uma determinada range de valores é preciso utilizar o e também ou seja q>2 and q<1001
O Mesmo raciocínio vale para f=Ver, pois se o valor de q atender, não será avaliado o valor de f

 
Postado : 31/03/2014 1:18 pm
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

Ainda bem que desistir de converter as formulas de formatação condicional que uso, para pegar valores com o vba

se uma dessa
=E($AT$2="Y";$AU$2=T18;OU(E(S17>=$AT$1;S17<=$AV$1);E(T17>=$AT$1;T17<=$AV$1);E(U17>=$AT$1;U17<=$AV$1)))
vira isso:

 Private Sub Worksheet_Change(ByVal Target As Range)
  If Intersect(Range("AT2,AU2,T18,S17,AT1,AV1,T17,U17"), Target) Is Nothing Then Exit Sub
  If ([AT2] = "Y" And [AU2] = [T18] And ([S17] >= [AT1] And [S17] <= [AV1]) Or _
        ([T17] >= [AT1] And [T17] <= [AV1]) Or ([U17] >= [AT1] And [U17] <= [AV1])) Then _
        MsgBox True & vbLf & "copia de onde você quiser e cola onde você mandar"
End Sub 

alem do fato de que, considerando o seu exemplo, deveria ficar assim

   (S17>=$AT$1 and S17<=$AV$1 and $AT$2="Y" and $AU$2=T18) 
OU (T17>=$AT$1 and T17<=$AV$1 and $AT$2="Y" and $AU$2=T18) 
OU (U17>=$AT$1 and U17<=$AV$1 and $AT$2="Y" and $AU$2=T18)

por que ($AT$2="Y";$AU$2=T18) tem que ser verdadeiras em cada uma opção "OU"

Pelo menos foi oq eu entendi

imagina um desse

=E(T18=$C$1;OU(S18=$B$1;U18=$B$1;OU(S17=$B$1;T17=$B$1;U17=$B$1;E(T17="";OU(S16=$B$1;T16=$B$1;U16=$B$1;E(T16="";OU(S15=$B$1;T15=$B$1;U15=$B$1;E(T15="";OU(S14=$B$1;T14=$B$1;U14=$B$1;E(T14="";OU(S13=$B$1;T13=$B$1;U13=$B$1)))))))));OU(S19=$B$1;T19=$B$1;U19=$B$1;E(T19="";OU(S20=$B$1;T20=$B$1;U20=$B$1;E(T20="";OU(S21=$B$1;T21=$B$1;U21=$B$1;E(T21="";OU(S22=$B$1;T22=$B$1;U22=$B$1;E(T23="";OU(S23=$B$1;T23=$B$1;U23=$B$1)))))))))))

que faz a mesma coisa mas pula até 3 linhas em branco

se for isso, até dá para pegar a manha, o problema é conciliar 2 formas distintas para a mesma situação.

 
Postado : 31/03/2014 2:41 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

"por que ($AT$2="Y";$AU$2=T18) tem que ser verdadeiras em cada uma opção "OU""

Essa premissa também é valida para a função na planilha, se não for "atendida" a comparação --> E($AT$2="Y";$AU$2=T18), já resulta em "Falso", então as variáveis "OU" não serão verificadas.
Se "Verdadeiro", verifica pela ordem de sequencia o primeiro "OU", com essa "perna" é composta por tres "E", e verificado a primeira; se necessário a segunda....

 
Postado : 31/03/2014 5:04 pm
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

bem, creio que foi isso que entendi,
a questão que na planilha fica como o if dentro do outro

E((essas 2) com OU(qualquer uma das 3)) as 2 primeiras tem que ser verdadeiro e apenas um do segundo
No excel "parece" ser uma ordem em cascata

E(A;B;Ou(C;D;E))

no vba (A and B and C) Or (A and B and D) Or (A and B and E) qualquer um dos 3 tem que ser verdadeiro Mas dentro do conjunto os 3 tem que ser verdadeiros.

E(Ou(A;B;C);Ou(D;E;F);Ou(G;H;I))
(A Or B Or C) and (D Or E Or F) and (G Or H Or I)
Os 3 tem que ser verdadeiros mas dentro do conjunto serve qualquer um

Uma coisa que fico pensando,
no vba, () não serve para especificar ordem de processamento de formulas lógicas como faz em formulas aritméticas?
(A And B) And (C Or D Or E)
O conjunto das formulas Or seriam testadas antes, e o resultado que iria entrar na conta junto resultado de And

se tiver algo de errado no meu raciocino me avise.
obrigado pela atenção e desculpe pelo incomodo.

 
Postado : 31/03/2014 6:21 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Edcronos, isto é o mundo VBA, muitas vezes da um nó, só de ler estes posts já deu um nó na cabeça, rsrsrsr.

Mas o que devemos nos atentar é não confundir o "IF" com "E", ou seja, Operadores Condicionais(Tomadas de Decisões) com Operadores Lógicos entre outros.

E quanto a:
no vba, () não serve para especificar ordem de processamento de formulas lógicas como faz em formulas aritméticas?
No VBA operações Matemáticas seguem a mesma regra dos parenteses e operadores, veja bem isto em operações Matemáticas (Formulas) quanto a Condicionais onde os IF significam a tomadas de decisões, geralmente quando escrevemos as rotinas nós que induzimos qual a sequência, e ainda temos "IF"..Then..ElseIf...Else..End If.
O VBA avalia operações matemáticas da mesma forma que a matemática nos ensina: primeiro as raízes e potências, depois as multiplicações e divisões e depois as somas e subtrações. Claro, essa ordem respeita a precedência dos parênteses. Em caso de dúvida na ordem de cálculo de operações aritméticas, coloque expressões que deseja avaliar primeiro entre parênteses.
O único operador aritmético que não é um símbolo é o Mod, mas seu comportamento e modo de usar é igual a qualquer outro operador aritmético.

Não sei se estou captando corretamente o assunto tratado, mas é o que entendi. O texto acima foi tirado do link abaixo, de uma olhada, fala basicamente de se lidar com os Operadores Aritméticos : http://www.ambienteoffice.com.br/office ... xe_do_vba/

E neste temos outras explicações referentes a :
Operador de atribuição, Operadores aritméticos, Operadores relacionais, Operadores lógico entre outross : http://www.bianchi.pro.br/vba/vba_p1.php

Neste : Sobre If…..Then….Else : http://excelvbatutor.com/index.php/excel-vba-lesson-4/

[]s

 
Postado : 31/03/2014 8:40 pm
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

por isso mesmo perguntei sobre os () em formulas lógicas "facilitaria muito ".
() em aritmética é coisa básica e (obrigatória (eu acho)). no basic arcaico tinha

e na matemática, como não sou bom e não sei oq é executado primeiro,
só para não haver duvidas quanto a ordem de operação taco ()
(O_tL / DqF) * (OqF - Al)
O_LI + (O_tL - Des_li)

IF"..Then..ElseIf...Else..End If. não é bem oq eu quero, já que é o mesmo que SE alinhado

isso não precisava nem falar :P

Mas o que devemos nos atentar é não confundir o "IF" com "E", ou seja, Operadores Condicionais(Tomadas de Decisões) com Operadores Lógicos entre outros.

no momento preciso é verificar se varias condições se atendem umas as outras

If Plan_Aq = Plan_Princ Then MsgBox "Por Favor NÃO faça isso Aqui!": Exit Sub
If Quant <> "" And Quant < 3 Or Quant <> "" And Quant > 1000 Then MsgBox "Quantidade de Colunas impossível de processar": Exit Sub

mac1 = De_1
mac2 = Para_2

If (Plan_Aq <> Plan_Princ And mac1 <> "") Then    'aaaaaaaa
If (Quant > 2 And Quant < 1001) Or Fixacopy = True Or Para_2 <> "" Then  'bbbbbbbbb

Mak1 = Para_2
Ma = Quant
ColunasN  'ajusta quantidades de colunas

If Fixacopy = True Then Plan = Plan_Princ Else: Plan = ActiveSheet.Name

Setor = De_1: Setores
Copia
Copia_P_AuxA                      'copia dados da Origem para AUXA, retorna novo endereço de setor
Setor = Para_2: Setores

If mac2 <> "" Then Plan = ActiveSheet.Name: Application.Run mac2
......muito mais

por falta de repetir Quant <> "" ,num teste a macro criou um setor de 2500 colunas 6000 linhas cheia de dados pegos das outras planilhas :( ,
um erro tão simples e se mostra completamente fatal para o projeto ."agora está legal" (eu acho) mas ainda falta os mais dificeis
E passei a colocar uma caixa de mensagem com com os dados retornados e um exit sub antes de processar os dados da planilha.

pelo que eu me lembro, operações lógicas e aritméticas não mudou muito do BASIC que eu usei num TK95 29anos atrás
"eles poderiam pelo menos ter incluído a opção das () nas operações lógicas"

Será que isso está ajudando alguem? ou todo mundo que olha e tenta entender vai direto procurar uma aspirina?
Creio que já consigo me virar daqui, melhor trancar o tópico

 
Postado : 01/04/2014 1:35 am
Página 1 / 2