【问题标题】:Function gives Value error when returning array of arrays返回数组数组时函数给出值错误
【发布时间】:2022-11-11 04:21:08
【问题描述】:

我正在尝试在 Excel 中创建一个可以接受单个引用或范围的 TextSplit 函数。如果是单个字符串,则返回子字符串数组。如果它是一个范围,它将返回一个子字符串数组的数组。下面的代码是我正在使用的。单个字符串可以正常工作,但是当我将其传递给单个列范围时,它会给我一个#VALUE!错误。

注释行有效。如果我将 Array 的结果存储到 arr Excel 会显示一个“测试”字符串网格。如果改为将 TextSplit 设置为 arr(1) 我会得到一个类似于单个字符串版本的子字符串数组。

我不知道我做错了什么。我是一位老 Java 开发人员,不熟悉 Excel 中的 VBA 脚本。任何帮助,将不胜感激。

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

【问题讨论】:

  • 你实际上是怎么称呼它的?如果来自单元格,则不太可能按原样工作,因为您有一个锯齿状数组。
  • 您需要返回一个大小为 (# of input texts) x (max. size of arrays from split texts) 的单个二维数组
  • 是的,我从一个单元格中调用它作为一个函数。所以你们都说它需要有一个设定的列宽,问题是拆分文本数组中可能有可变长度(我的测试数据中没有,但VBA不知道)。我会试试的。谢谢你。

标签: arrays excel vba return-value


【解决方案1】:

借助另一个问题Array and Split commands to create a 2 dimensional array

我能够稍微解决您的问题,但是我仍然无法从您调用函数的单元格中填写数组,就像您在旁边的列中填写的单个字符串一样。 如果它是用于列,如果您使用 Excel 工作,则可以自动填充 text.split(cell,delimiter)。

如果您正在使用 vba 并希望将拆分数组(如@Tim 所说的 2D)返回到子:

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 (我尝试使用带有 {} 的数组公式,但得到与以前相同的值错误)

希望这可以帮助。

【讨论】:

  • 感谢您的回答。我将看一下其中的一些代码,看看有什么用。关于自动填充建议,我试图返回一个数组,因为最终我需要对多个分隔符进行多次拆分。第一次拆分将创建新行,第二次拆分将创建列。来自单元格函数的 VBA 不支持插入行(从我读过的内容),所以我正在使用数组。谢谢你的建议。
  • 如果这没有成功,您可以编写一个从选择(或询问范围)工作的子程序,询问分隔符并在目标起始单元格中填写结果。你是对的,一个函数只能返回一个值,不能改变单元格
【解决方案2】:

我不知道发生了什么,但我的代码的数组分支现在正在工作。我一直在搞砸一些事情,但我不确定它为什么会起作用。 “As Variant()”声明是上述代码中的新声明,但之前可能已被省略。 (这段代码在我的工作机器上,但我是用个人电脑写的原始帖子,所以我无法复制和粘贴。我现在在工作电脑上。)

我所做的唯一其他更改是对 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-03
    • 2012-01-01
    • 2011-03-29
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多