VBA ByRef参数类型不匹配错误排名前三的原因和错误修复

Excel VBA中的ByRef参数类型不匹配

在本文中,我们解释了将Excel VBA ByRef用作“参数类型不匹配错误”时遇到的错误。在此之前,让我先向您介绍“通过引用”。变量是任何编程语言的关键,并且VBA也不相同。我们已经看到了许多声明变量的方法,其中一种声明变量的方法是使用单词“ ByRef”和“ ByVal”。

ByRef是什么意思?

“ ByRef”的意思是“按引用”,使用这个词,我们实际上可以通过引用将参数传递给过程(对于子和函数)。这与它的兄弟“ By Val”不同,后者不灵活但本质上是固定的。

为了理解这一点,让我们看一下下面的两个宏。

代码:

 Sub Macro1()Dim A只要A = 50 Macro2 A MsgBox A结束Sub Sub Macro2(ByRef A如Long)A = A * 10 End Sub 

我们在这里有两个子过程,分别称为Macro1和Macro2。为了更好地理解这一点,请按F8键逐行运行宏。

按F8键将变量“ A”的值捕获为50。

下一行代码说“ Macro2 A”,即第二个宏的名称,“ A”是通过“按引用”字定义的变量。

如您所见,在我们执行代码行“ Macro2 A”的那一刻,它已跳至上述过程中的下一个VBA子过程。

现在我们可以看到变量“ A”的值为50,这是因为由于使用了单词“ ByRef”来声明变量“ A”,因此与 宏1 它已经捕获了我们从 宏1.

现在在这个宏中宏2)方程表示A = A * 10,即A = 50 *100。按F8键3次以返回到上面的宏(宏1).

现在再按一次F8键在VBA的消息框中查看变量“ A”的值。

该值表示500。

即使我们在该宏(Macro1)中分配的值为50,通过使用ByRef字,我们实际上仍通过保留Macro1的变量“ A”的值并通过乘以10来执行A的值来触发Macro2子过程。

VBA Byref参数类型不匹配的三大原因

上面我们已经看到“ ByRef”是如何工作的,但是我们必然会犯一些错误,这些错误总是导致抛出“ ByRef Argument Type Mismatch”的VBA错误消息。

这是由于多种原因,在本节中,我们将向您展示如何纠正此错误并调试代码。

您可以在此处下载此VBA ByRef参数类型不匹配Excel模板– VBA ByRef参数类型不匹配Excel模板

错误原因1-不同的变量名称

在Excel VBA中出现此错误的主要原因之一是由于在两个过程中传递了不同的变量。例如,请看下面的代码。

代码:

 Sub Macro1()Dim A只要Long A = 50 Macro2 B MsgBox A结束Sub Sub Sub Macro2(ByRef A只要Long)B = B * 10 End Sub 

在Macro1中,我们使用了“ A”变量,在Macro2中,我们使用了“ B”变量。现在,如果您尝试运行代码,我们将收到VBA错误,显示为“ ByRef参数类型不匹配”。

如您所见,变量“ B”已突出显示,因为变量名称的类型不匹配。

解决方案: 为了克服这个问题,我们需要确保两个过程中的变量名都是正确的。

错误原因2:不同的可变数据类型

即使变量名相同,它仍然会导致错误,这是由于我们分配给它们的数据类型所致。看下面的代码。

代码:

 Sub Macro1()Dim A作为整数A = 50 Macro2 A MsgBox A结束Sub Sub Sub Macro2(ByRef A如Long)A = A * 10 End Sub 

在上面的代码中,我在Macro1中将变量“ A”声明为Integer数据类型,在Macro2中,相同的变量被分配了数据类型为“ Long”。

当我们运行此代码时,它将导致vba错误“ ByRef参数类型不匹配”。

这是因为我们为同一变量名称分配了两种不同的数据类型。

解决方案: 这两个过程中的数据类型应该相同。

错误原因3:一个宏中缺少可变数据类型

Excel VBA错误“ ByRef参数类型不匹配”可能由于在一个宏中分配而在另一个宏中未分配数据类型而发生。

代码:

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

在上面的Macro1代码中,我没有声明任何变量,而是简单地将值赋给了该变量。

另一方面,对于Macro2,我已将变量“ A”声明为long。如果尝试运行此代码,将导致“ ByRef参数类型不匹配” VBA错误。

解决方案1: 为了避免这种情况,第一个解决方案是在两个过程中都声明变量并分配相同的数据类型。

解决方案2:替代方法 解决方案是通过在模块顶部添加“ Option Explicit”一词来使变量声明成为强制性的。

这样做是在显示VBA“ ByRef参数类型不匹配”错误之前,它实际上要求我们首先声明该变量。

因此,Option Explicit在VBA中总是派上用场。

要记住的事情

  • ByRef与By Val相反。
  • ByRef将引用从一个过程传递到另一个过程。
  • 这两个过程中的变量名称,数据类型应相同。
  • 如果有多个变量,则需要分别声明每个变量。