0

我有一个 Excel 表,我需要遍历每一行,如果它符合某些条件,则将数据放入几个不同的数组之一中。行数是动态的。我在声明数组长度时遇到了一些问题。我可以简单地遍历行,检查我想要的条件,并保持有多少行适合条件 A、条件 B 或条件 C,并使用它来重新调整数组,但有没有更简单的方法?

谢谢!

4

1 回答 1

0

您没有告诉我们您的“声明数组长度的问题”。我的猜测是您正在从一个范围加载数组,这意味着该行是您无法使用 ReDim 更改的第一个维度。

根据我的猜测,我在下面提供了两种方法。如果这些方法都没有帮助,请返回更完整的解释。

方法一

将整个范围加载到单个数组中,然后使用第二个数组来记录类型。

Dim AllTypes() As Variant
Dim RowCrnt As Long
Dim RowType() As Long

AllTypes = EntireRange.Value
Redim RowType(LBound(AllTypes,1) TO UBound(AllTypes,1))

For RowCrnt = LBound(AllTypes,1) TO UBound(AllTypes,1)
  ' Classify Row
  RowType(RowCrnt) = X
Next

方法二

锯齿状阵列可能更符合您的要求。

我将 Sheet1 设置为如下所示:

在此处输入图像描述

我运行下面的宏,它首先对每一行进行分类并将其放在适当的数组中。然后它将每个数组输出到即时窗口以给出:

a b c d e f g h i j 
b c d e f g h i j k 
c d e f g h i j k l 
a b c d e f g h i j 
b c d e f g h i j k 
c d e f g h i j k l 
1 2 3 4 5 
2 3 4 5 6 
3 4 5 6 7 
1 2 3 4 5 
2 3 4 5 6 
3 4 5 6 7 
a 1 b 2 c 3 
b 2 c 3 d 4 
c 3 d 4 e 5 
a 1 b 2 c 3 
b 2 c 3 d 4 
c 3 d 4 e 5 

Sub Test3()

  Dim ColCrnt As Long
  Dim InxTypeACrnt As Long
  Dim InxTypeACrntMax As Long
  Dim InxTypeBCrnt As Long
  Dim InxTypeBCrntMax As Long
  Dim InxTypeCCrnt As Long
  Dim InxTypeCCrntMax As Long
  Dim RowCrnt As Long
  Dim RowLast As Long
  Dim TypeA() As Variant
  Dim TypeB() As Variant
  Dim TypeC() As Variant

  ReDim TypeA(1 To 2)       ' Change 2 to something sensible
  ReDim TypeB(1 To 2)
  ReDim TypeC(1 To 2)
  InxTypeACrntMax = 0
  InxTypeBCrntMax = 0
  InxTypeCCrntMax = 0

  With Worksheets("Sheet1")

    RowLast = .Cells(Rows.Count, "A").End(xlUp).Row

    ' Load each row to the appropriate array
    For RowCrnt = 1 To RowLast
      If IsNumeric(.Cells(RowCrnt, "A").Value) Then
        ' Type B.  Five numbers
        InxTypeBCrntMax = InxTypeBCrntMax + 1
        If InxTypeBCrntMax > UBound(TypeB) Then
          ' Array B full.  Resize
          ReDim Preserve TypeB(1 To UBound(TypeB) + 2)
        End If
        TypeB(InxTypeBCrntMax) = _
                        .Range(.Cells(RowCrnt, 1), .Cells(RowCrnt, 5)).Value
      ElseIf IsNumeric(.Cells(RowCrnt, "B").Value) Then
        ' Type C.  Six values, mixed alpha and numeric
        InxTypeCCrntMax = InxTypeCCrntMax + 1
        If InxTypeCCrntMax > UBound(TypeC) Then
          ' Array C full.  Resize
          ReDim Preserve TypeC(1 To UBound(TypeC) + 2)
        End If
        TypeC(InxTypeCCrntMax) = _
                       .Range(.Cells(RowCrnt, 1), .Cells(RowCrnt, 6)).Value
      Else
        ' Type A.  Ten strings
        InxTypeACrntMax = InxTypeACrntMax + 1
        If InxTypeACrntMax > UBound(TypeA) Then
          ' Array A full.  Resize
          ReDim Preserve TypeA(1 To UBound(TypeA) + 2)
        End If
        TypeA(InxTypeACrntMax) = _
                       .Range(.Cells(RowCrnt, 1), .Cells(RowCrnt, 10)).Value
      End If
     Next

   End With

   ' Display contents of each array

   For InxTypeACrnt = 1 To InxTypeACrntMax
     For ColCrnt = 1 To 10
       ' Each element of array TypeA is now a 2D array of size (1 To 1, 1 To 10)
       ' Note how I access the cells of the inner array
       Debug.Print TypeA(InxTypeACrnt)(1, ColCrnt) & " ";
     Next
     Debug.Print
   Next

   For InxTypeBCrnt = 1 To InxTypeBCrntMax
     For ColCrnt = 1 To 5
       Debug.Print TypeB(InxTypeBCrnt)(1, ColCrnt) & " ";
     Next
     Debug.Print
   Next

   For InxTypeCCrnt = 1 To InxTypeCCrntMax
     For ColCrnt = 1 To 6
       Debug.Print TypeC(InxTypeCCrnt)(1, ColCrnt) & " ";
     Next
     Debug.Print
   Next

End Sub
于 2012-05-19T11:09:53.127 回答