2012-05-18 74 views
0

我有一张Excel表格,需要遍历每一行,如果符合特定条件,则将数据放入几个不同的数组中的一个中。行数是动态的。我遇到了一些关于声明数组长度的问题。我可以简单地遍历行,检查我想要的条件,并保持总共有多少行符合条件A,条件B或条件C,并使用它来重新设置数组,但有没有更简单的方法?如何根据条件将Excel行的内容放入数组

谢谢!

回答

0

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

根据我的猜测,我提供了两种方法。如果这两种方法都没有帮助,请回答一个更全面的解释。

方法1个

负荷的整个范围内,以一个单一的阵列,然后使用第二阵列来记录的类型。

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 

方法2

交错数组可能会更你是什么之后。

我设置工作表Sheet1看起来像这样:

enter image description here

我跑低于第一分类的每一行,并将其放置在相应的数组中的宏。然后它将每个阵列输出到立即窗口中以给出:

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 
相关问题