VBA将参数作为变量传递给函数并返回范围

时间:2018-03-05 00:05:52

标签: excel vba excel-vba

您好我尝试使用此代码将范围作为输入并在工作表中显示其他一些值。 addtwo函数的参数是变量,TableOfValues的第一个值是表中值的总数。例如我做的事情:我选择单元格(" B1"到" B5")键入我的addtwo(A1:A5)我希望结果的单元格是单元格" A1& #34;到" A5",在单元" A1"我有5个(表格中有5个单元格)我尝试使用ctrl + shift

在单元格中显示它们(" B1"到" B5")
      Function addtwo(ParamArray TableOfValues() As Variant) As Variant
      Dim UResult() As Double
      'table that would be passed to addtwo
      ReDim UResult(TableOfValues(0)) As Double
      'TableOfValues(0) contains the length of the table
      UResult(0) = TableOfValues(0)
      For i = 1 To 2 * TableOfValues(0)
          UResult(i) = TableOfValues(i) + 2
      Next
      addtwo = UResult
      End Function

1 个答案:

答案 0 :(得分:0)

首先,我不确定您的问题是否表明您正在尝试使用数组公式。我通过使用Ctrl-Shift来收集它。但读这篇文章的人可能没有意识到这一点(我可能错了,在这种情况下我的回答不会起作用)。

这假设公式是数组公式={addtwo(vertical_range)}

试试这个:

Function addtwo(TableOfValues As Range) As Variant
    Dim UResult() As Double
    ReDim UResult(1 To TableOfValues.Rows.Count, 1 To 1) As Double
    UResult(1, 1) = TableOfValues.Cells(1)
    For i = 2 To TableOfValues.Rows.Count
        UResult(i, 1) = TableOfValues.Rows(i).Cells(1).value + 2
    Next
    addtwo = UResult
End Function

与您的代码的差异:

  • 返回每行(索引1)的第一个元素(索引2)中具有所需值的二维数组。我碰巧在这里使用了基于1的索引,没有特别的原因(碰巧匹配Excel的基于1的行和单元格的索引)。
  • 它需要Range个对象而不是ParamArray。我认为你所做的事情是可能的,但是不必解开那个ParamArray就好了。
  • 我的FOR循环在输入范围的行数处停止。我不确定为什么你希望你的代码迭代到第一个单元格中值的两倍(为什么是表格长度的两倍?)。

我保持第一个单元格的值与您的描述相同,但您不必使用第一个单元格作为表格大小(请注意我根据输入范围的大小调整输出大小 - I恰好在添加2时跳过第一行以匹配你的意图。