none
Comparação de valores no IF com símbolos RRS feed

  • Pergunta

  • Boa tarde,

    Estou tentando realizar um código em VBA para um planilha onde dependo de formatar o tipo de célula de acordo com os dados de outra célula. O código que desenvolvi até agora é o seguinte:

    'Esta parte esta no USEFORM1 que aplica na 
    'célula o valor de 2.000 µΩ 
    Range("O59:R59").Select
    ActiveCell.Value = "2.000 " & ChrW(181) & ChrW(937)
    
    'Já este está em outro useform, o USEFORM2, onde tenho que ler
    'como está a célula O59:R59 e formatar  a celula T59:Z59, que neste
    'exemplo coloquei como atribuir valor a AN59
    
    Dim var As Variant
        
       var = Range("O59:R59").Value2
        If var = "2.000 " & ChrW(181) & ChrW(937) Then
        Range("AN59").Value = 55
        Else
        Range("AN59").Value = 77
        End If

    Entretanto, esse códido me gera o erro "Erro em tempo de execução 13: Tipos incompatíveis"

    Só que, fiz outro código numa pasta de trabalho nova para me servir de exemplo e funciona sem nenhum erro, o código é o seguinte:

    Sub Exemplo()
    Dim var As Variant
    
    
    Range("a1").Value = "2.000 " & ChrW(181) & ChrW(937)
    
    var = Range("a1").Value
    
    Range("b2").Value = var
    
    If var = "2.000 " & ChrW(181) & ChrW(937) Then
    Range("C3").Value = 55
    End If
    
    End Sub

    Não consigo entender o que está gerando o erro, porque mesmo se eu troco o 

    If var = "2.000 " & ChrW(181) & ChrW(937) Then

    Por 

    If var = "teste" Then

    O problema ainda persiste, se alguém puder me ajudar ficarei grato!




    • Editado jaoooP sexta-feira, 16 de fevereiro de 2018 19:50
    sexta-feira, 16 de fevereiro de 2018 19:44

Respostas

  • Você editou o tópico e continuou sem dizer em que linha ocorre o erro.

    Mas relendo ficou claro: você atribuiu à variável "var" um intervalo, tornando-a uma matriz. Ao fazer isso logicamente a expressão:

     If var = "2.000 " & ChrW(181) & ChrW(937) Then

    Não faz sentido algum. Creio que talvez queira concatenar as colunas de "O" até "R" e então comparar. Se for o caso, faça um "For" antes e o teste depois.

    Era isso?


    Filipe Magno

    Tentou utilizar uma célula, ao invés de um intervalo? Com certeza com intervalo não irá funcionar.

    var = Range("O59").Value2

    Obs.: Células mescladas são identificadas pelo endereço da primeira célula do intervalo.


    Filipe Magno

    • Marcado como Resposta jaoooP terça-feira, 20 de fevereiro de 2018 15:52
    terça-feira, 20 de fevereiro de 2018 11:01

Todas as Respostas

  • Boa tarde!
    Em qual linha gera o erro?

    Uma dica importante é qualificar por completo o endereço, usando variável, o Nome ou o "CodeName" da planilha.


    Filipe Magno

    sexta-feira, 16 de fevereiro de 2018 19:53
  • A variavel "var" não devia ser declarada como "String"?

    M_A_S_L


    • Editado M_A_S_L sábado, 17 de fevereiro de 2018 11:41
    sábado, 17 de fevereiro de 2018 11:25
  • Você editou o tópico e continuou sem dizer em que linha ocorre o erro.

    Mas relendo ficou claro: você atribuiu à variável "var" um intervalo, tornando-a uma matriz. Ao fazer isso logicamente a expressão:

     If var = "2.000 " & ChrW(181) & ChrW(937) Then

    Não faz sentido algum. Creio que talvez queira concatenar as colunas de "O" até "R" e então comparar. Se for o caso, faça um "For" antes e o teste depois.

    Era isso?


    Filipe Magno

    sábado, 17 de fevereiro de 2018 12:34
  • Pois é, eu tentei declarar como string, entretanto como preciso dos caracteres especiais µ e Ω, utilizo a função ChrW(código) para representá-los. E por conta disto a única maneira que consegui fazer rodar foi colocando uma variável "variant".
    • Editado jaoooP segunda-feira, 19 de fevereiro de 2018 20:02
    segunda-feira, 19 de fevereiro de 2018 19:58
  • Então, o intervalo refere-se a uma mesclagem de células, então não sei se ainda cai como matriz.

    E pra ficar claro, a linha de erro ocorre em:

     If var = "2.000 " & ChrW(181) & ChrW(937) Then

    Eu pensava que por ter uma função(ChrW[código]) na condicional do "IF" este seria o problema, mas quando fiz um teste em uma planilha nova sem formatação nem nada, o "IF" rodou perfeitamente, como no exemplo que coloquei:

    Sub Exemplo()
    Dim var As Variant
    
    
    Range("a1").Value = "2.000 " & ChrW(181) & ChrW(937)
    
    var = Range("a1").Value
    
    Range("b2").Value = var
    
    If var = "2.000 " & ChrW(181) & ChrW(937) Then
    Range("C3").Value = 55
    End If
    
    End Sub

    O que eu estou tentado fazer é o seguinte:

    Tenho diferentes escalas de medição no aparelho, então para a escala medido em µΩ preciso colocar esta escala no final do valor inserido via caixa de texto em um UseForm do meu VBA. Então, se meu aparelho está na escala de µΩ, o usuário deverá colocar o valor medido na caixa de texto do useform que criei( o usuário inseri apenas o valor da medição) e via código eu atribuo a este valor de medição a unidade adequada. Exemplo:

    Primeira medição está em mΩ: o usuário irá colocar na planilha a escala do aparelho via botão de comando(No useform das escalas do aparelho):

    Range("O59:R59").Select
    ActiveCell.Value = "2.000 m" & ChrW(937)

    Em seguida, em outro useform (a dos valores medidos), o usuário irá colocar apenas os valores encontrados e meu código, então, irá ler em que escala está o aparelho, apresentado no seguinte código:

     var = Range("O59:R59").Value2

    Assim, eu dou o valor da célula da escala do aparelho para a variável e comparo a variável com as possibilidades que eu posso ter µΩ ou mΩ, como está no código: 

    If var = "2.000 " & ChrW(181) & ChrW(937) Then

    Onde ChrW(181) = µ e ChrW(937) = Ω.

    E se caso a variável tiver lido que a célula 1(escala do aparelho) está em  µ, o código irá atribuir aos valores medidos (célula 2) automaticamente a unidade µ.

    https://ibb.co/dfSh37 ~~> Fluxograma do algoritmo





    • Editado jaoooP segunda-feira, 19 de fevereiro de 2018 20:42
    segunda-feira, 19 de fevereiro de 2018 20:01
  • Mas o valor "2000" & ChrW(181) & ChrW(937) é uma string.

    E se entendi bem, pretendes converter o valor 2000 por exemplo, para uma outra unidade de medição, adicionando no final as unidades de medida correspondentes. Certo?

    A ser assim podes utilizar a função left, adicionando aos resultados os carateres especiais.


    M_A_S_L

    segunda-feira, 19 de fevereiro de 2018 20:53
  • Mas se eu declarar a variável como string, como faço a leitura?

    var = Range("O59:R59").Text?

    E quanto a função left, não sei se é o caso, porque eu necessito ler mesmo é a unidade, o valor "2000" pra mim não importa, só coloco porque é desta maneira que dou valor a célula 1.

    segunda-feira, 19 de fevereiro de 2018 21:03
  • Qual é o formato do conteúdo das células que compõem o Range("O59:R59")?

    M_A_S_L

    segunda-feira, 19 de fevereiro de 2018 22:56
  • Mas teoricamente é isso que tens estado a fazer. A comparar strings com inteiros daí obteres o erro de "Tipos incompatíveis" se por acaso não estou enganado.

    Na realidade, penso que estás a dar demasiado ênfase aos microOhms e aos Milliohms, quando na realidade o resultado das medições é sempre um numero inteiro ou decimal.

    Pelo teu diagrama, penso que se criares 2 Optionbutton cada um com uma unidade diferente, dependendo da escolha podes direcionar os valores para as células que entenderes, podendo incluir no código as formulas de conversão de valores.

    Se criares por exemplo Var1 e Var2, e se:

    Var1=ChrW(181) & ChrW(937)

    Var2=Chr(109) & ChrW(937) '-------Chr(109) é sem W pois corresponde ao "m".

    não tens que estar sempre a repetir o código dos carateres. Depois de obteres as contas e só concatenar "Var1" ou "Var2" conforme os casos.

    Não percebo nada de resistências elétricas e menos percebi a tua ideia, mas penso que iniciaste a construção do teu diagrama pelo fim e não pelo princípio, pois para registares uma unidade de medição deves ter uma leitura.

    Penso portanto que é com base na leitura que deves construir o código.

    -Atribuis à celula 1 o valor de 2000 microohms (vindos de onde?)

    -Atribuis a uma variável o valor de 2000 microohms (uma string)

    -O valor está em microohms? (claro. está lá escrito isso)

    -Se "Sim" atribuis à celula 2 a unidade em microohms (microohms é a unidade e já lá está)

    -Se "Não" ... (não há não, pois pois está lá escrito microohms)

    -Tendo a unidade adequada, atribuis os valores medidos.

    Francamente não estou a entender o teu problema e não entendi a tua dúvida.


    M_A_S_L

    terça-feira, 20 de fevereiro de 2018 00:56

  •  var = Range("O59:R59").Value2

    Outra coisa. Isto existe em VBA?


    M_A_S_L

    terça-feira, 20 de fevereiro de 2018 01:03
  • Você editou o tópico e continuou sem dizer em que linha ocorre o erro.

    Mas relendo ficou claro: você atribuiu à variável "var" um intervalo, tornando-a uma matriz. Ao fazer isso logicamente a expressão:

     If var = "2.000 " & ChrW(181) & ChrW(937) Then

    Não faz sentido algum. Creio que talvez queira concatenar as colunas de "O" até "R" e então comparar. Se for o caso, faça um "For" antes e o teste depois.

    Era isso?


    Filipe Magno

    Tentou utilizar uma célula, ao invés de um intervalo? Com certeza com intervalo não irá funcionar.

    var = Range("O59").Value2

    Obs.: Células mescladas são identificadas pelo endereço da primeira célula do intervalo.


    Filipe Magno

    • Marcado como Resposta jaoooP terça-feira, 20 de fevereiro de 2018 15:52
    terça-feira, 20 de fevereiro de 2018 11:01
  • hahaha Beleza, obrigado pela informação, verei essa informação sobre as células mescladas caro Filipe, muito obrigado.

    Quanto a seu questionamento MASL, eu tenho as seguintes opções:

    https://ibb.co/fKKBhc

    Neste caso, cada optionButtom aplica a célula O59 o 2000 microohms ou 200 miliohms, como segue:

    https://ibb.co/hnDJvx

    Veja que tenho diferentes escalas que podem ser utilizada pelo equipamento e o valor apresentado pelo equipamento, sim é inteiro, mas ela já está na unidade que a escala apresenta, assim, se ele apresenda uma medição de 200 e estiver na escala de micro é 200micro, se estiver na escala de mili é 200mili. O que estou tentando fazer é um algoritmo que leia a célula O59 para eu diferenciar os micro dos mili e já colocar a partir de um textbox a unidade, sem que o usuário faça isso.


    • Editado jaoooP terça-feira, 20 de fevereiro de 2018 15:43
    terça-feira, 20 de fevereiro de 2018 15:41
  • Pelo que vi sim, mas não importa, foi umas das minhas tentativas.

    E pra resumir, o meu problema é ler uma string ou valor com o caracter omega sendo que o VBA não tem este caracter em sua biblioteca, por isso uso a função ChrW(937). Quero comparar no if 2000microohms escritos em uma célula com uma valor pré-estabelecido como 2000microohms. como segue:

    If var = "2.000 " & ChrW(181) & ChrW(937) Then

    terça-feira, 20 de fevereiro de 2018 15:50
  • Era isso mesmo meu caro Filipe, nunca tinha sabido sobre isso das mesclagens de células, sempre achei que deveria eu colocar o intervalo de células.

    Acho que pulei alguns pontos de meus estudos. Mas obrigado pela ajuda, pela disposição.

    Obrigado também ao MASL pela disposição! 


    • Editado jaoooP terça-feira, 20 de fevereiro de 2018 16:11
    terça-feira, 20 de fevereiro de 2018 15:53