我已经为超过 35k 行长的数据转储创建了一个数组。我只想在数组中添加包含 16250 个项目(大约 1100 个项目)。到目前为止,我已经创建了一个数组,但它一直达到 35k。如何缩短数组的限制,以在添加最后一个 16250 的单元格后停止?
Dim A(), i as long, j as integer
nr = WorksheetFunction.CountA(Range(Cells(2, 1), Cells(2, 1).End(xlDown))) + 1
nc = Range(Cells(2, 1), Cells(2, 1).End(xlToRight)).Columns.Count
'CBK Array A()
ReDim A(3 To nr, 1 To nc)
For i = 3 To nr
For j = 1 To nc
A(i, j) = Cells(i, j)
End If
Next j
Next i
'create sheet specific array
Dim shArr()
ReDim shArr(3 To nr, 1 To nc)
For i = 3 To nr
For j = 1 To nc
If Left(A(i, 4), 5) = "16250" Then
shArr(i, j) = A(i, j)
End If
Next j
Next i
所以数组 A 达到 35k,但我希望 ShArr 只达到 1100 左右。
我已经尝试过 ubound(a),但它包含了空单元格,即使我从 Chat GTP 听说它不应该包含在内。
类似下面的东西应该可以工作(未经测试)。
您可以用一行将范围读入数组
A
。无需循环。
然后获取
A
第4列中以“16250”开头的元素个数。
然后根据该计数
ReDim ShArr
。
然后将相关数据加载到
ShArr
中。
Dim A() As Variant, lastRow As Long, lastCol As Long
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
lastCol = Cells(2, Columns.Count).End(xlToLeft).Column
A = Range("A2", Cells(lastRow, lastCol).Value
Dim i As Long, counter As Long
For i = Lbound(A, 1) to Ubound(A, 1)
If Left(A(i, 4), 5) = "16250" Then
counter = counter + 1
End If
Next
Dim shArr() As Variant
ReDim shArr(1 to counter, 1 to lastCol)
Dim idx As Long
For i = Lbound(A, 1) To Ubound(A, 1)
If Left(A(i, 4), 5) = "16250" Then
idx = idx + 1
For j = Lbound(A, 2) To Ubound(A, 2)
shArr(idx, j) = A(i, j)
Next
End If
Next
如果以 16250 开头的元素是字母数字,那么您可以使用
WorksheetFunction.CountIfs
和通配符 *
来获取计数,并跳过上面的第一个循环。