VBA输出写入单元格 - #VALUE!错误

时间:2013-05-02 09:08:32

标签: excel excel-vba vba

我正在尝试制作我的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是一些数值?

由于

2 个答案:

答案 0 :(得分:1)

正如您已经意识到的那样

  

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

标准 UDF无法更改工作表。

但就你的后续评论而言

  

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

您可以使用活动

举个例子:

  • 您想要在特定工作表上跟踪A1:A10以获取输入
  • 如果使用此区域,您需要将Worksheets("Sheet1").Range("A1").Value设置为此值

问题1

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

    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

    它们完全相同。

答案 1 :(得分:0)

您(在评论中)您是否正确更改工作表,只返回一个值。

如果您从UDF调用SubFunction并尝试更改工作表,则此操作成立。它也会失败。

注意:有一个(非常难看)的解决方法:见this answer