VBA将范围名称从不同的工作表传递给函数

时间:2015-04-09 01:27:11

标签: function excel-vba parameter-passing named-ranges vba

也许我想在这里做太多,但我已经工作了好几个小时而没有运气。我希望你能提供帮助。

我正在创建一个函数,其唯一参数是同一工作簿中另一个工作表上的命名范围。我的问题是我无法弄清楚如何将该名称传递给函数并使用它。

我的目标是调用函数来对另一个工作表上命名范围指定的列求和,称为客户付款。

这是我的代码:

Function PayPerMonth()
PayPerMonth = Application.WorksheetFunction.Sum(Worksheets("Client Payments").Range("C:C"))
End Function

我得到一个正确的总数,但当然我在函数中指定了列。不太有用。

以下是我尝试的不起作用:

Function PayPerMonth(ColumnToAdd)
PayPerMonth = Application.WorksheetFunction.Sum(Worksheets("Client Payments").Range("ColumnToAdd"))
End Function

当我删除ColumnToAdd周围的引号以及我尝试过的许多其他变体时,它不起作用。

我想要做的是输入= PayPerMonth(MBPADV)或= PayPerMonth(SBTSADV)等来调用函数并瞄准右列,其中MBPADV和SBTSADV被命名为列。

我没有挂断使用列名。它只是让它更具可读性(无论如何!)。

可以这样做吗?

1 个答案:

答案 0 :(得分:0)

Range("named range")会返回 WorkBook 中的范围,因此最好将其传递到需要范围的函数中。

假设您在工作簿中有一个名为ColumnToAdd的命名范围,这应该有效:

Function PayPerMonth(ColumnToAdd)
  PayPerMonth = Application.WorksheetFunction.Sum(Range("ColumnToAdd")
End Function

每条评论更新

Function PayPerMonth(ColumnToAdd As Range)
  PayPerMonth = Application.WorksheetFunction.Sum(Range(ColumnToAdd))
End Function

用法:

Dim MyRange as Range
MyRange = Sheet.Columns("C")
Amount = PayPerMonth(MyRange)

注意:

您的函数调用将返回一个变体。您可能需要在As Integer末尾声明As SingleAs FloatFunction PayPerMonth(ColumnToAdd As Range)以帮助A)加快处理速度,因为Excel不会花时间试图找出它使用的变量类型,以及B)在维护代码时自己/下一个编码器 - 明确使代码更具可读性。