当用户输入超过预期的参数时,强制 VBA 中的 UDF 显示 MsgBox?
Force UDF in VBA to display a MsgBox when the user enters more than expected arguments?
当用户为 COUNTBLANK
函数输入过多参数时,该函数会显示此错误消息,并 returns 进入编辑模式:
You've entered too many arguments for this function.
如何使任何 UDF 像那样工作?
例如:
Function COUNT2 (c As Range)
COUNT2 = c.Count
End Function
默认情况下,当用户输入多个参数时,此 UDF returns #VALUE!
错误。
如何让它像 COUNTBLANK
函数一样工作?
我们只能在一定程度上模拟行为,但它永远不会与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
,该消息将出现 一次 并且其中一个单元格将是处于编辑模式。
当用户为 COUNTBLANK
函数输入过多参数时,该函数会显示此错误消息,并 returns 进入编辑模式:
You've entered too many arguments for this function.
如何使任何 UDF 像那样工作?
例如:
Function COUNT2 (c As Range)
COUNT2 = c.Count
End Function
默认情况下,当用户输入多个参数时,此 UDF returns #VALUE!
错误。
如何让它像 COUNTBLANK
函数一样工作?
我们只能在一定程度上模拟行为,但它永远不会与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
,该消息将出现 一次 并且其中一个单元格将是处于编辑模式。