【问题标题】:Add two cells in Custom Function without Parameters在没有参数的自定义函数中添加两个单元格
【发布时间】:2015-12-01 16:51:46
【问题描述】:

我正在尝试学习 VBA for Excel。我正在观看有关 VBA 中自定义函数/用户定义函数的教程。我试图创建一个用户定义的函数,但它在我输入函数名称的单元格中显示#REF! 错误。我正在尝试添加 (A Cell + B Cell),而不向函数传递任何参数/参数。我正在使用 Offset 遍历具有公式函数的单元格左侧的 1,2 个单元格。这是我的代码:

Option Explicit

Function ADD12()
Dim Number_1 As Integer
Dim Number_2 As Integer

Number_2 = ActiveCell.Offset(0, -2).Value
Number_1 = ActiveCell.Offset(0, -1).Value
ADD12 = Number_1 + Number_2
End Function

我的工作表截图:

【问题讨论】:

  • @pnuts 是否已就标签达成共识或提出共识?顺便说一句,最近糟糕的问题数量似乎大幅增加。

标签: vba excel user-defined-functions


【解决方案1】:

#REF 错误是因为您不能使用单元格地址作为函数名。

但也要注意 ActiveCell 总是在变化的。您可能想查看Caller 以获取函数所在的单元格。

例如:

Option Explicit

Function ADD_12()
Dim Number_1 As Integer
Dim Number_2 As Integer
Dim R As Range

Set R = Application.Caller

Number_2 = R.Offset(0, -2).Value
Number_1 = R.Offset(0, -1).Value
ADD_12 = Number_1 + Number_2
End Function

【讨论】:

  • 谢谢!那解决了!由于我仍在学习 VBA,您能否提供任何信息,为什么 ADD12 是单元格地址?
  • @mk117 引用Excel常用A1表示法中第12行第784列的单元格
  • 好的!我没有意识到这一点!列按字母顺序排列,而行按数字排列!谢谢!
  • ++ Nice :) BTW 如果数字是固定的,您可以使用Integer 代替Long,例如For i = 1 to 5。在这里,如果您将i 调暗为Integer,则应该没有问题。但是在上述情况下,Excel 表中的数字可能会发生变化,因此建议使用Long。就“效率”而言,它实际上可以忽略不计:) Interesting Read
  • 另一个Interesting Read
【解决方案2】:

您面临的问题是您为 UDF 选择的名称是非法的。

ADD12 是工作表上单元格的地址。这保证了引用错误并且您的 UDF 永远不会被调用。

将名称更改为不是单元格地址的名称,例如ADD12_

Caller 是做你所追求的正确方法,除非你真的希望它从选定的单元格计算。这两种方法都可以保证您的函数是非易失性的,这意味着如果您更改其中一个依赖值,它不会自动更新结果。

您应该使用 Long 变量类型而不是整数。

【讨论】:

  • 255 与这里的任何事情无关。 Integer 数据类型对 -32,768 到 32,767 范围内的数字有效。但我同意 Long 数据类型通常应该在现代版本的 Excel 中使用,我被告知它更有效。
  • 是否应该始终使用Long 而不是Integer?即使这个数字永远不会接近整数的极限?
  • @BruceWayne 是的。 VBA 针对 Long 进行了优化。它更有效地处理它们,因此更快。显然,它们使用了两倍的内存,但这不再是一个问题,就像 25 多年前一样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多