22-数组的动态扩充和清除

一、动态数组的动态扩充

示例:对指定区域A1:D6的进行查找,找出产品类型为B的行并输入到A8开始的区域内

在该列中,产品类型为B的行数可能不固定,无法被预见,

(一)如果我们只用常规的ReDim,当K=1时,arr1(1)可以正常显示查找结果,但是当K=2时,原数组arr1(1)就会被重置为空值,如下图所示:

(二)因此我们可以用ReDim Preserve arr() 可声明一个动态大小的数组,这种而且可以保留原来的数值,就相当于厂房小了,可以改扩建增大。但是它只能让最未维实现动态,如果是一维不存在最未维,只有一维;如果是二维数组则只能实现列为动态,显然在此例中是行为动态的场景,因此我们可以先定义arr1为4行,K列。等数组运行完后再将arr1转置

(三)用Preserve比较麻烦,也可以预先给arr1指定一个较大的空间来实现,比如指定arr1(1 to 100,1 to 4)

Sub t1()
    Dim arr, arr1(1 To 100, 1 To 4), x, k
    arr = Range("a1:d6")
    
    For x = 1 To UBound(arr)
        If arr(x, 1) = "B" Then
            k = k + 1
            arr1(k, 1) = arr(x, 1)
            arr1(k, 2) = arr(x, 2)
            arr1(k, 3) = arr(x, 3)
            arr1(k, 4) = arr(x, 4)
        End If
    Next x
    
    Range("a8").Resize(k, 4) = arr1

End Sub

二、清除数组

示例:A列的数据按空格间隔分为3段,将3段数据分到D、E、F列

此处有一个易错点就是装入到arr中的数组应为“a1:a16”,而不是“a1:15”,否则最后一个数组将无法被触发粘贴到F列。

Sub t1()
    Dim arr, arr1(1 To 1000, 1 To 1), x, k, m
    arr = Range("a1:a16")
    For x = 1 To UBound(arr)
        If arr(x, 1) <> "" Then
            k = k + 1
            arr1(k, 1) = arr(x, 1)
        Else
            m = m + 1
            Range("c1").Offset(0, m).Resize(k) = arr1
            Erase arr1
            k = 0
        End If
    Next x

End Sub