当用户输入超过预期的参数时,强制 VBA 中的 UDF 显示 MsgBox?

Posted

技术标签:

【中文标题】当用户输入超过预期的参数时,强制 VBA 中的 UDF 显示 MsgBox?【英文标题】:Force UDF in VBA to display a MsgBox when the user enters more than expected arguments? 【发布时间】:2017-06-25 17:55:42 【问题描述】:

当用户为COUNTBLANK函数输入太多参数时,函数会显示此错误信息,并返回编辑模式:

您为此函数输入的参数过多。

如何使任何 UDF 像这样工作?

例如:

Function COUNT2 (c As Range)
    COUNT2 = c.Count
End Function

默认情况下,当用户输入多个参数时,此 UDF 会返回 #VALUE! 错误。

如何让它像COUNTBLANK 函数一样工作?

【问题讨论】:

【参考方案1】:

我们只能在一定程度上模拟行为,但它永远不会与 Excel 内置函数的行为完全相似。

我们可以添加一种机制,以便当 UDF 检测到一些语法错误时,它会启动一些错误数据(要显示的消息,要激活的单元格),一旦计算结束,工作簿就会处理这些数据。当然,这应该只显示一次,而不是针对每个包含错误公式的单元格,因为这会给用户带来极大的压力。

' Code Module ThisWorkbook
Option Explicit
Private errorCell As Range
Private errorMsg As String

Public Sub setErrorToshow(cel As Range, msg As String)
  If Not errorCell Is Nothing Then Exit Sub ' To display a msg only once, not per cell
  Set errorCell = cel
  errorMsg = msg
End Sub

Private Sub Workbook_SheetCalculate(ByVal Sh As Object)
  Application.EnableEvents = False
  On Error GoTo Cleanup
  If Not errorCell Is Nothing Then
    Application.Goto errorCell
    MsgBox errorMsg
    SendKeys "F2"
  End If

Cleanup:
    Application.EnableEvents = True
    Set errorCell = Nothing
    errorMsg = ""
End Sub

UDF 检查语法并设置适当的错误信息:

' Code module Module1
Option Explicit
Function COUNT2(ParamArray args())
  Application.Volatile
  If UBound(args) > 0 Then
    ThisWorkbook.setErrorToshow Application.caller, "too many args for function COUNT2"
  ElseIf Not TypeOf args(0) Is Range Then
    ThisWorkbook.setErrorToshow Application.caller, "wrong argument type for COUNT2"
  Else
    COUNT2 = args(0).count
  End If
End Function

要对此进行测试,请尝试输入错误的公式,例如 =COUNT2(A1:A20, B1:B20)=COUNT2(12345),除非您按 ESCape,否则将显示错误消息并且单元格将再次处于编辑模式。当有许多错误单元格时(复制错误单元格并粘贴到许多其他单元格中),然后按F9,消息将仅出现一次,其中一个单元格将处于编辑模式。

【讨论】:

对不起,代码中似乎有一些错误。我收到以下消息:(找不到方法或数据成员),并且编译器突出显示了这一行:ThisWorkbook.setErrorToshow Application.Caller, "too many args for function COUNT2" @HaythamAmirah 在我指出的每一段代码中,在第一行注释中,应该在其中添加 Code Module。你申请了吗? 不,我之前没有申请过,感谢您的澄清。您的解决方案运行良好。

以上是关于当用户输入超过预期的参数时,强制 VBA 中的 UDF 显示 MsgBox?的主要内容,如果未能解决你的问题,请参考以下文章

VBA输入框(InputBox)

Excel / VBA代码忽略输入的参数

带有 2 个对象参数的 Excel VBA 对象子调用给出编译错误:预期 =

尝试调用外部 VBA 函数时,只能强制在公共对象模块中定义的用户定义类型

EXCEL 的自定义 VBA 函数中的用户定义警告

从 Access 2007 VBA 代码创建 .xlsx 文件时强制用户使用 Excel 版本