我需要写一个Function,实现这样的功能,
Function Func1( rng As Object ) As Variant
输入是在单元格上选定的多个整数,例如12个,通过计算会得到四个Double,
选定B1:B4,键入公式={Func1(A1:A12)},在B1到B4得到四个Double的值,该如何实现,谢谢。

解决方案 »

  1.   

    在单元格内显示的内容,不是“数值”就是文本,因此你把函数返回值类型定为 Variant 没有什么意义。
    应该按你的实际情况选择合适的类型,你这儿就应该选为 Double类型。
    Function Func1(rng As Range) As Double
    ' 我不知道你的具体算法是什么,
    ' 就简单的做了个“数值求和”示例
       Dim v As Double
       Dim i As Long   v = 0#
       For i = 1 To rng.Rows.Count
          v = v + rng.Cells(i, 1).Value
       Next
       Func1 = v
    End Function一个函数只能返回一个值(返回“数组”时除外,但单元格内不可能显示“数组结果”),
    你的B1:B4 也不可能一次就把公式输入了;至少你得先在B1输入公式,然后把公式复制到下面3个单元格。
    看样子,实际是你的这“一组数据”,经计算有“4个结果数据,分别显示在4个单元格中”,
    那么,其实你就应该给函数增加一个参数,指定它“返回第几个参数”。
    这样,你的函数就应该定义为:
    Function Func2(rng As Range, w As Long) As String
       ' 开始一系列的计算…………
       ' …………
       ' …………
       ' …………
       ' 按 w 值,返回相应的结果
       Select Case w
          Case 1:  Func2 = "第⑴个结果"
          Case 2:  Func2 = "第⑵个结果"
          Case 3:  Func2 = "第⑶个结果"
          Case 4:  Func2 = "第⑷个结果"
          Case Else:  Func2 = "参数错误"
       End Select
    End Function
    然后,在B1输入公式: =Func2($A$1:$A$12,ROW())
    再选定B1单元格,鼠标拖动复制公式到下面几个单元格就行了。
    (注意: Func2() 的代码,你自己参照这个改一下)
      

  2.   

    我的返回值不能是Double,实际上我输入的12个值,经过计算后得到4个Double,我需要在四个单元格中显示这四个值,第二个方法也是有问题的,这12个值,我需要经过比较复杂的计算,这个计算过程在C中用DLL实现的,所以我不可能调用4次,太费时间。
      

  3.   

    你既然要用“公式”,那么函数被多次调用是不可避免的。
    Excel表格本来就是这个屌样。
    如果要想提高效率,那么你就不要用公式。
    在表格中画一个按钮,编写对应的事件代码。
    如果数据源的位置和区域、输出数据位置都是固定的,那么直接调用事件过程。
    简单的说,就是直接在过程中,从A1到A12读取数据,调用DLL进行计算,然后把结果填到B1到B4中。
    如果数据源不固定,那么在按钮事件过程中,用输入框询问数据源区域、输出位置。
    比如询问数据源,你输入 A1:A12,那么过程中就从A1到A12读取数据;
      询问输出位置,你输入B1,那么计算结果从B1开始,连续的4个单元格中输出这4个数据。
    其余类推。