如何在 Excel 2016 中调试一个简单的 vba 函数?

Posted

技术标签:

【中文标题】如何在 Excel 2016 中调试一个简单的 vba 函数?【英文标题】:How do I debug a trivial vba function in Excel 2016? 【发布时间】:2016-01-24 07:23:19 【问题描述】:

我正在尝试调试一个简单的 vba 函数,该函数返回给定的数组,但一旦到达空单元格就会停止:

Function Test2(source() As Variant) As Collection
    Debug.Print "Hello"
    Dim i As Integer
    i = 1
    Do While Not IsEmpty(source(i))
        Test2.Add source(i).Value
        Debug.Print source(i).Value
        i = i + 1
    Loop

End Function

当我通过在单元格中写入(例如,=Test2(A:A))将数组传递给此函数时,我收到#VALUE! 错误并且看不到任何内容打印到即时窗口。

比起如何使用工具来查找问题,我对找出此功能的问题不太感兴趣。为什么“TEST”没有打印到即时窗口,如果我的程序有语法错误,为什么编译器不设置断点?

【问题讨论】:

从测试 Sub 调用函数比从工作表调用函数更容易调试函数。如果你能准确地描述你是如何称呼它的,那将会有所帮助。你在工作表上输入了什么? 是的,正如蒂姆所说的那样,从一个潜艇呼叫。此外,您在函数中声明了一个与函数(Test2)同名的变量。不上班 还有,我=我???或者真的意味着 i=1 @TimWilliams 我已经添加了我如何调用这个函数的描述。我不太确定如何使用 Sub,但我想我可以弄清楚。到目前为止,我对 vba 程序员可用的工具的质量感到非常失望。我应该使用VS还是什么?如果是这样,是否有使用 VS 和 excel 的指南? @MacroMarc 我想我已经解决了你的 cmets,但它仍然不起作用。我会试试这个“子”的想法。 【参考方案1】:

再次查看您的函数,向下查看 End Function 语句附近。为了从函数返回值,您需要将函数名称设置为要返回的值。所以,如果你想返回值“1”(不带引号)你在 End Function 之前的最后一行应该说 ....

Test2 = 1

这是您的#value 错误的一个可能原因。也可能有其他原因。但先看看那个。

【讨论】:

不是这个原因。正如您所描述的,函数可以将集合返回给调用过程,并且这样的函数不需要在最后将函数的名称设置为集合。这里的问题是,当函数用作 UDF 时,它不能将集合返回到范围。【参考方案2】:

删除 source() 变体中的括号。简单的来源。 您可以使用 Range 作为数据类型而不是 Variant,因为您的输入是 Range(A:A 声明一个新集合以向集合添加值。 对于迭代,我使用了 For each method。 希望您可以从下面的代码中了解您的错误

  Function Test2(source As Variant) As Collection
    Dim c As New Collection
    Dim cell As Range
    Debug.Print "Hello"
    Dim i As Integer

    i = 0
     For Each cell In source
        Debug.Print cell.Value
        Debug.Print cell.Count
            If IsEmpty(cell) = True Then
                Exit For
            Else
             'Set itm = cell
                 c.Add cell.Value
             End If
     Next
    Set Test2 = c
End Function

【讨论】:

以上是关于如何在 Excel 2016 中调试一个简单的 vba 函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Visual Studio Code 中调试 Python 3 代码?

c++错误:调试断言失败

如何在 Python 中检查对象的类型? [复制]

如何在VB中调用EXCEL表格数据?

如何在2016 excel中嵌入excel表格

办公软件EXCEL2016版里面变成了英文如何转换成中文