在VBA中使用函数内的数组

我似乎无法find这个问题的答案: 我可以在Excel VBA中创build一个用户定义的函数,使用某个子过程中的数组,然后在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的单元格返回一个值(这是Total)

提前致谢!


增加了更多信息

感谢您的答案! 不过,我会尝试从不同的angular度重新提出我的问题。 我最终想要实现的是一个用户定义的函数,我可以在任何Excel单元格中使用,例如“= MYOWNFUNCTION(N,M)”,它将两个参数作为input:值N和值M.使用这些值“MYOWNFUNCTION”从在单独的Sub()中指定和生成的3D数组中find值N和M中最接近的“组合”,并从3D数组的第三个轴的第三行返回相应的值。 3Darrays的第一行和第二行分别是N和M.

所以为了使我的任务尽可能简单,我希望这发生?

  1. 在某些子过程中生成尺寸为100 * 100 * 3的三维arrays,并使用与此问题无关的函数填充值。
  2. 生成一个函数(MYOWNFUNCTION),该函数使用之前生成的3D数组中的数据,并find最接近的组合或者一对值N和M,它们是用户给定的input。
  3. 我可以插入=我的selectN和M在Excel单元格中的= MYOWNFUNCTION(N,M),并获得相应的结果。 对应的意思是,例如3Darray(14,14,1)代表参数(14,14)的N的值,3Darray(14,14,2)代表参数(14,14)的M的值, (14,14,3)的价值是我想要返回的。 函数MYOWNFUNCTION遍历3Darray值并查找用户给定input值的最近匹配。

之所以我不在同一个函数中创build3D数组,是因为它非常大,需要几秒钟的时间才能生成。 我只是想使用生成的3Darray的数据,所以我只需要计算一次。

我希望这是有道理的。

就像美国总统说的那样:是的,你可以!

  • 创build一个模块,把你的SumArray放在模块中(如果函数不在模块中,则不起作用)
  • 你不能传递一个数组作为参数,因为Excel不理解

你有一些select:

如果它始终是相同的子过程:直接检索SumArray函数中的数组

如果数据来自Excel工作表:在函数中传递一个范围函数SumArray(byval rng as Range) As Long并将此范围用作数组

其他情况:如何确定你要使用哪个数组,我们将看看如何去做

Excel不知道如何将范围转换为一个值的数组没有明确的指示。 您可以传递Range作为参数,然后遍历范围中的单元格。

  1. 在您的VBA项目中插入一个新模块
  2. 粘贴在这个代码中:

     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 
  3. 使用图中所示的function。 在这里输入图像说明

你可以,但是你需要指定什么样的数组

如果你正在讨论一个VBA数组 ,如你的例子中的Arr() As Long你已经有了你的例子的语法,但是你不能直接在你的函数中input一个VBA数组到Excel的单元格中。

如果您正在讨论Excel中数组 (多个单元格的范围),只需更改该函数以input一个Range ,然后将其转换为数组 ,请看下面的代码:

 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主要区别是:

  1. .Value2给出了单元格的基础值(未格式化的数据)
  2. .Value为您提供单元格的格式化值

欲了解更多详情,请在这里查看Charles William的博客。