MsgBox 用于从 Excel 中的单元格调用的 VBA UDF 中进行错误处理?

问题描述 投票:0回答:1

是否可以允许 Excel 用户停止弹出来自 VBA 错误处理程序的 MsgBox 消息并重新允许 MsgBox 消息?或者是否可以以编程方式控制它们的频率,例如在最后一个 MsgBox 事件后抑制新的 MsgBox 事件 1 分钟?

我创建了一个从工作表中的单元格调用的 UDF,如单元格 H12 中所示:

=CashFlowByPhaseWeek($A$4;H$5;$B12;"P7")

最终用户会将函数调用填充到更大的范围(就像我们总是通过拖动右下角跨越多个列或行,然后在另一个方向上拖动生成的列范围或行范围)。

该 UDF 的功能取决于同一工作簿中另一个工作表上的几个因素。例如,另一个工作表必须包含某些Excel表格,并且工作表和表格的名称需要遵循一定的命名约定。 “P7”将包含表“P7Phases”、“P7UnitCost”等。

由于最终用户不熟悉 Excel,我认为创建一个错误处理程序是明智的做法,该处理程序将为最终用户提供针对预期问题的特定 MsgBox 提示,例如: enter image description here

对于新项目,最终用户应该复制带有表格的工作表,例如复制“P6”并将副本重命名为“P7”,将工作表中的表格重命名为“P7Phases”,Excel 通过添加后缀,例如“P6Phases5”,然后标记属于“P6”的剩余工作表选项卡组并复制该选项卡组(这是可能的,因为它们不包含表格),将这些工作表重命名为“P7...” ,最后标记整个选项卡组并用 P7 替换所有出现的 P6,查看公式。然后,他将为新项目输入一些数据,包括表格大小的更改。他很容易忘记重命名一些表以遵守命名约定。

如果我们不从多个单元调用 UDF,MsgBox 消息传递将会很好地工作。但事实上,每个包含调用 UDF 的公式的单元格都会触发一个单独的调用,并且每个调用都会显示相同的错误消息。用户需要持续单击“确定”5 或 10 分钟才能修复工作表“P7”上的问题。

我知道我可以通过删除 UDF 并让目标表上的所有更新通过单个子过程调用来完成来解决问题。这会有一定的优点和缺点。优点是子过程可以轻松地按计划发送消息框。总而言之,它也会运行得更快。但缺点是,我需要教最终用户使用宏,或者我需要在现金流量表上开发 UI 控件,这将触发子程序和子程序过程还需要控制工作表的正确初始化,例如清除先前使用的和复制留下的数据单元格,但在新项目中可能不会被覆盖。

excel vba error-handling user-defined-functions msgbox
1个回答
0
投票

这是限制 MsgBox 出现的一种方法:

Function TestMsg()
    Static lastmsg As Double
    Dim ws As Worksheet
    
    'check for required worksheet
    On Error Resume Next
    Set ws = ThisWorkbook.Worksheets("Test")
    On Error Resume Next
    
    If ws Is Nothing Then 'problem?
        If Now - lastmsg > (1 / 1440) Then 'last message more than 1 minute ago?
            MsgBox "Missing worksheet 'Test'"
            lastmsg = Now
        End If
        TestMsg = "#Error"
        Exit Function
    End If
    
    TestMsg = "OK" 'do whatever...
    
End Function
© www.soinside.com 2019 - 2024. All rights reserved.