ByRef 参数类型不匹配 - Excel VBA

Posted

技术标签:

【中文标题】ByRef 参数类型不匹配 - Excel VBA【英文标题】:ByRef argument type mismatch - Excel VBA 【发布时间】:2016-03-29 17:45:38 【问题描述】:

下午,

我有一个函数可以根据日期计算工作日名称:

Function calcWeekdayName(calcDate As Date) As String

Dim calcWeekday As Integer
calcWeekday = Weekday(calcDate, vbMonday)

calcWeekdayName = weekdayName(calcWeekday, True, vbMonday)

End Function

然后我使用公共变量将日期传递给此函数。公共变量在工作表 2 上声明:

Public searchDate As Date

然后在我的函数下面的 sub 中设置变量:

searchDate = Worksheets("Update Data").Range("B3").Value

更新数据上的 B3 格式为 dd/mm/yyyy

当我尝试使用函数和 searchDate 变量设置变量 weekdayName 时,我得到 ByRef 参数类型不匹配。

在第 2 页上:

 Public weekdayName As String

在子中:

 weekdayName = calcWeekdayName(searchDate)

B3 的当前值为 28/03/2016,但我也尝试过 01/01/2016。

干杯

【问题讨论】:

Option Explicit作为你所有代码模块的第一行。 当我使用公共变量时?所以我需要在每个模块中重新调整它们? @megatron77 - 回答你的问题,不。不过,我将帮助确定您是否有范围问题。 “然后将变量设置在我的函数下方的sub中”到底是什么意思。我猜无论编译器以searchDate 传递的任何内容都不是您拨打电话时的日期。 由于您的变量位于对象模块中(而不仅仅是模块),您需要通过包含对象名称的全名来访问它们,例如Sheet2.searchDate。使用Option Explicit 可以帮助您识别这种类型的错误,因为显然在您使用searchDate 时,它是Variant 类型的未声明变量。在修复该问题之后(并且仅在此之后),您应该真正将函数的签名更改为 ByVal calcDate As Date @GSerg 感谢使用对象名称。 【参考方案1】:

Sheet2 是一个工作表对象 - 它的代码隐藏是一个类模块

类模块和“标准模块”的不同之处在于它们的Public 成员需要实例 才能访问。

所以你可以使用Sheet2.MyPublicVariable = 42,但你不能只使用MyPublicVariable = 42除非你在声明该变量的同一个模块中

通过在模块顶部指定Option Explicit 可以避免您的问题;然后,searchDate 将无法访问,因此未声明,VBA 代码将拒绝编译。

通过指定Option Explicit,您允许使用未声明的变量,这就是VBA中万恶之源。

使用。选项。明确的。

【讨论】:

【参考方案2】:

WeekDayName 变量有问题。您应该将其重命名为 myWeekDayName 以避免与同名的 VBA 函数混淆。

Public searchDate As Date
Public myWeekDayName As String

Function calcWeekdayName(calcDate As Date) As String
    Dim calcWeekday As Integer
    calcWeekday = Weekday(calcDate, vbMonday)
    calcWeekdayName = VBA.weekdayName(calcWeekday, True, vbMonday)
End Function

Sub test()
    searchDate = Worksheets("Sheet1").Range("B3").Value
    myWeekDayName = calcWeekdayName(searchDate)
End Sub

【讨论】:

以上是关于ByRef 参数类型不匹配 - Excel VBA的主要内容,如果未能解决你的问题,请参考以下文章

从被调用的函数调用函数时 VBA byref 参数类型不匹配

excel 宏:ByRef 参数类型不匹配

ByRef 参数类型与布尔值不匹配

VBA ByRef Argument Type Mismatch string into string

在 VBA Excel 2007 中传递变体 ByRef

optional [byval byref] [paramarray] 变量名() as 数据类型