Excel 数组公式的VBA代码返回错误
我编写了一个代码,将文本分成两部分。值由字母、特殊符号和数字组成。我检查了每一行,但函数不起作用,excel返回“该函数无效”您能告诉我我的错误在哪里吗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
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请帮我解决。那么,我应该如何在上面反映这一点呢?你为什么要避免一次又一次的打保龄球?和常量绑定会是什么样子?我认为你们可以比我回答得更好,总体上带来更多的好处。虽然这主要是一个可读性方面的问题。我个人的观点是,调用一个函数来确定什么是常数是毫无意义的。