Chr*_*our 14 excel vba excel-vba
单元格的内容A1是=test(2)其中test的功能是:
Function test(ByRef x As Double) As Double
  Range("A2") = x
  test = x * x
End Function
你能解释一下为什么这会#VALUE!在细胞中产生A1而在细胞中A2什 我希望A2包含2和A1包含4.没有该行,Range("A2") = x该函数按预期工作(平方单元格的值).
令人困惑的是,如果你test用子程序包装calltest然后它可以工作:
Sub calltest()
  t = test(2)
  Range("A1") = t
End Sub
Function test(ByRef x As Double) As Double
  Range("A2") = x
  test = x * x
End Function
但事实并非如此
Function test(ByRef x As Double) As Double
  Range("A2") = x
End Function
Kaz*_*wor 10
由于Function基本原理表明您无法更改或设置表格单元格.您需要删除该行Range("A2") = x
编辑一些额外的链接(我认为这对于那些想要分析UDF主题的人来说总是很有用):由Microsoft创建自定义函数
是的,您可以拥有自己的用户定义函数,将值写入任何单元格,而不仅仅是您在公式中键入的单元格。
这是一个简单的例子。UDF 函数接受两个参数 A 和 B,并返回它们的乘积 A*B。但有趣的是,它返回我们输入公式的单元格右侧相邻单元格中的结果。
将此代码放入标准 VBA 模块中:
Function UDF_RectangleArea(A As Integer, B As Integer)
    Dim MagicSpell As String
    MagicSpell = "Adjacent(" & Application.Caller.Offset(0, 1).Address(False, False) & "," & A & "," & B & ")"
    Evaluate MagicSpell
    UDF_RectangleArea = "Hello world"
End Function
Private Sub Adjacent(CellToChange As Range, A As Integer, B As Integer)
    CellToChange = A * B
End Sub
现在输入B2公式:=UDF_RectangleArea(3,4)
该函数在两个单元格中返回结果:“Hello world” B2(这并不奇怪)和矩形区域C2(这是一只戴着帽子的兔子)。这两个结果以及“兔子”出现的地方都可以轻松定制。该工作由 VBA EVALUALTE命令完成。MagicSpell在这种情况下Adjacent(C2,3,4),变量的值在返回 UDF 结果之前从 UDF 内部触发。玩得开心!
从工作表单元格调用函数时,您实际上将该函数用作用户定义函数,该函数具有此处所述的限制:
http://support.microsoft.com/kb/170787
在文中有一行:
应通过使用Visual Basic子例程进行任何环境更改.
他们如何使用这个词很有意思应该,而不是必须的.我想知道KB的作者是否知道VBA功能可能会发生环境变化.
现在,当您从另一个VBA子/函数调用该函数时,它将被区别对待.从帮助文档(抱歉,我找不到网页参考 - 基本上,在VBE中,突出显示单词Function并按F1键):
与Sub过程类似,Function过程是一个单独的过程,可以接受参数,执行一系列语句,并更改其参数的值.但是,与Sub过程不同,当您要使用函数返回的值时,可以使用表达式右侧的Function过程,就像使用任何内部函数(如Sqr,Cos或Chr)一样. .
所以听起来像Subs和函数在仅在VBA中使用时可以做同样的事情,除了函数可以将值返回给调用函数/ sub.
实际上,这非常有趣,因为Excel可以调用对Excel环境具有某种"只读"限制的函数.
我认为,最终,Excel可以以与VBA不同的方式从工作表单元调用该函数.当您从Cell调用它时,它被视为用户定义函数,其中包括更改Excel环境的限制.从VBA中调用的地方(来自一系列调用的原始调用者来自VBA),它具有Sub所具有的所有功能,并且它可以返回值.
| 归档时间: | 
 | 
| 查看次数: | 30586 次 | 
| 最近记录: |