【问题标题】:Split multidimensional array and then slice it [closed]拆分多维数组,然后对其进行切片[关闭]
【发布时间】:2015-02-10 04:42:53
【问题描述】:

我有一列路径:

C:\Series1\Season1\Ep1
C:\Series1\Season2\Ep1
C:\Series2\Season1\Ep1
C:\Series2\Season2\Ep1
C:\Series3\Season1\Ep1

我现在想把数组拆分成一个多维的,所以最后看起来是这样的:

+---+----+---------+---------+-----+
|   | 1  |    2    |    3    |  4  |
+---+----+---------+---------+-----+
| 1 | C: | Series1 | Season1 | Ep1 |
| 2 | C: | Series1 | Season2 | Ep1 |
| 3 | C: | Series2 | Season1 | Ep1 |
| 4 | C: | Series2 | Season2 | Ep1 |
| 5 | C: | Series3 | Season1 | Ep1 |
+---+----+---------+---------+-----+

然后我有一个名为unique(checkArray) 的函数,它检查数组中唯一值的数量。我想让这个函数一一检查每一列。

Debug.Print uniqueValues(Column1)
Debug.Print uniqueValues(Column2)
Debug.Print uniqueValues(Column3)
Debug.Print uniqueValues(Column4)

如何将数组放入该格式然后进行检查?

【问题讨论】:

标签: excel vba multidimensional-array split slice


【解决方案1】:

您可以像引用表中的字段一样引用数组。与表一样,数组也是从零开始的(意味着第一列被引用为 0 而不是 1)。因此,如果您的数组名为 MyArray,您将执行以下操作:

Debug.Print MyArray(0) 
Debug.Print MyArray(1) 
Debug.Print MyArray(2)
Debug.Print MyArray(3)

不要忘记您首先必须调暗您的阵列。如果你知道它有多少列,你可以像这样显式地 Dim 它:

Dim MyArray(0 to 3) As String

如果没有,您可以像这样保持开放式:

Dim MyArray() As String

您必须遍历您的数组才能从特定行号获取数据,我认为您不能以任何其他方式引用它。

【讨论】:

    【解决方案2】:

    使用拆分功能拆分您的条目,像这样

    Dim episodes() As Variant
    ReDim episodes(numEntries - 1) As Variant
    
    For i = 0 to numEntries - 1
        episodes(i) = Split(paths(i), "/")
    Next i
    
    Debug.Print episodes(1)(1) ' = Series1
    Debug.Print episodes(1)(2) ' = Season2
    

    之后,确保重复应该像遍历数组中的每个项目一样简单。


    或者,如果您只是想查找整个路径的重复项,只需创建一个集合对象并使用路径作为键将项目加载到集合中。如果项目已加载,则集合将引发错误。

    On Error Goto Catch
    
    Dim episodes as Collection
    Set episodes = New Collection
    
    For i = 0 to numEntries - 1
        episodes.add paths(i), paths(i)
    Next i
    
    Exit Sub
    Catch:
        'duplicate found
    

    【讨论】:

      【解决方案3】:

      Sub SplitMe()
          Dim values As Variant
          values = ActiveSheet.Range("A1:A5")
      
          If Not IsArray(values) Then _
              Exit Sub
      
          Dim r As Integer
          Dim parts As Variant
          Dim partsMaxLenght As Integer
          Dim splitted As Variant
          ReDim splitted(LBound(values) To UBound(values))
      
          For r = LBound(values) To UBound(values)
              parts = VBA.Split(values(r, 1), "\")
              ' Split always returns zero based array so parts is zero based array
              If UBound(parts) + 1 > partsMaxLenght Then _
                  partsMaxLenght = UBound(parts) + 1
              splitted(r) = parts
          Next r
      
          Dim matrix As Variant
          Dim c As Integer
          ReDim matrix(LBound(splitted) To partsMaxLenght, LBound(splitted) To UBound(splitted))
      
          For r = LBound(splitted) To UBound(splitted)
              parts = splitted(r)
              For c = 0 To UBound(parts)
                  matrix(c + 1, r) = parts(c)
              Next c
          Next r
      
          uniqueValues matrix
      
      End Sub
      
      Private Sub uniqueValues(matrix As Variant)
          Dim r, c
          For r = LBound(matrix, 1) To UBound(matrix, 1)
              For c = LBound(matrix, 2) To UBound(matrix, 2)
                  Debug.Print matrix(r, c)
              Next c
          Next r
      End Sub
      
      Output:
      C:
      D:
      E:
      F:
      H:
      etc.
      

      【讨论】:

      • 这几乎就是我想要的。它非常好。一件事,uniqueValues splitted(r) 将检查每行的唯一值,我希望每列都有,有没有办法做到这一点?
      • @Spurious 如果现在更好,请查看编辑后的答案,HTH
      猜你喜欢
      • 2013-06-21
      • 2016-02-20
      • 2017-06-05
      • 2015-10-15
      • 2021-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-07
      相关资源
      最近更新 更多