0
我有一张Excel表格,需要遍历每一行,如果符合特定条件,则将数据放入几个不同的数组中的一个中。行数是动态的。我遇到了一些关于声明数组长度的问题。我可以简单地遍历行,检查我想要的条件,并保持总共有多少行符合条件A,条件B或条件C,并使用它来重新设置数组,但有没有更简单的方法?如何根据条件将Excel行的内容放入数组
谢谢!
我有一张Excel表格,需要遍历每一行,如果符合特定条件,则将数据放入几个不同的数组中的一个中。行数是动态的。我遇到了一些关于声明数组长度的问题。我可以简单地遍历行,检查我想要的条件,并保持总共有多少行符合条件A,条件B或条件C,并使用它来重新设置数组,但有没有更简单的方法?如何根据条件将Excel行的内容放入数组
谢谢!
您不会告诉我们关于“声明数组长度的问题”。我的猜测是,您正在从一个范围加载数组,这意味着该行是您无法使用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看起来像这样:
我跑低于第一分类的每一行,并将其放置在相应的数组中的宏。然后它将每个阵列输出到立即窗口中以给出:
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