【问题标题】:Passing arrays to UDF; UBound将数组传递给 UDF;上界
【发布时间】:2017-11-28 21:32:36
【问题描述】:

在我的第一个 VBA 项目的第一行似乎已经做错了,这很令人沮丧。本质上,我的项目已经停滞不前,因为我不知道为什么会这样:

Function TestF(Values As Variant, Dates As Variant)
    TestF = Values(2)
End Function

但这确实:

Function TestF(Values As Variant, Dates As Variant)
    TestF = UBound(Values)
End Function

(我只是想看看UBound 有效。所以,我从项目中删除了所有不相关的内容。)

其中ValuesDates 都应该是一维数组。 (或范围?或者这是问题所在?)

如何修复第一段代码?

我用谷歌搜索过,但我没有找到答案。

(Excel)“错误”是从=testf(A2:A10,B2:B10) 获取的#VALUE!,范围如下:

-1000 31-Dec-13 -10 31-Dec-14 30 13-Mar-15 1200 17-Mar-15 -40 30-Jun-15 1300 30-Sep-16 1200 31-Oct-17 1250 30-Nov-18 1500 31-Dec-18

【问题讨论】:

  • 您需要告诉我们您遇到的确切错误,并且您需要显示Values 的来源,最好是我们可以复制的格式。
  • 完成。我希望你能很容易地发现我的(思考或其他)错误!
  • @Keepthesemind 的预期结果是什么?输入这些Ranges 时的值应该是多少?
  • @ShaiRado 嗯,8 或 9 或类似的东西。
  • @Keepthesemind Function TestF 应该做什么?计算一个范围内的日期数?范围内 A 列中的正值数?究竟是什么?这将使我们更好地理解并给您最好的答案

标签: vba excel


【解决方案1】:

将数组传递给 UDF 的问题在于您对数组和范围的理解。通常,即使是单行或单列,范围也会以二维数组的形式呈现。

要使您的代码正常工作,请尝试“Double Transpose Trick”,它几乎如下所示:

Public Sub TestMe()

    Dim k As Variant

    k = Range("A2:F2")
    Debug.Print k(1)

    With WorksheetFunction
        k = .Transpose(.Transpose(k))
        Debug.Print k(1)
    End With

End Sub

上面的代码可能会导致Debug.Print k(1) 部分出现错误。这是因为k 是一个二维数组,虽然它只在一行:

评论此部分或将其更改为Debug.Print k(1, 1) 并继续.Transpose 它会将您的数组更改为一维并且它将起作用。

因此,如果您希望您的非工作公式起作用,这是一种可能的方法:

Public Function TestFormula(myValues As Variant) As String

    Dim myArr As Variant

    With WorksheetFunction
        myArr = .Transpose(.Transpose(myValues))
        TestFormula = myArr(UBound(myArr))
    End With

End Function

一些重要说明:“双转置技巧”适用于一个行范围,当这些应该转移到数组时。如果您只有一列范围,请使用“单转置”:

myArr = .Transpose(myValues)

如果超过 1 列或 1 行,请勿使用转置,因为它无法映射到一维数组。

此外,如果您传递一个单元格的范围,它将不起作用。但你会找到一些绕过它的方法。

正如@cyboashu 在 cmets 中提到的,myArr() 数组将取值到第 65536 列,因为Transpose() 是这样制作的,可能是出于与 Excel 2003 的兼容性原因。制作更大的数组 - @ 987654322@

【讨论】:

  • 谢谢。这行得通。关于那个数组/范围的事情:在双重转置技巧之后,它现在变成了一个“真正的”数组吗?还是只是看起来像的东西?
  • @Keepthesemind - 它是一个真正的一维数组。
  • 请注意。碰巧的是,both 单和双转置都可以工作。 :)
  • 只要确保你永远不会传递像 A:A 这样的东西,即一旦你的参数行超过 65536,你就会遇到各种令人讨厌的惊喜。 :)
  • 65536 是 Excels 的 Transpose 的背部限制的已知痛苦。 :) 更有趣的是 Excel 会默默地截断您的数组。至少在转置时没有抛出错误。
【解决方案2】:

您需要将正确的参数传递给您的UDF

两个参数都是Range

Function TestF(Rng1 As Range, DatesRng As Range) As Long

    Dim C As Range
    Dim x As Long

    For Each C In Rng1
        If Trim(C.Value) <> "" Then ' make sure there isn't a blank cell in the middle of your Range
            x = x + 1
        End If
    Next C
    TestF = x - 1

End Function

如果您的Range 中间没有空单元格,那么以下代码就足够了:

Function TestF(Rng1 As Range, DatesRng As Range) As Long

    Dim C As Range
    TestF = Rng1.Cells.Count - 1

End Function

【讨论】:

    【解决方案3】:

    你可能想要:

    TestF=Values(Ubound(Values))
    

    另外,你应该声明你的函数应该返回什么,比如

    Function TestF(Values As Variant, Dates As Variant) as String
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-02
      • 2021-06-19
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多