我似乎无法找到这个问题的答案:我可以在Excel VBA中创建一个用户定义的函数,该函数使用某个子过程中的数组,然后在Excel中使用该函数返回一个值吗
从这个网站(http://www.cpearson.com/excel/passingandreturningarrays.htm)我找到了这个例子:
Sub AAATest()
Dim StaticArray(1 To 3) As Long
Dim Result As Long
StaticArray(1) = 10
StaticArray(2) = 20
StaticArray(3) = 30
Result = SumArray(Arr:=StaticArray)
Debug.Print Result
End Sub
Function SumArray(Arr() As Long) As Long
'''''''''''''''''''''''''''''''''''''''''''
' SumArray
' This sums the elements of Arr and returns
' the total.
'''''''''''''''''''''''''''''''''''''''''''
Dim N As Long
Dim Total As Long
For N = LBound(Arr) To UBound(Arr)
Total = Total + Arr(N)
Next N
SumArray = Total
End Function
我应该如何在Excel单元格中使用此功能(SumArray)?
需要什么参数?
我想我已经尝试了所有可能的组合,但似乎无法让它发挥作用。 我希望带有此UDF的单元格返回一个值(总计)。
提前致谢!
感谢您的回答!但是我会尝试从不同的角度重新解释我的问题。我最终想要实现的是用户定义的函数,我可以在任何Excel单元格中使用,例如“= MYOWNFUNCTION(N,M)”,它将两个参数作为输入:值N和值M.使用这些值来表示函数MYOWNFUNCTION从指定并在单独的Sub()中生成的3D数组中找到值N和M的最接近的“组合”,并从3D数组的第三轴的第3行返回相应的值。 3D阵列的第一行和第二行分别是N和M.
为了让我的任务尽可能简单,我希望这会发生吗?
我不在同一个函数中创建3D数组的原因是它非常大并且需要几秒钟才能生成。我只是想使用生成的3Darray的数据,所以我只需要计算一次。
我希望这是有道理的。
答案 0 :(得分:1)
你有一些选择:
如果它始终是相同的子程序:直接在SumArray函数中检索数组
如果数据来自Excel工作表:传递函数函数SumArray(byval rng as Range) As Long
中的范围并将此范围用作数组
其他情况:确切地说明您必须使用哪个阵列,我们将了解如何操作
答案 1 :(得分:1)
Excel不知道如何在没有明确指示的情况下将范围转换为值数组。您可以传递Range
作为参数,然后遍历范围内的单元格。
粘贴此代码:
Public Function SumArray(Target As Range) As Long
'''''''''''''''''''''''''''''''''''''''''''
' SumArray
' This sums the values of the cells in Target and returns
' the total.
'''''''''''''''''''''''''''''''''''''''''''
Dim cell As Range
Dim Total As Long
For Each cell In Target.Cells
Total = Total + cell.Value ' You should have some code that checks that cell.Value is a number
Next cell
SumArray = Total
End Function
答案 2 :(得分:1)
你可以,但你需要指定什么类型的数组:
如果您正在谈论 VBA阵列,例如您的示例中的Arr() As Long
,您已经拥有示例的语法,但您不会能够在Excel的单元格中直接将VBA数组输入到您的函数中。
如果您在谈论Excel中的数组(包含多个单元格的范围),只需更改函数以输入Range
,然后将其转换为数组< / strong>,看看这个:
Function SumArray(RgArr As Range) As Long
Dim N As Long, _
Arr() As Long, _
Total As Long
'''''''''''''''''''''''''''''''''''''''
' Convert Range to an Array
'''''''''''''''''''''''''''''''''''''''
Arr = RgArr.Value
'or
'Arr = RgArr.Value2
For N = LBound(Arr) To UBound(Arr)
Total = Total + Arr(N)
Next N
SumArray = Total
End Function
.Value
和.Value2
之间的主要区别是:
.Value2
为您提供单元格的基础值(无格式数据).Value
为您提供单元格的格式化值有关详细信息,请查看Charles William's blog here.