我试图使我的工作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!
错误有关,尽管我使用的MsgBox
显示函数确实有一个数值。
有人能解释一下吗?
和
的区别是什么?Worksheets("Sheet1").Cells(1, 1) = B
和
Sheets("Sheet1").Range("A1").Value = B
,B是某个数值?
谢谢
正如你已经从
看起来问题是任何UDF都不允许编辑工作表,只返回单个值…因此,如果我想编辑另一个单元格作为同一过程的一部分,我需要使用子"
"
标准 UDF不能改变工作表。
但是关于你的后续评论
这是正确的,如果是这样,我该怎么做-函数中的sub或函数中的sub?我想让我的电子表格自动响应输入,因为它会与一个功能-不需要按钮或特殊的操作。
你可以使用Event
例如:
- 你想要在一个输入 上跟踪A1:A10
- 如果使用该区域,则需要将
Worksheets("Sheet1").Range("A1").Value
设置为该值
问题1
- 右键单击要跟踪的工作表的标签
- 视图代码
- 复制并粘贴下面的代码4按"altf11"返回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
您是正确的(在您的评论中),UDF不能更改工作表,只能返回值。
如果从UDF调用Sub
或Function
并尝试更改工作表,则此事件为真。它也会失败。
注意:有一个(相当难看的)解决方法:参见这个答案