6

我创建了一个接受数组输入的 excel UDF。我希望它只允许数组中的偶数个项目。这是代码:(它很短,所以我会全部发布,这样你就可以获得一些上下文)

Function SUBSTITUTEMULTI(inputString As String, ParamArray criteria() As Variant) as String

Dim subWhat As String
Dim forWhat As String
Dim x As Single


If UBound(criteria()) Mod 2 = 0 Then
'check whether an even number of arguments is input
MsgBox "You've entered too few arguments for this function", vbExclamation

Else
    x = 0
    For Each element In criteria
        If x = 0 Then
            subWhat = element
        Else
            forWhat = element
            inputString = WorksheetFunction.Substitute(inputString, subWhat, forWhat)
        End If
        x = 1 - x
    Next element
SUBSTITUTEMULTI = inputString
End If
End Function

目前,我返回一个看起来像 Excel 自己的消息框,当您输入SUBSTITUTE()缺少第三个参数时会出现该消息框。但是,当您使用SUBSTITUTE()或任何类似功能执行此操作时,Excel 会阻止您输入公式,而是将您单击返回,以便您修复错误的功能。我想要这个,否则我的函数可以在其损坏状态(奇数个参数)中粘贴到几个单元格中,这意味着在重新计算时消息框会出现多次!

如何修复代码,以便如果检测到不正确的参数(数组中的项目数为奇数),那么用户会自动返回到编辑公式步骤?

4

2 回答 2

3

当输入的参数数量不正确时,让函数返回错误。

返回值必须是 Variant 而不是 String。

将您的 msgbox 替换为SUBSTITUTEMULTI=CVErr(xlErrValue).

错误列表:

  • xlErrDiv0对于一个#DIV/0错误
  • xlErrNA对于一个#N/A错误
  • xlErrName对于一个#NAME?错误
  • xlErrNull对于一个#NULL错误
  • xlErrNum对于一个#NUM错误
  • xlErrRef对于一个#REF错误
  • xlErrValue对于一个#VALUE错误

( http://www.cpearson.com/excel/writingfunctionsinvba.aspx )

于 2017-02-20T14:56:28.100 回答
2

这不是一个特别好的解决方案。通常SendKeys不鼓励使用,并且此解决方案仅在您禁用您的MoveAfterReturn 属性时才有效(即在下图中未选中)

在此处输入图像描述

Function test(rng As Range)
    'check condition
    If rng.Count <> 2 Then
        MsgBox "Incorrect..."
        SendKeys "{F2}", True
        Exit Function
    End If

    'code here to be run if parameters are valid
    test = "Success"
End Function
于 2017-02-20T14:32:09.477 回答