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

Excel 数组公式的VBA代码返回错误,excel,vba,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, "'") secon

我编写了一个代码,将文本分成两部分。值由字母、特殊符号和数字组成。我检查了每一行,但函数不起作用,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) Split是一个现有函数,因此请以不同的方式命名函数

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

此外,有些人不赞成不必要地使用选项Base 1

下面的内容虽然不理想(我认为您可能只需要使用现有的拆分函数,并且需要更好的命名),但它确实向您展示了正在使用的现有拆分函数,以及使用类型化函数处理字符串(例如Mid$)。我相信这些更有效。如果您有2个以上的
,您将只返回前两个部分

根据@MathieuGuindon(谢谢)-为静态数组声明lower和ubound也是一个好的实践

这里有一个轻微的重写:

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

由于评论可能会消失,我将转述这里给出的其他有用的评论。感谢大家:

@共产国际:如果您使用的是静态声明的数组,那么您可能不应该使用
LBound
UBound
。用常量绑定它们,并使用它们。类似于
Const-TOP\u元素作为Long=1
,然后
Dim-foo(0到TOP\u元素)作为String
对于idx=0到TOP\u元素
。更多关于可读性的信息,但速度稍快。不需要函数调用来确定什么是已知常数


@JohnnyL:为了确保数组始终具有第0个下界,请使用VBA.array而不仅仅是array。即使您有
选项Base 1
,数组的下限仍为0

Split是启动器的现有函数名。请使用其他名称。如果inputstring没有两个“split”是VBA中的一个函数,您将需要错误处理,您不能使用它name@Ibo它是在
VBA.Strings
模块中定义的,它完全可以被用户代码隐藏。。。我确实不建议这样做,但这是完全合法的。在函数前面加上模块名我同意
Option Base
不受欢迎,所以省略它是好的-但是为静态声明的数组声明显式的上下限是一个更好的主意:
Dim P(1到2)作为变量
,或
变暗P(0到1)作为变量
不留任何头盖刮伤的空间。。。或者让
选项库
把事情搞砸。你完全正确。当我看到你的评论时,我就知道我会受到惩罚。:-)如果您使用的是静态声明的数组,那么您可能也不应该使用
LBound
UBound
。我会用常量绑定它们,然后用它们来代替。@Comintern请帮我解决。那么,我应该如何在上面反映这一点呢?你为什么要避免一次又一次的打保龄球?和常量绑定会是什么样子?我认为你们可以比我回答得更好,总体上带来更多的好处。虽然这主要是一个可读性方面的问题。我个人的观点是,调用一个函数来确定什么是常数是毫无意义的。