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 后功能停止(在子程序中工作)