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 参数类型不匹配