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

问题描述 投票:0回答:1

您好我正在尝试此代码将范围作为输入并在工作表中显示一些其他值。 addtwo函数的参数是变量,TableOfValues的第一个值是表中值的总数。例如我做的:我选择单元格(“B1”到“B5”)键入我的addtwo(A1:A5)我希望结果的单元格是单元格“A1”到“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
excel vba excel-vba
1个回答
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循环在输入范围的行计数处停止。我不确定为什么你希望你的代码迭代到第一个单元格中值的两倍(为什么表的长度的两倍?)。

虽然你不必使用第一个单元格作为表格大小(我注意到我根据输入范围的大小调整输出大小 - 我碰巧跳过了添加2以匹配您的意图时的第一行)。

© www.soinside.com 2019 - 2024. All rights reserved.