【问题标题】:VBA Passing a Range Name from a Different Worksheet to a FunctionVBA将范围名称从不同的工作表传递给函数
【发布时间】:2015-04-09 01:27:11
【问题描述】:

也许我在这里尝试做的太多了,但我已经为此工作了几个小时,但没有运气。我希望你能帮忙。

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

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

这是我的有效代码:

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 是命名列。

我不喜欢使用列名。它只是让它更具可读性(对我来说,无论如何!)。

这个可以吗?

【问题讨论】:

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


    【解决方案1】:

    Range("named range")WorkBook 中返回一个范围,因此最好将其传递给您的函数,该函数需要一个范围。

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

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

    按 cmets 更新

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

    用法:

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

    注意:

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

    【讨论】:

    • 哎呀!谢谢你的回复,弗里曼。不,没有列名 ColumnToAdd。我打算将它作为函数内部的变量。如果可能的话,我想做的是将我希望求和的列的名称传递给函数。我可以这样做吗?
    • 我确信我们已经接近了,但仍然没有雪茄。在上面的 Usage cmets 中,您注意到该函数是从 VBA 调用的(例如,另一个函数或 Sub)。那不是我想做的。
    • 我想在工作表的多个单元格中调用该函数,例如=PayPerMonth(SBTSADV)、=PayPerMonth(MBPADV) 等,其中参数是另一个工作表上的命名列。这个简单的总和实际的最终函数要复杂得多。这就是为什么我想在单元格中调用一个函数。我遇到的唯一障碍是将列的名称传递给函数,然后在我的计算中使用它。我尝试了您的“每个 cmets 更新:”,但没有成功。
    • 当它被传递到你的函数时,你得到的参数值到底是什么?你有没有在第一行设置断点来查看ColumnToAdd 指向的内容?您可能需要使用Indirect() 来获取它来引用单元格的地址。类似于=PayPerMonth(Indirect(<namedRange>))
    • 你的问题很好,FreeMan。正在通过什么?我不知道如何找到它。从工作表 (=PayPerMonth(INDIRECT('Client Payments'!C:C))) 调用函数时,我尝试直接引用该列,但这并没有改变。估计做不到有趣的是,我认为这将是很多人想做的事情,即将一个范围传递给一个函数,然后对其进行操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-01
    • 2015-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多