2013-05-02 143 views
3

我试图使我的工作UDF(在Excel 2003),和调试问题后会出现在我的函数的这个浓缩版被概括为:VBA输出写入单元 - #VALUE!错误

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!错误有关,尽管我使用MsgBox这表明函数确实有一个数值。

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

另外:是什么

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

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

其中 B是一些数值之间的差异?

感谢

+0

是否想从VBA代码或Sheet工作表调用您的函数? – 2013-05-02 09:17:30

+0

此外,您可以从另一个工作表单元检查[this](http://stackoverflow.com/a/15659852/2143262),也可以检查 – 2013-05-02 09:19:11

+0

,例如, A2 – user2342380 2013-05-02 09:55:55

回答

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

它们是相同的。

0

你是对的(在您的评论),一个UDF不能变化片,只返回一个值。

如果您从UDF调用SubFunction并尝试更改工作表,那么这将保持true事件。它也会失败。

注:还有一个(相当丑陋的)解决:看this answer