删除数组中多余的空白元素VBA

问题描述 投票:0回答:1

我已经为超过 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 听说它不应该包含在内。

arrays excel vba loops bounds
1个回答
1
投票

类似下面的东西应该可以工作(未经测试)。

您可以用一行将范围读入数组

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
和通配符
*
来获取计数,并跳过上面的第一个循环。

© www.soinside.com 2019 - 2024. All rights reserved.