3

我正在尝试使我的 UDF 工作(在 Excel 2003 中),在调试之后,问题似乎在我的函数的这个精简版本中得到了总结:

Function btest(b_1 As Double) As Double    
    btest = 1    
    Worksheets("Sheet1").Range("A1").Value = b_1
    '^this is the bit I want to work but doesn't^
    End Function

这模拟了我的真实函数,该函数在以下未执行的单元格输出行之前分配了一个没有问题的值。我相信这与#VALUE!我得到的返回错误有关,即使我使用的 aMsgBox表明该函数确实有一个数值。

任何人都可以阐明这一点吗?

另外:有什么区别

Worksheets("Sheet1").Cells(1, 1) = B

Sheets("Sheet1").Range("A1").Value = B

其中 B 是某个数值?

谢谢

4

2 回答 2

1

正如你已经意识到的那样

看起来问题是任何UDF都不允许编辑工作表,只返回一个值......所以如果我想在同一过程中编辑另一个单元格,我需要使用一个子“

标准UDF 无法更改工作表。

但就您的后续评论而言

这是正确的,如果是这样,我将如何处理 - 函数中的子函数或子函数中的函数?我希望我的电子表格能够像使用函数一样自动对输入做出反应——不需要按钮或特殊操作。

您可以使用事件

举个例子:

  • 您想在某个工作表上跟踪 A1:A10 以进行输入
  • 如果使用此区域,则要设置Worksheets("Sheet1").Range("A1").Value为该值

问题 1

  1. 右键单击要跟踪的工作表的选项卡
  2. 查看代码
  3. 复制并粘贴下面的代码 4 按返回 Excel

代码

Private Sub Worksheet_Change(ByVal Target As Range)
Dim rng1 As Range
Set rng1 = Intersect(Target, Range("a1:10"))
If rng1 Is Nothing Then Exit Sub
Application.EnableEvents = False
Worksheets("Sheet1").Range("A1").Value = rng1.Value
Application.EnableEvents = True
End Sub

问题2

它们是相同的。

于 2013-05-02T11:29:46.820 回答
0

您是对的(在您的评论中)UDF 不能更改工作表,只能返回一个值。

如果您从 UDF 调用SuborFunction并尝试更改工作表,则此事件为真。它也会失败。

注意:有一个(非常丑陋的)解决方法:请参阅此答案

于 2013-05-02T11:18:09.267 回答