如何在 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 函数?的主要内容,如果未能解决你的问题,请参考以下文章