Excel VBA 函数在完成前停止执行而没有错误消息

Posted

技术标签:

【中文标题】Excel VBA 函数在完成前停止执行而没有错误消息【英文标题】:Excel VBA Function stops execution before completion without error message 【发布时间】:2018-05-16 02:19:48 【问题描述】:

我开始编写一个简单的函数来确定字符串的长度(以点为单位)。谷歌搜索后,我决定让 excel 为我完成这项工作来避免字体指标问题。

这里是代码。

Option Explicit    
Function txtWidthPts(MyText As String) As Integer
    'A cell on a working worksheet has been named "WidthTest" for easy reference & to ensure data is not overwritten.
    'set WidthTest word wrapping off so that strings placed in there aren't wrapped

    Application.ScreenUpdating = False

    With [WidthTest]
        .WrapText = False
        .Value = MyText
'autofit WidthTest
        .Columns.AutoFit
'get the width of the column
        txtWidthPts = .Width
        .ClearContents
    End With

End Function

我通过将函数放置在工作工作表上的单元格中来测试该函数,因此: =txtWidthPts("Test123") 当我有这个工作时,我将在代码中使用它而不是作为工作表函数。

我的问题是函数没有抛出错误并停止执行就行了:

.Value = MyText

我已将代码和名称放入一个空工作簿中,以确保不会与其他工作簿内容/代码交互。 我进行了广泛的搜索并尝试了各种建议(DoEvents、Application.Update = False 等),但都没有结果。 我已清除所有断点,关闭并打开工作簿并重新启动。我已经使用设置为 Break on All Errors 的选项进行了测试。 没有结果。

我怀疑我遗漏了一些明显的东西,但它现在让我打败了。

欢迎提出任何建议。

【问题讨论】:

您不能使用 UDF 修改 Excel 环境,因此您需要从 VBA 中测试此功能。只需从即时窗口运行它,例如?txtWidthPts("Test123")。或者有一个虚拟子程序,例如Sub Test()Debug.Print txtWidthPts("Test123")End Sub 【参考方案1】:

所以,@YowE3K 是对的。修复原始代码中的错误(上面更正的代码)后,它可以从 vba 运行良好。我知道我遗漏了一些明显的东西。

好奇心子问题:该功能按预期工作,实际上,正如@YowE3K 观察到的那样,它不会修改 Excel 环境。然而,返回的结果取决于它似乎修改了 Excel 环境。认真的WTF。只是想明白。

再次感谢 YoWE3K。

【讨论】:

该函数在从 VBA 而不是作为 UDF 调用时,能够修改环境,并且确实。但是当作为 UDF 调用时,它会在 .Value = MyText 行上崩溃(并且 UDF 中的崩溃会立即退出并返回 #VALUE 错误)。我还没有弄清楚为什么 UDF 忽略诸如.WrapText = False之类的语句,但崩溃诸如.Value = MyText之类的东西。 感谢您的进一步解释。我的好奇心子问题不太正确。从 vba 运行时,UDF 会修改环境。

以上是关于Excel VBA 函数在完成前停止执行而没有错误消息的主要内容,如果未能解决你的问题,请参考以下文章

Excel VBA - 使用 FindNext 后功能停止(在子程序中工作)

从 C# 运行 Excel 宏:从 VBA 捕获运行时错误

停止 excel(或 VBA)四舍五入的小数

Excel VBA中的ThisCell属性如何使用?

Excel VBA 应用程序自发停止并显示“代码执行已停止”消息

如何在 Excel VBA 中对字符串进行 URL 编码?