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

时间:2017-06-25 17:55:42

标签: excel-vba udf vba excel

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

  

您为此功能输入了太多参数。

如何使UDF像这样工作?

例如:

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

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

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

1 个答案:

答案 0 :(得分:0)

我们只能在某种程度上模拟行为,但它永远不会与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),错误消息将显示,并且单元格将再次处于编辑模式,除非您按ESC ape。如果有许多错误的单元格(复制错误单元格并粘贴到其他许多单元格中),则按F9,消息将显示一次,其中一个单元格将处于编辑模式