VBA ByRef Argument Type Mismatch

Incompatibilidade de tipo de argumento ByRef no Excel VBA

Neste artigo, explicamos o erro encontrado ao usar Excel VBA ByRef como “Erro de incompatibilidade de tipo de argumento”. Antes disso, deixe-me apresentá-lo a “By Ref” primeiro. As variáveis ​​são fundamentais para qualquer linguagem de programação e o VBA também não é diferente. Vimos muitas maneiras de declarar variáveis, uma delas é usando as palavras “ByRef” e “ByVal”.

O que significa ByRef?

“ByRef” significa “Por referência”, usando esta palavra podemos realmente passar argumentos para procedimentos (para sub e função) por referência. É diferente de seu irmão “By Val”, que não é flexível, mas de natureza fixa.

Para entender isso, vamos dar uma olhada nas duas macros abaixo.

Código:

 Sub Macro1 () Dim A As Long A = 50 Macro2 A MsgBox A End Sub Sub Macro2 (ByRef A As Long) A = A * 10 End Sub 

Temos dois subprocedimentos aqui denominados Macro1 e Macro2, respectivamente. Para entender melhor, execute a macro linha por linha pressionando a tecla F8.

Pressione a tecla F8 para capturar o valor da variável “A” como 50.

A próxima linha de código diz “Macro2 A”, ou seja, o nome da segunda macro e “A” é a variável definida por meio da palavra “Por Ref”.

Como você pode ver acima, no momento em que executamos a linha de código “Macro2 A”, ela saltou para o próximo subprocedimento VBA do procedimento acima.

Agora podemos ver que o valor da variável “A” é 50, isso porque, como usamos a palavra “ByRef” para declarar a variável “A”, que é a mesma da Macro1, ela capturou o valor que atribuímos a esta variável “ A ”da Macro1 .

Agora, nesta macro ( Macro2 ) a equação diz A = A * 10, ou seja, A = 50 * 100. Pressione a tecla F8 3 vezes para voltar à macro acima ( Macro1 ).

Agora pressione mais uma vez a tecla F8 para ver o valor da variável “A” na caixa de mensagem em VBA.

O valor diz 500.

Mesmo que o valor que atribuímos nesta macro (Macro1) seja 50, usando a palavra ByRef nós realmente acionamos o subprocedimento Macro2 retendo o valor da variável "A" da Macro1 e, em seguida, executando o valor de A multiplicando 10.

3 principais motivos para incompatibilidade de tipo de argumento do VBA Byref

Acima, vimos como “ByRef” funciona, mas cometemos alguns dos erros que invariavelmente resultavam em lançar uma mensagem de erro VBA como “ByRef Argument Type Mismatch”.

Isso ocorre por vários motivos e, nesta seção, mostraremos como retificar esse erro e depurar o código.

Você pode baixar este modelo VBA ByRef Argument Type Mismatch aqui - VBA ByRef Argument Type Mismatch Modelo Excel

Razão do erro nº 1 - Nomes de variáveis ​​diferentes

Um dos principais motivos para obter esse erro no Excel VBA é devido a diferentes variáveis ​​passadas em dois procedimentos. Para obter um exemplo, veja os códigos abaixo.

Código:

 Sub Macro1 () Dim A As Long A = 50 Macro2 B MsgBox A End Sub Sub Macro2 (ByRef A As Long) B = B * 10 End Sub 

Na Macro1 usamos a variável “A” e na Macro2 usamos a variável “B”. Agora, se você tentar executar o código, obteremos VBA Error como “ByRef Argument Type Mismatch”.

Como você pode ver, a variável “B” acima foi destacada porque o tipo de nome da variável é uma incompatibilidade.

Solução: Para superar esse problema, precisamos nos certificar de que os nomes das variáveis ​​em ambos os procedimentos sejam exatos.

Motivo do erro 2: diferentes tipos de dados variáveis

Mesmo que os nomes das variáveis ​​sejam os mesmos, isso causa um erro devido ao tipo de dados que atribuímos a elas. Olhe o código abaixo.

Código:

 Sub Macro1 () Dim A As Integer A = 50 Macro2 A MsgBox A End Sub Sub Macro2 (ByRef A As Long) A = A * 10 End Sub 

Nos códigos acima, declarei a variável “A” como tipo de dados Inteiro na Macro1 e na Macro2 a mesma variável foi atribuída o tipo de dados como “Longo”.

Quando executamos este código, ele causará um erro vba “ByRef Argument Type Mismatch”.

Isso ocorre porque atribuímos dois tipos de dados diferentes para o mesmo nome de variável.

Solução: o tipo de dados deve ser o mesmo em ambos os procedimentos.

Razão do erro 3: tipos de dados variáveis ​​ausentes em uma macro

O erro VBA do Excel “Incompatibilidade de tipo de argumento ByRef” pode ocorrer devido ao tipo de dados atribuído em uma macro e não atribuído em outra macro.

Código:

 Sub Macro1 () A = 50 Macro2 A MsgBox A End Sub Sub Macro2 (ByRef A As Long) A = A * 10 End Sub 

No código de Macro1 acima, não declarei nenhuma variável, mas simplesmente atribuí o valor à variável.

Por outro lado, para Macro2, declarei a variável “A” como longa. Se você tentar executar este código, ocorrerá o erro VBA “ByRef Argument Type Mismatch”.

Solução 1: Para evitar esse tipo de situação, a primeira solução é declarar a variável em ambos os procedimentos e atribuir o mesmo tipo de dados.

Solução2: Uma solução alternativa é tornar a declaração da variável obrigatória adicionando a palavra “Option Explicit” no topo do módulo.

O que isso fará é que antes de mostrar o erro “ByRef Argument Type Mismatch” do VBA, ele na verdade nos pede para declarar a variável primeiro.

Portanto, Option Explicit sempre é útil no VBA.

Coisas para lembrar

  • ByRef é o oposto de By Val.
  • ByRef carrega a referência de um procedimento para outro.
  • O nome da variável, tipo de dados deve ser o mesmo em ambos os procedimentos.
  • Cada variável precisa ser declarada separadamente no caso de várias variáveis.