gpt4 book ai didi

vba - 将数组传递给 UDF;优邦德

转载 作者:行者123 更新时间:2023-12-02 17:32:26 26 4
gpt4 key购买 nike

令人沮丧的是,我似乎已经在我的第一个 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 均应为一维数组。 (或者范围?或者这就是问题所在?)

如何修复第一段代码?

我在 Google 上搜索了又搜索,但还是没有找到答案。

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

-1000 2013 年 12 月 31 日
-10 2014 年 12 月 31 日
30 2015 年 3 月 13 日
1200 2015 年 3 月 17 日
-40 2015 年 6 月 30 日
1300 2016 年 9 月 30 日
1200 2017 年 10 月 31 日
1250 2018 年 11 月 30 日
1500 2018 年 12 月 31 日

最佳答案

将数组传递给 UDF 时的问题在于您对数组和范围的理解。一般来说,范围以二维数组的形式呈现,即使它们是单行或单列也是如此。

要使您的代码正常工作,请尝试“双重转置技巧”,其大致如下:

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 是一个二维数组,尽管它只在一行上:

enter image description here

注释此部分或将其更改为 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 在评论中提到的,myArr() 数组的值最多可达第 65536 列,因为 Transpose() 可能是这样制作的出于与 Excel 2003 的兼容性原因。要制作更大的数组 - Put entire column (each value in column) in an array?

关于vba - 将数组传递给 UDF;优邦德,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47531727/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com