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

标签 excel udf vba

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

You've entered too many arguments for this function.



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

例如:
Function COUNT2 (c As Range)
    COUNT2 = c.Count
End Function

默认情况下,此 UDF 返回 #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猿。当有许多错误单元格时(复制错误单元格并粘贴许多其他单元格),然后按F9 ,会出现消息仅一次并且其中一个单元格将处于编辑模式。

关于excel - 当用户输入超过预期的参数时,强制 VBA 中的 UDF 显示 MsgBox?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44749046/

相关文章:

python - 如何将具有 NULL 值的 panda 列转换为 int?

java - 如何使用 POI 处理旧的 excel .xls 文件?

Java UDF on Hadoop 输入参数——从 Pig on Hadoop 调用

vba - 像幻灯片母版一样制作子弹

excel - variant() 和variant 之间有什么区别吗?

vba - 如何从字符串中获取单元格?

vba - 如何优化在大量记录上运行的宏?

regex - Hive -e和regex替换udf问题

python - 在 Redshift 中使用 Python 聚合 UDF

excel - 使用cmd运行vbs脚本