【问题标题】:Excel VBA, 2003 - Convert string to 2-dimensional arrayExcel VBA,2003 - 将字符串转换为二维数组
【发布时间】:2020-05-30 08:13:12
【问题描述】:

我从 2005 年开始继承了旧的 Excel (.xls) 电子表格。

由于某种原因,电子表格将名称管理器用于存储为字符串的大量数据,而不是引用包含数据的表。这就是我要更改的内容,因此更改当前存储在名称管理器中的数据会更容易(目前无法更改任何数据,因为名称管理器中的字符限制已被超出) .

我想尽可能多地使用当前的 VBA 代码,这就是为什么我目前有一个设置,我使用 VBA 将电子表格中的数据转换为

形式的字符串
"CELL"\"CELL"\"...""CELL";"CELL"\"CELL"\"CELL";

我(或旧代码)使用反斜杠 \ 作为新列的分隔符和分号 ; 作为新行的分隔符。

我想将我的字符串转换为一个名为“arkArray”的二维数组,这样我就可以使用以下代码:

arkCellData = arkArray(i, j)

最好的方法是什么?

【问题讨论】:

  • Split 可能有用。
  • 这些字符串要多长时间?超过 255 个字符?另外,这些字符串中会有逗号吗?
  • 它们最长超过 15,000 个字符(我必须执行以下操作才能看到整个字符串 =“名称管理器中的引用”-> 在电子表格中插入整个字符串 -> 将单元格数据复制到.txt 文件 -> 删除标签 -> 计算字符数
  • IMO,我不会在这里“修补”旧 VBA,而是重写以正确执行操作...参考工作表中的数据 - 您可以使用一行代码将范围的值读入二维数组.名称管理器 > 字符串 > 2D 数组似乎是不好的做法。
  • @BigBen,这似乎是一种更好的做法,你介意向我解释一下我如何只用一行代码就可以做到吗? (这很可能会导致我重写很多代码,但我也不喜欢当前的设置)

标签: arrays excel vba string


【解决方案1】:

这是一个典型的方法:

Sub Fill2D()
    Dim s As String, r As Range
    Dim kolumn As Long, roww As Long
    Dim arr1, arr2, a1, a2

    kolumn = 0
    roww = 1
    s = "alpha\beta\gamma;mike\jim\john;red\blue\green"

    arr1 = Split(s, ";")

    For Each a1 In arr1
        roww = 1
        kolumn = kolumn + 1
        arr2 = Split(a1, "\")
        For Each a2 In arr2
            Cells(roww, kolumn) = a2
            roww = roww + 1
        Next a2
    Next a1

End Sub

(您可以更改kolumnroww 的起始值以选择不同的起始点)

一旦二维数组位于单元格中,您将对其进行验证,然后将其复制到内部 VBA 数组中。

【讨论】:

    【解决方案2】:

    如何制作二维数组。

    Sub test()
        Dim myArray(), vS, vS2
        Dim vMax()
        Dim s As String
        Dim myMax As Integer, i As Integer,  j As Integer
        Dim r As Long
    
        s = "apple\banana\John;some\reason\use\Tom;table\data\limit;"
    
        If Right(s, 1) = ";" Then
            s = Left(s, Len(s) - 1)
        End If
    
        vS = Split(s, ";")
        ReDim vMax(UBound(vS))
    
        For i = 0 To UBound(vS)
            vS2 = Split(vS(i), "\")
            vMax(i) = UBound(vS2) + 1
        Next i
    
        myMax = WorksheetFunction.Max(vMax)
        r = UBound(vS) + 1
    
        ReDim myArray(1 To r, 1 To myMax)
    
        For i = 1 To UBound(myArray)
            vS2 = Split(vS(i - 1), "\")
            For j = 1 To UBound(vS2) + 1
                myArray(i, j) = vS2(j - 1)
            Next j
        Next i
        Range("a1").Resize(r, myMax) = myArray
    
    
    End Sub
    

    【讨论】:

      猜你喜欢
      • 2019-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多