从函数返回数组时类型不匹配
Posted
技术标签:
【中文标题】从函数返回数组时类型不匹配【英文标题】:Type mismatch when returning an array from a function 【发布时间】:2017-02-13 12:01:40 【问题描述】:我正在尝试创建一个函数,用于在 subs 中创建一个月中实际天数的数组。我无法通过直接使用即时窗口或使用子窗口来运行该功能。该函数的代码如下(Debug.Print
实例已被删除,因为它们甚至从未触发):
Function GenererDager(ByVal month As Integer, ByVal year As Integer) As Integer
Dim dateFormat As String, daysArr() As Integer, actualDays As Integer
actualDays = 1
' Find the number of actual days in given month
For dayCheck = 1 To 31
dateFormat = month & "/" & dayCheck & "/" & year ' mm/dd/yyyy format
If IsDate(dateFormat) Then
actualDays = actualDays + 1
Else
Exit For
End If
Next dayCheck
' Redimension the array with the actual number of days in the month
ReDim daysArr(actualDays)
' Populate the array with the correct number of days
For daysToArray = 1 To actualDays
daysArr(daysToArray) = daysToArray
Next daysToArray
GenererDager = daysArr
End Function
使用带有GenererDager(2, 2017)
的即时窗口运行该函数会产生以下错误消息:Compile error: Expected: =
使用带有?GenererDager(2, 2017)
的即时窗口运行该函数会产生以下错误消息:Compiler error: Type mismatch
并选择了最后一次使用 daysArr
我用来调用函数的 test-sub 如下所示:
Sub HentDager()
Dim daysArray() As Integer
daysArray = GenererDager(2, 2017)
Debug.Print daysArray(4)
End Sub
在即时窗口中使用HentDager()
调用此子会产生以下错误:Compile error: Expected: =
我已经被这个问题困扰了一段时间,并且我已经多次重写代码以识别问题,但到目前为止我一直无法解决它。我可能会产生比我在此过程中修复的错误更多的错误,因为我意识到我不知道我现在真正在做什么:-)
【问题讨论】:
您规定该函数返回一个整数,但期望它返回一个数组。 另一点要提出的是,您使用实际天数的值重新调整 daysArr。鉴于选项基本默认值为 0,那么您实际上将其标注为(0 到 x),然后将其视为 1 的基数。理想情况下,使用 Redim daysArr(1 to actualDays) 适当地设置您的最小值/最大值。 【参考方案1】:您必须将您的对象和函数声明为 Variant 才能传递数组。
此外,您的函数需要进行一些更改:
actualDays = actualDays - 1
因为您返回了第一个不是日期的值!
ReDim daysArr(1 To actualDays)
避免在数组的第一个索引上出现空值,
这本来是daysArr(0)
工作功能(已测试):
Function GenererDager(ByVal month As Integer, ByVal year As Integer) As Variant
Dim dateFormat As String, daysArr() As Variant, actualDays As Integer, dayCheck As Integer, daysToArray As Integer
actualDays = 1
' Find the number of actual days in given month
For dayCheck = 1 To 31
dateFormat = month & "/" & dayCheck & "/" & year ' mm/dd/yyyy format
If IsDate(dateFormat) Then
actualDays = actualDays + 1
Else
Exit For
End If
Next dayCheck
actualDays = actualDays - 1
' Redimension the array with the actual number of days in the month
ReDim daysArr(1 To actualDays)
' Populate the array with the correct number of days
For daysToArray = 1 To actualDays
daysArr(daysToArray) = daysToArray
Next daysToArray
GenererDager = daysArr
End Function
测试:
Sub HentDager()
Dim daysArray() As Variant
daysArray = GenererDager(2, 2017)
'Display last day of the month in the immediate window
Debug.Print daysArray(UBound(daysArray))
End Sub
经过一番反复试验,这里是一个使用Integer
的示例:
Sub TestIntSub()
Dim TestInt() As Integer
TestInt = FctIntArr
Debug.Print TestInt(1) & "|" & TestInt(2)
End Sub
Public Function FctIntArr() As Integer()
Dim IntArr() As Integer
ReDim IntArr(1 To 2)
IntArr(1) = 545
IntArr(2) = 232
FctIntArr = IntArr
End Function
【讨论】:
啊,是的,确实有效。很好地从实际天数中减去,我没听懂。我想我的主要问题是我试图将数组作为整数而不是变体传递? @M.A. : 是的,原来如此!如果您知道数组中将包含什么类型的数据,那么精确定义数组的类型似乎很诱人,但它(充其量)几乎每次都没有用。 所以换句话说,每当我需要返回一个数组时,我通常应该坚持使用 Variant 吗? :-) @M.A. : 确切地! ;) 这将有助于将来参考,非常感谢!【参考方案2】:你需要正确定义函数的返回类型-
Function GenererDager(ByVal month As Integer, ByVal year As Integer) As Integer
改成
Function GenererDager(ByVal month As Integer, ByVal year As Integer) As Variant
【讨论】:
在更改之后,代码似乎正在运行(Debug.Print 正在触发),但我仍然收到Run-time error '13': Type mismatch
@M.A. :您必须将所有内容更改为Variant
,请查看我的答案以获取更多详细信息/更正
@M.A.检查 R3uK 的答案,它更彻底。您的问题在于将变量声明为无法处理数组的类型。在你的情况下,我nteger
现在说得通了,在阅读教程之间的某个地方处理数组时,我一定对声明数据类型感到困惑【参考方案3】:
似乎是错误的事情很少
你的函数返回值实际上是一个整数而不是整数()
不是将 daysarray 调暗为数组,而是将其调暗为变体并分配值
【讨论】:
Dim TestInt as Integer()
会抛出一个Syntax Error
,请在发帖前检查一下
实际上尝试将函数返回值声明为 integer(),就像函数genererdager(byval month as integer,byval year as integer) as integer() 我检查了代码,它运行没有错误。我使用 excel 2016。不过我不确定其他版本。
抱歉这么生硬,这个函数确实有效,但是你必须对变量做一些不同的事情。我在答案中添加了一个示例以提供一个工作示例!
啊,很好@SivaprasathV。这是我完全没有考虑到的。我重写了代码以使用 Variant - 我想因为它是 Variant 数据类型,所以不需要括号?以上是关于从函数返回数组时类型不匹配的主要内容,如果未能解决你的问题,请参考以下文章
从数组中查找并返回第一个匹配的子文档(Meteor / Mongo)