无法在VBA Select Case语句中返回数组?

时间:2014-03-08 12:29:10

标签: arrays vba excel-vba parameter-passing excel

我有一个功能,可以通过它的第一个空格来分割字符串(我知道可能有其他方法可以做到这一点),这似乎工作正常:

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可能是对的,我在某种程度上混淆了系统,它不知道在哪里找到这个功能(这个名字只有一个功能,所以我不知道为什么会发生这种情况)。我将不得不做一些测试

1 个答案:

答案 0 :(得分:1)

您是否忘记使用模块名称限定该功能? 我们假设您的模块名称为mySplitter,然后将导致错误的调用行更改为:

strArr = mySplitter.SplitBySide(xlCell.Value)