我有一个功能,可以通过它的第一个空格来分割字符串(我知道可能有其他方法可以做到这一点),这似乎工作正常:
Public Function SplitBySide(ByVal str As String) As String()
'Left hand number to go into element 1, right into element 2
Dim strArr(1 To 2) As String, i As Integer
str = Trim(str)
For i = 1 To Len(str)
If Mid(str, i, 1) = " " Then Exit For
Next i
strArr(1) = Mid(str, 1, i)
If Not (i >= Len(str)) Then
strArr(2) = Mid(str, i, (Len(str) - i))
End If
For i = 1 To 2
strArr(i) = Trim(strArr(i))
Next i
SplitBySide = strArr
End Function
当我从模块中的测试子调用它时,它在预期的情况下工作:
Sub kjghkg()
Dim strArr() As String
strArr = SplitBySide(" 1234 567893247")
Debug.Print strArr(1), strArr(2)
End sub
(打印1234,567893247)
但是,当我尝试从UserForm模块中的select语句调用它时,我得到一个“预期数组”错误。我用来调用它的select语句是:
Private Function CaseCalls(ByVal a As Integer, ByRef xlRange As Excel.Range)
Dim xlCell As Excel.Range
Dim strArr() As String
Select Case a
...
Case 8
For Each xlCell In xlRange
If xlCell.Value = "" Then
xlCell.Delete (xlUp)
Else
strArr = SplitBySide(xlCell.Value) 'problem line
xlCell.Value = strArr(1)
xlCell.Offset(0, 1).Value = strArr(2)
End If
Next xlCell
...
End Select
End Function
我只能想到测试子和函数与select case语句之间的三个主要区别 - 1. test sub在普通的类模块中,select case函数在userform中,2。传递的变量是excel单元格的内容,而不是直接键入IDE的字符串,3。test sub不会在select case语句中调用SplitBySide函数。
是否有一些根本阻止我使用CaseCalls函数返回数组变量,或者我刚刚在某处犯了一个愚蠢的错误?希望有些人可以帮我弄清楚我做错了什么!
修改:
我设法绕过了这个问题,将strArr变量从select case语句传递给一个函数,该函数只调用SplitBySide并用结果填充传递的数组,但是没有显式地将它返回给CaseCalls(因为数组传递了通过引用,我仍然可以从CaseCalls访问这些值:
...
Case 8
For Each xlCell In xlRange
If xlCell.Value = "" Then
xlCell.Delete (xlUp)
Else
Call AvoidIt(strArr, xlCell.Value)
xlCell.Value = strArr(1)
xlCell.Offset(0, 1).Value = strArr(2)
End If
Next xlCell
...
Public Function AvoidIt(ByRef strArr() As String, ByVal str As String)
Dim strGh() As String
strGh = SplitBySide(str)
strArr(1) = strGh(1)
strArr(2) = strGh(2)
End Function
出于某种原因,这适用于其他尝试没有的情况。我认为Racil Hilan可能是对的,我在某种程度上混淆了系统,它不知道在哪里找到这个功能(这个名字只有一个功能,所以我不知道为什么会发生这种情况)。我将不得不做一些测试
答案 0 :(得分:1)
您是否忘记使用模块名称限定该功能?
我们假设您的模块名称为mySplitter
,然后将导致错误的调用行更改为:
strArr = mySplitter.SplitBySide(xlCell.Value)