数组公式的VBA代码返回错误

时间:2018-08-23 18:28:02

标签: excel vba

我写了一个代码将文本分成两部分。值由字母,特殊符号和数字组成。我检查了每一行,但函数不起作用,excel返回“该函数无效”,请告诉我我的错误在哪里?

Option Explicit
Option Base 1
Function Split(s As String) As Variant
Dim firstquote As String, secondquote As String
Dim P(2) As Variant

firstquote = InStr(1, s, "'")
secondquote = InStr(firstquote + 1, s, "'")

P(1) = Trim(InStr(1, s, "="))
P(2) = Mid(s, firstquote + 1, secondquote - firstquote - 1)
Split = P

End Function

1 个答案:

答案 0 :(得分:1)

请牢记以上两点:

1)拆分是一个现有函数,因此请为函数命名不同;

2)您需要测试是否存在两个“'”

另外,有些人不赞成不必要地使用Option Base 1。

以下内容虽然并不理想(我认为您可能只使用现有的Split函数,并且需要更好的命名)确实向您展示了现有的Split函数的运行情况,以及使用类型化函数处理Strings(例如, Mid $)。我相信这些效率更高。如果您有2个以上的',您将只返回前两个部分。

根据@MathieuGuindon(感谢)-声明静态数组的下限和上限值也是一个好习惯。

这里有一个小小的重写:

Option Explicit
Public Sub test()
    Dim tests(), i As Long
    tests = Array("ng", "ng'ng2'ng2")
    For i = LBound(tests) To UBound(tests)
        If IsError(myCustomSplit(tests(i))) Then
            Debug.Print "Not enough ' present"
        Else
            Debug.Print myCustomSplit(tests(i))(1)
        End If
    Next i
End Sub
Public Function myCustomSplit(ByVal s As String) As Variant
    Dim firstquote As String, secondquote As String
    Dim P(0 To 1) As Variant

    If UBound(Split(s, "'")) >= 2 Then
        firstquote = InStr(1, s, "'")
        secondquote = InStr(firstquote + 1, s, "'")

        P(0) = Trim$(InStr(1, s, "="))
        P(1) = Mid$(s, firstquote + 1, secondquote - firstquote - 1)
        myCustomSplit = P
    Else
        myCustomSplit = CVErr(xlErrNA)
    End If
End Function

随着评论的消失,我将解释这里给出的其他有用评论。感谢所有人:

@ComIntern:如果您使用的是静态声明的数组,则可能也不应该使用LBoundUBound。将它们与常量绑定,然后改用它们。类似于Const TOP_ELEMENT As Long = 1,然后是Dim foo(0 To TOP_ELEMENT) As StringFor idx = 0 To TOP_ELEMENT。有关可读性的更多信息,但速度稍快。无需调用函数即可确定什么是已知常量。

@JohnnyL:为确保您的数组始终具有第0个下限,请使用VBA.Array而不是Array。即使您拥有Option Base 1,数组的下限仍将为0。