excel 返回数组的数组时,函数给出值错误

qmelpv7a  于 2023-01-14  发布在  其他
关注(0)|答案(2)|浏览(263)

我正在尝试在Excel中创建一个TextSplit函数,该函数既可以接受单个引用,也可以接受一个范围。
如果是单个字符串,则返回子字符串数组。
如果它是一个范围,它应该返回一个子字符串数组的数组。
单个字符串可以工作,但是当我传递给它单个列范围时,它给予我一个#VALUE!错误。
注解行起作用。
如果将Array的结果存储到arr,Excel将显示一个“test”字符串网格。
相反,如果我将TextSplit设置为arr(1),我会得到一个子字符串数组,类似于单个字符串的版本。

Function TextSplit(text, delimiter)
If IsArray(text) Then
    Dim arr() As Variant: ReDim arr(0 To text.Count - 1)
    For i = 1 To text.Count
        arr(i-1) = Split(text(i), delimiter)
        'arr(i-1) = Array("test", "test")
    Next
    TextSplit = arr
    'TextSplit = arr(1)
Else
    TextSplit = Split(text, delimiter)
End If
qyyhg6bp

qyyhg6bp1#

借助另一个问题Array and Split commands to create a 2 dimensional array
我可以解决你的问题,但是我仍然无法从你调用函数的单元格填充数组,就像用你的单个字符串填充旁边的列一样。如果是一列,你可以直接自动填充文本。split(cell,delimiter)如果你是在Excel中工作。
如果您使用vba并希望将拆分数组(如@Tim所说的二维数组)返回给sub:

Sub testingTextSplitter()
    Dim arr As Variant, tArr As Variant
    Dim testStr As String
    
    testStr = Range("A1").Value 'Testing single cell
    Range("G2").Value = TextSplit(testStr, "-")
    arr = Range("A1:A8").Value
    tArr = TextSplit(arr, "-")
    For i = 0 To UBound(tArr, 1)
        For j = 0 To UBound(tArr, 2)
            Cells(i + 3, j + 3).Value = "'" & tArr(i, j) 'fills out from Range("C3"), adjust as needed
' This writing out is basically the same as fillingdown the formule of text.split() btw
        Next j
    Next i
    
End Sub

使用功能

Function TextSplit(tArray As Variant, delimiter As String) As String()

    If IsArray(tArray) Then
        Dim uBoundInput As Long, uBoundCells As Long 'I couldn't get your arr.Count to work on my end so gotta use the UBound
        Dim arr() As String, testArr() As String
        Dim i As Long, j As Long, maxColumns As Long
        
        uBoundInput = UBound(tArray)
        
        maxColumns = 0
        For i = 0 To uBoundInput - 1
            Debug.Print (tArray(i + 1, 1))
            testArr = Split(tArray(i + 1, 1), "-")
            uBoundCells = UBound(testArr)
            If maxColumns < uBoundCells Then
                maxColumns = uBoundCells
            End If
        Next i
        
        ReDim arr(0 To uBoundInput - 1, 0 To maxColumns)
        
        For i = 0 To uBoundInput - 1
            testArr = Split(tArray(i + 1, 1), "-")
            For j = 0 To UBound(testArr)
                arr(i, j) = testArr(j)
            Next j
        Next i
        TextSplit = arr()
    Else
        TextSplit = Split(tArray, delimiter)
    End If
End Function

我对VBA也很陌生,所以在计算maxColumns时,我为冗余(如未填充testArray)提前道歉,我无法计算出这一点。第一次使用二维数组。
其他可能有帮助的问题:VBA UDF Return Array(我尝试使用带有{}的数组公式,但得到了与之前相同的值错误)
希望这个有用。

umuewwlo

umuewwlo2#

我不知道发生了什么,但是我的代码的数组分支现在可以工作了。我已经弄乱了一些东西,但是我不知道为什么它可以工作了。()”声明是上述代码中的新声明,但是之前可能已经省略了。(这段代码在我的工作电脑上,但我是从个人电脑上写的,所以我不能复制和粘贴。我现在在工作电脑上。)
我所做的唯一其他更改是对arr数组的索引值进行的更改。
谢谢你的帮助,不知道出了什么问题,也不知道是怎么解决的。

Function TextSplit(text, delimiter) As Variant()
If IsArray(text) Then
    Dim arr() As Variant: ReDim arr(1 To text.Count)
    For i = 1 To text.Count
        arr(i) = Split(text(i), delimiter, -1, 1)
    Next
    TextSplit = arr
Else
    TextSplit = Split(text, delimiter, -1, 1)
End If
End Function

相关问题