在VBA中使用函数内的数组

时间:2015-08-03 08:41:51

标签: excel vba excel-vba user-defined-functions

我似乎无法找到这个问题的答案:我可以在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.

为了让我的任务尽可能简单,我希望这会发生吗?

  1. 在某些Subprocedure中生成尺寸为100 * 100 * 3的3D数组,并使用与此处问题无关的函数将其填充值。
  2. 生成一个函数(MYOWNFUNCTION),该函数使用此先前生成的3D数组中的数据,并找到最接近的组合或值对N和M,它们是用户给定的输入。
  3. 我可以在Excel单元格中使用我选择的N和M插入= MYOWNFUNCTION(N,M)并获得相应的结果。通过对应我的意思是例如3Darray(14,14,1)用参数(14,14)表示N的值,3Darray(14,14,2)用参数(14,14)表示M的值和值(14,14,3)是我想要归还的值。 MYOWNFUNCTION函数遍历3Darray值并找到用户给定输入值的最接近匹配。
  4. 我不在同一个函数中创建3D数组的原因是它非常大并且需要几秒钟才能生成。我只是想使用生成的3Darray的数据,所以我只需要计算一次。

    我希望这是有道理的。

3 个答案:

答案 0 :(得分:1)

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

  • 创建一个模块并将SumArray放入模块中(如果函数不在模块中,它就不起作用)
  • 您无法将数组作为参数传递给它,因为Excel不理解

你有一些选择:

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

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

其他情况:确切地说明您必须使用哪个阵列,我们将了解如何操作

答案 1 :(得分:1)

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. 使用图中所示的功能。 enter image description here

答案 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 之间的主要区别是:

  1. .Value2为您提供单元格的基础值(无格式数据)
  2. .Value为您提供单元格的格式化值
  3. 有关详细信息,请查看Charles William's blog here.