从函数返回数组时类型不匹配

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 数据类型,所以不需要括号?

以上是关于从函数返回数组时类型不匹配的主要内容,如果未能解决你的问题,请参考以下文章

C ++:从函数、返回类型或引用中使用和返回字符数组?

从函数返回时访问数组元素

从数组中查找并返回第一个匹配的子文档(Meteor / Mongo)

c语言中函数返回值可以是数组、字符串和结构体吗?

Typescript 函数,它从具有正确类型的数组中返回一项

评估COM接口返回的非变量数组引起的VBScript类型不匹配错误可以通过更改语言来解决吗?