了解如何调试Excel中的自定义函数

  • Share This
Michael Brown

既然你已经知道如何创建UDF(而且,我希望你也尝试过在你的Excel中应用它们),让我们再深入一点,看看在你的用户定义函数不工作的情况下可以做些什么。

为了解决创建自定义函数时的一些问题,你很可能需要运行调试。 然后你就可以确定该函数是否正常工作。

我们将探讨以下调试技术。

    当你创建一个自定义函数时,总有可能犯错。 自定义函数通常相当复杂。 而且它们并不总是立即开始正常工作。 公式可能返回一个不正确的结果或#VALUE!错误。 与标准Excel函数不同,你不会看到任何其他信息。

    有没有办法一步一步地浏览一个自定义函数,检查它的每个语句是如何工作的? 当然!调试就是用来做这个的。

    我将为你提供几种调试自定义函数的方法,这样你就可以选择适合你的方法。

    作为一个例子,我们使用自定义函数 读取最大间隔时间 从我们以前的一篇文章中可以看出,它计算的是指定数值范围内的最大数字。

    Function GetMaxBetween(rngCells As Range, MinNum, MaxNum) Dim NumRange As Range Dim vMax Dim arrNums() Dim i As Integer ReDim arrNums(rngCells.Count) For Each NumRange In rngCells vMax = NumRange Select Case vMax Case MinNum + 0.01 To MaxNum - 0.01 arrNums(i) = vMax i = i + 1 Case Else GetMaxBetween = 0 End Select Next NumRange GetMaxBetween = WorksheetFunction.Max(arrNums) End Function

    函数参数是写入数字的单元格范围,以及数值的上限和下限。

    在重要的地方放置MsgBox函数

    为了监测计算的执行情况,你可以在屏幕上的适当位置显示最重要的变量的值。 这可以通过弹出式对话框来实现。

    MsgBox 是一个对话框,你可以用它来向用户显示某种信息。

    MsgBox的语法与其他VBA函数类似。

    MsgBox(prompt [, buttons] [, title] [, helpfile, context] )

    促使 是一个必要的参数,它包含你在对话框中看到的信息。 它也可以用来显示单个变量的值。

    所有其他参数都是可选的。

    [ 按钮 ]--决定哪些按钮和图标会显示在屏幕上。 MsgBox 例如,如果我们使用选项 vbOkOnly ,那么只有 认可 即使你错过了这个参数,这个按钮也会被默认使用。

    [ 职称 ] - 在这里你可以指定消息框的标题。

    让我们从文字转换到实践,开始调试。 为了显示信息,请在 读取最大间隔时间 前的用户定义的函数。 案例 Else 经营者。

    MsgBox vMax,, "计数 -" & i

    以下是我们将得到的结果。

    函数 GetMaxBetween(rngCells As Range, MinNum, MaxNum) Dim NumRange As Range Dim vMax Dim arrNums() Dim i As Integer ReDim arrNums(rngCells.Count) For Each NumRange In rngCells vMax = NumRange Select Case vMax Case MinNum + 0.01 To MaxNum - 0.01 arrNums(i) = vMax i = i + 1 MsgBox vMax,, "Count -" & i Case Else GetMaxBetween = 0 End Select Next NumRange GetMaxBetween =WorksheetFunction.Max(arrNums) End Function

    使用 vMax 在对话框中的变量,我们将看到哪些数字符合选择标准,这样我们就可以选择其中最大的数字。 通过标题栏中的表达式 "计数-"&I,我们表明我们已经选择了多少个数字来确定最大值。 计数器将随着每个新值而增加。

    一旦我们设置了UDF,我们就将下面的公式应用于日期范围。

    = GetMaxBetween (A1:A6,10,50)

    在按下回车键后,你会看到一条信息,如下图所示。

    这是A1: A6范围内的第一个数字,符合标准:大于10但小于50。

    在你点击 "确定 "后,出现了第二条信息,数字是14。 其余的数字不符合选择条件。 因此,函数退出,并返回两个数值中最大的一个,即17。

    ǞǞǞ MsgBox 函数可以用在你的自定义函数中最重要的地方,以控制单个变量的值如何变化。 当你有一个大的函数和大量的计算时,消息框会非常有用。 在这种情况下,你将很容易确定错误发生在代码的哪一部分。

    确定停止点并逐步执行

    你可以在你的函数代码中添加断点,在那里代码的执行将停止。 因此,你可以一步一步地跟踪计算过程。 这样做,你可以看到变量的值如何变化。

    要添加一个断点,将光标放在包含你选择暂停的语句的行上。 然后右键单击并选择 Debug -> 切换断点 你也可以在功能代码左边的垂直灰色区域中点击所需的地方,或者直接按F9。

    一个红色的圆圈会出现,正如你在下面的截图中看到的那样。 将停止计算的那行代码用红色突出显示。

    现在,当函数运行时,VBA编辑器窗口将被打开。 光标将被定位在你停止的位置。

    如果你将鼠标光标悬停在函数代码中的任何一个变量上,你可以看到它们的当前值。

    按F5继续计算。

    注意:在断点之后,你可以开始一步步跟踪计算的进度。 如果你按下F8按钮,将只执行VBA代码的下一行。 带箭头的黄线也将移动到最后执行的代码位置。

    由于函数的执行再次暂停,你可以用鼠标光标查看函数的所有变量的当前值。

    下一次按F8会使我们前进一步。 所以你可以按F8直到计算结束。 或者按F5继续计算直到下一个断点。

    如果发生错误,光标将停在代码中发生错误的地方。 而且你还会看到一个弹出的错误信息。 这样就很容易确定问题的原因。

    你指定的断点将一直应用到你关闭文件为止。 当你重新打开文件时,你将需要再次设置它们。 这不是最方便的方法,你认为呢?

    然而,这个问题是可以解决的。 插入一个 停止 语句在必要的位置进入函数代码,你可以用与使用断点相同的方式停止程序的执行。

    当VBA遇到一个 停止 语句,它将停止程序的执行,等待你的操作。 检查变量的值,然后按F5继续。

    或按F8键,按上述方法逐步履行功能。

    ǞǞǞ 停止 语句是程序的一部分,因此不会被删除,就像断点一样。 当你完成调试后,可以自己删除它。 或者在它前面加一个单引号('),把它变成一个注释。

    使用Debug.Print操作符进行调试

    你可以把 Debug.Print 这对于检查周期性变化的变量的值很有用。

    你可以在下面的截图中看到Debug.Print的性能实例。

    声明 Debug.Print i, vMax 打印数值和它们的序号。

    在 "立即 "窗口中,你可以看到两个来自选定范围的数字(17和14),它们与设定的限制相对应,其中的最大值将被选中。 数字1和2意味着函数已经完成了两个周期,其中的数字被选中。 我们看到最重要的变量的值,就像我们之前看到的那样 MsgBox 但这并没有阻止该功能。

    从程序中调用一个函数

    你可以不从工作表中的单元格调用用户定义的函数,而是从一个过程中调用。 在这种情况下,所有的错误都会显示在Visual Basic编辑器窗口中。

    下面是如何从一个过程中调用用户定义的函数GetMaxBerween。

    Sub Test() Dim x x = GetMaxBetween(Range ( "A1:A6"), 10, 50) MsgBox(x) End Sub

    将光标放在代码的任何地方,然后按F5。 如果函数中没有错误,你会看到一个弹出的窗口,里面有计算结果。

    如果出现错误,你会在VBA编辑器中看到相应的信息,计算将被停止,发生错误的那一行代码将以黄色高亮显示。 你可以很容易地识别错误发生的位置和原因。

    就这样,现在你已经创建了自己的插件,并将其添加到Excel中,你可以在其中使用UDF。 如果你想使用更多的UDF,只需在VBA编辑器中的插件模块中编写代码并保存。

    今天就到这里,我们已经介绍了调试自定义函数的不同方法,并学习了如何在工作簿中使用它们。 我们真的希望这些指南对你有帮助。 如果你有任何问题,请写在本文的评论中。

    Michael Brown is a dedicated technology enthusiast with a passion for simplifying complex processes using software tools. With more than a decade of experience in the tech industry, he has honed his skills in Microsoft Excel and Outlook, as well as Google Sheets and Docs. Michael's blog is dedicated to sharing his knowledge and expertise with others, providing easy-to-follow tips and tutorials for improving productivity and efficiency. Whether you're a seasoned professional or a beginner, Michael's blog offers valuable insights and practical advice for getting the most out of these essential software tools.