精华内容
下载资源
问答
  • VBA关于数组Dim,ReDim Preserve运行速度对比思考如何插入一段漂亮的代码片 以前看教程经常有人说ReDim Preserve动态定义数组运行速度非常慢,特做测试分析是否真的想网友说的ReDim Preserve真的不堪重用 经测试得出...

    VBA关于数组Dim,ReDim Preserve运行速度对比思考

    以前看教程经常有人说ReDim Preserve动态定义数组运行速度非常慢,特做测试分析是否真的想网友说的ReDim Preserve真的不堪重用
    经测试得出一下结论:
    1 、ReDim Preserve的速度快慢对redim的次数比较敏感。
    循环100万次,10万次,1万次,对单元格赋值,dim数组,用字典的count次数定义数组维度,及ReDim Preserve动态定义数组,运行时间如下:
    在这里插入图片描述
    大家会发现动态数组运行起来每增加10倍次数,时间却增加100倍,
    但是如果是for i = 1000000 to 1 step -1时,100W次也就2秒左右,
    综上所述,直接定义一个较大维度的数组写代码比较简单,速度也能接受,但是10W次一次的循环直接ReDim Preserve也可以接受
    先赋值给字典,然后用字典的count计数再定义字典,写起来稍微麻烦,但速度快。
    测试代码如下:

    如何插入一段漂亮的代码片

    博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

    // An highlighted block
    Sub 测试用时()
    Dim n&, i&, sr$, A$, B$, C$, Mypath$, brr()
    Application.ScreenUpdating = False
    Rem 单元格操作用时
    iRow = 10000
    Range("A1:D" & iRow).ClearContents
    t = Timer
    Mypath = "C:\Users\DDN\Desktop\test\*.*"
    For i = 1 To iRow
        Cells(i, 1) = i
        Cells(i, 2) = i * 2
        Cells(i, 3) = i * 4
        Cells(i, 4) = i * 6
    Next
    [G1].Value = Format(Timer - t, "0.00")
    i = 0
    
    
    Rem 数组操作用时定义一个很大维度
    Range("A1:D" & iRow).ClearContents
    t = Timer
    Dim arr(1 To 10000, 1 To 4)
    For i = 1 To iRow
        arr(i, 1) = i '序号
        arr(i, 2) = i * 2
        arr(i, 3) = i * 4
        arr(i, 4) = i * 6
    Next
    Range("A1").Resize(UBound(arr, 1), UBound(arr, 2)) = arr
    [G2].Value = Format(Timer - t, "0.00")
    i = 0
    
    
    Rem 用字典count重定义数组维度
    Range("A1:D" & iRow).ClearContents
    t = Timer
    Set Mydic = CreateObject("Scripting.Dictionary") '创建一个字典放结果
    For i = 1 To iRow
            A = i * 2
            B = i * 4
            C = i * 6
            Mydic(n) = A & "|" & B & "|" & C
    Next
    i = 0
    ReDim myarr(1 To Mydic.Count, 1 To 4)
    For i = 1 To Mydic.Count
        myarr(i, 1) = i
        myarr(i, 2) = Split(Mydic(n), "|")(0)
        myarr(i, 3) = Split(Mydic(n), "|")(1)
        myarr(i, 4) = Split(Mydic(n), "|")(2)
    Next
    Range("A1").Resize(UBound(myarr), UBound(myarr, 2)) = myarr
    [G3].Value = Format(Timer - t, "0.00")
    i = 0
    
    
    Rem ReDim Preserve arr
    Range("A1:D" & iRow).ClearContents
    t = Timer
    For i = 1 To iRow
            ReDim Preserve brr(1 To 4, 1 To i)
            brr(1, i) = i
            brr(2, i) = i * 2
            brr(3, i) = i * 4
            brr(4, i) = i * 6
    Next
    Range("A1").Resize(i, 4) = Application.Transpose(brr)
    [G4].Value = Format(Timer - t, "0.00")
    Application.ScreenUpdating = True
    End Sub
    
    
    
    
    
    
    
    
    
    
    
    VBA关于数组Dim,ReDim Preserve运行速度对比思考
    如何插入一段漂亮的代码片
    以前看教程经常有人说ReDim Preserve动态定义数组运行速度非常慢,特做测试分析是否真的想网友说的ReDim Preserve真的不堪重用
    经测试得出一下结论:
    1 、ReDim Preserve的速度快慢对redim的次数比较敏感。
    循环100万次,10万次,1万次,对单元格赋值,dim数组,用字典的count次数定义数组维度,及ReDim Preserve动态定义数组,运行时间如下:
    在这里插入图片描述
    大家会发现动态数组运行起来每增加10倍次数,时间却增加100倍,
    但是如果是for i = 1000000 to 1 step -1时,100W次也就2秒左右,
    综上所述,直接定义一个较大维度的数组写代码比较简单,速度也能接受,但是10W次一次的循环直接ReDim Preserve也可以接受
    先赋值给字典,然后用字典的count计数再定义字典,写起来稍微麻烦,但速度快。
    测试代码如下:
    
    如何插入一段漂亮的代码片
    去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.
    
    // An highlighted block
    Sub 测试用时()
    Dim n&, i&, sr$, A$, B$, C$, Mypath$, brr()
    Application.ScreenUpdating = False
    Rem 单元格操作用时
    iRow = 10000
    Range("A1:D" & iRow).ClearContents
    t = Timer
    Mypath = "C:\Users\DDN\Desktop\test\*.*"
    For i = 1 To iRow
        Cells(i, 1) = i
        Cells(i, 2) = i * 2
        Cells(i, 3) = i * 4
        Cells(i, 4) = i * 6
    Next
    [G1].Value = Format(Timer - t, "0.00")
    i = 0
    
    
    Rem 数组操作用时定义一个很大维度
    Range("A1:D" & iRow).ClearContents
    t = Timer
    Dim arr(1 To 10000, 1 To 4)
    For i = 1 To iRow
        arr(i, 1) = i '序号
        arr(i, 2) = i * 2
        arr(i, 3) = i * 4
        arr(i, 4) = i * 6
    Next
    Range("A1").Resize(UBound(arr, 1), UBound(arr, 2)) = arr
    [G2].Value = Format(Timer - t, "0.00")
    i = 0
    
    
    Rem 用字典count重定义数组维度
    Range("A1:D" & iRow).ClearContents
    t = Timer
    Set Mydic = CreateObject("Scripting.Dictionary") '创建一个字典放结果
    For i = 1 To iRow
            A = i * 2
            B = i * 4
            C = i * 6
            Mydic(n) = A & "|" & B & "|" & C
    Next
    i = 0
    ReDim myarr(1 To Mydic.Count, 1 To 4)
    For i = 1 To Mydic.Count
        myarr(i, 1) = i
        myarr(i, 2) = Split(Mydic(n), "|")(0)
        myarr(i, 3) = Split(Mydic(n), "|")(1)
        myarr(i, 4) = Split(Mydic(n), "|")(2)
    Next
    Range("A1").Resize(UBound(myarr), UBound(myarr, 2)) = myarr
    [G3].Value = Format(Timer - t, "0.00")
    i = 0
    
    
    Rem ReDim Preserve arr
    Range("A1:D" & iRow).ClearContents
    t = Timer
    For i = 1 To iRow
            ReDim Preserve brr(1 To 4, 1 To i)
            brr(1, i) = i
            brr(2, i) = i * 2
            brr(3, i) = i * 4
            brr(4, i) = i * 6
    Next
    Range("A1").Resize(i, 4) = Application.Transpose(brr)
    [G4].Value = Format(Timer - t, "0.00")
    Application.ScreenUpdating = True
    End Sub
    
    
    
    
    
    
    
    
    
    
    
    Markdown 1794 字数 100 行数 当前行 13, 当前列 0 HTML 1685 字数 77 段落
    ×
    拖拽到此处
    图片将通过Fatkun完成下载
    
    展开全文
  • Redim preserve

    2012-11-20 11:06:19
    数组是包含相同数据类型的一组变量的集合,对数组中的单个变量引用通过数组索引下标进行。在内存中表现为一个连续的内存块,必须用Global或Dim语句来定义。...除了以上固定数组外,VBA还有一种功能强...
    数组是包含相同数据类型的一组变量的集合,对数组中的单个变量引用通过数组索引下标进行。在内存中表现为一个连续的内存块,必须用Global或Dim语句来定义。定义规则如下:
    Dim 数组名([lower to ]upper [, [lower to ]upper, ….]) as type ;Lower缺省值为0。二维数组是按行列排列,如XYZ(行,列)。
    除了以上固定数组外,VBA还有一种功能强大的动态数组,定义时无大小维数声明;在程序中再利用Redim语句来重新改变数组大小,原来数组内容可以通过加preserve关键字来保留。如下例:
    Dim array1() as double : Redim array1(5) : array1(3)=250 : Redim preserve array1(5,10)

    Sub 按钮8_Click()

    Dim arr() As Variant
    ReDim Preserve arr(0) As Variant
    arr(0) = "0"

    Debug.Print arr(0)

    ReDim Preserve arr(2) As Variant
    arr(1) = 1
    arr(2) = "2"
    Debug.Print Trim(arr(1))
    Debug.Print arr(2)


    End Sub
    展开全文
  • Redim Preserve Inside Loop

    2020-12-30 03:24:59
    Redim Preserve foo(UBound(foo) + 1) foo(UBound(foo)) = n '... While {condition} </code></pre> <p>` <p>Rubberduck should point out that the redimensioning is inefficient and ...
  • 定义方式 dim arr11 (5) dim arr12 (0 to 5 ) dim arr13 (1 to 5) dim arr21(1,5) dim arr22(0 to 1 ,0 to 5) dim arr22(1 to 1 ,1 to 5) dim arr3() 静态数组 dim arr51(5) ...redim arr61(13) r...

     

    定义方式
    dim  arr11 (5)
    dim  arr12 (0 to 5 )
    dim  arr13 (1 to 5)

    dim arr21(1,5)
    dim arr22(0 to 1 ,0 to 5)
    dim arr22(1 to 1 ,1 to 5)

    dim arr3()


    静态数组
    dim  arr51(5)

    动态数组
    dim arr61()
    redim arr61(13)
    redim arr61(20)
    redim arr61(j)
    redim arr61(1 to k)


    dim arr71()
    redim preserve  arr71( 1 to 10)

    dim arr81()
    arr81(0)=1
    redim preserve  arr81( 1 to 10)


    dim arr91()
    arr91(1)=2
    redim preserve  arr91( 1 to 10)
     

     

    数组的定义方式的差别

    • Dim arr1 As Range         '定义为excel对象,arr1是对象名。range是EXCEL的对象,cells也是
    •                                         '并且这样的数组一定是 2维数组
    • Dim arr2                          '定义变量,arr2是变量名
    •                                         '变量最灵活,变量可以被 对象赋值,也可以被数组直接赋值  
    • Dim arr3()                        '定义为数组,arr3是数组名
    •                                         '而且这是动态数组,index默认了从0开始
    •                                         ' 动态数组才配合用 redim ,静态数组不需要
    •                                         ' 动态数组只能改变最后1个维度
    • dim  arr4(5)                      '这是静态数组,静态数组不需要redim

     

    数组定义与数组个数

    • dim arr1(5)                                        'index是 0,1,2,3,4,5,共6个index
    • dim arr1(1 to 5)                                 'index是 1,2,3,4,5,共5个index
    • option base 2   dim arr1(5)               'index是 2,3,4,5,共4个index

     

    什么时候用redim 和 preserve

    • 数组先被定义为了 动态数组 dim arr1()
    • 后面可以重新定义 redim arr1(k)
    • 可以进行多次redim
    • 如果下次redim想 保留之前 arr1里的数据,则需要写 redim preserve arr1(k) 
    • 容易出错的地方 redim preserve arr1(1 to k)往往会报错,越界,因为之前index从0开始,无法匹配preserve
    • 代码中使用了ReDim Preserve语句,出现类型不匹配? 多半是因为在声明变量时写成了arr,而非arr()

    举例子

    • 如果要用 redim perserve arr1() ,那需要arr1先别定义为动态数组 dim arr1(), 只是定义为变量时不行的 dim arr1
    • 实际上这段代码不需要preserve!!用来语法举例,
    Sub ponyma_array2()
    Dim arr1()  '当数组定义,且默认开始的index为0! preserve时需要有0的index
    'dim arr1 当变量定义
    
    'Application.WorksheetFunction.CountA (Range("c:c"))
    'Debug.Print Application.WorksheetFunction.CountA("c:c")
    '这种counta只会把"a:a"当成1个字符串,不知道是对象1列,只会统计出1
    
       k = 1
       m = 1
       
       ReDim  preserve arr1(0 To Application.WorksheetFunction.CountA(Range("c:c")))
    ' 下标越界  ReDim  preserve arr1(1 To Application.WorksheetFunction.CountA(Range("c:c")))
          
    '   Debug.Print Application.WorksheetFunction.CountA(Range("c:c"))
    '   Debug.Print Range("c65536").End(xlUp).Row
    
       For i = 1 To Range("c65536").End(xlUp).Row Step 1
           If Cells(i, 3) <> "" Then
         
              Debug.Print Cells(i, 3)
              arr1(k) = Cells(i, 3)
              Debug.Print arr1(k)
              k = k + 1
    '          Debug.Print arr1(k),写在这里问题1:k已经变了,下一个k还没赋值为空,2最后的k越界
    '          循环是很精巧的,放的地方很讲究,放得不对,就错误百出
             
           End If
       Next i
       
       For j = 1 To UBound(arr1, 1)
           Cells(m, 10) = arr1(j)
           m = m + 1
       Next j
    
    End Sub

     

    数组的边界

    • 一维数组边界
    • lbound (arr1,1)  或 lbound (arr1)     下边界
    • ubound(arr1,1)  或 ubound(arr1)     上边界
    •  
    •  
    • 二维数组边界
    • lbound(arr1,1)          第1维的下边界,excel里的最小行数
    • ubound(arr1,1)         第1维的上边界,excel里的最大行数
    • lbound(arr1,2)          第2维的下边界,excel里的最小列数
    • ubound(arr1,2)         第2维的上边界,excel里的最大行数

     

    数组的赋值

     

     

     

     

     

    https://blog.csdn.net/weixin_42832348/article/details/81430634

     

    https://zhidao.baidu.com/question/525808449407658485.html

     

    如果要保留值改变数组的大小,只能修改数组的最后一维大小。
    类型不匹配是因为re没有声明,你改成dim re()

    http://www.excelpx.com/thread-322210-1-1.html

    1. Sub aa()
    2.     Dim arr, x, aa, bb, xx, cc, d, s
    3.     Dim re()  '下面需要重新定义数组,所以开始要先定义re为一个数组
    4.     arr3 = Range("x5").CurrentRegion.Value
    5.     'x5 的区域都是非空数值
    6.     ReDim re(1 To UBound(arr3) * 8, 1 To 1) '因为重新定义了数组,所以数组是空的
    7.     '如果重新定义前,数组赋值过,REDIM 后也会把数组清空的
    8.     '如果数组赋值过,REDIM 时还要保留源数据,需要加上 Preserve关键字
    9.     '写法  ReDim Preserve re(1 To UBound(arr3) * 8, 1 To 1)
    10.     '新数组re赋值,可以使用循环的方法进行赋值
    11.    
    12.     MsgBox re(6, 1)
    13.     For i = 1 To UBound(arr3)
    14.         For ii = 1 To 8
    15.             Cells(i, ii) = re(i, 1)
    16.         Next
    17.     Next
    18. End Sub

     

    VBA只能动态修改数组最后一维的大小

    Sub text()
    Dim arr(), i As Integer, j As Integer
    Dim brr
    i = Sheet2.Range("k65536").End(xlUp).Row
    brr = Sheet2.Range("a1:k" & i)
      For i = 2 To UBound(brr)
        If brr(i, 11) = 2 Then
            j = j + 1
            ReDim Preserve arr(1 To 11, 1 To j)
            For r = 1 To 11
                arr(r, j) = brr(i, r)
            Next
        End If
    Next
    Sheets("表2").Range("a18").Resize(UBound(arr, 2), UBound(arr)) = Application.Transpose(arr)
    End Sub

     

     

     

     

    dim arr(1 to 3 ) as string

    dim arr() as variant

     

     

    redim arr(1)

    arr=Array("a","b","c")

     

    动态数组

    k=0

    redim arr(1 to k) 

    k=k+1

     


     

     

    Sub jackma101()
    '尝试每个txt导入为1行,或1个sheet----往数组里append 不会!,只会用cells()=存起来文件名
    
    x1 = input_files1("C:\Users\Administrator\Desktop\test1", "\*.txt")
    'x1 = input_files1("C:\Users\Administrator\Desktop", "\*.txt")
    'debug.print input_files1("C:\Users\Administrator\Desktop", "\*.txt")
    
    
    End Sub
    
    
    
    Function input_files1(PATH1, PATH2)
    '取文件数量
    '取文件名
    Dim arr1()
    
    
    k = 0
    file1 = Dir(PATH1 & PATH2)
    Debug.Print file1
    arr1(k) = file1
    
    
    Do Until Len(file1) = 0
    
    
       file1 = Dir
       k = k + 1
       arr1(k) = file1
          
       Debug.Print file1
       Debug.Print k
       
    Loop
    
    Debug.Print "sum= " & k
    
    End Function
    
    
    
    
    

     

    数组里辅助了

    取出来为啥是空?

    Sub jackma101()
    '尝试每个txt导入为1行,或1个sheet
    
    x1 = input_files1("C:\Users\Administrator\Desktop\test1", "\*.txt")
    'x1 = input_files1("C:\Users\Administrator\Desktop", "\*.txt")
    'debug.print input_files1("C:\Users\Administrator\Desktop", "\*.txt")
    
    
    
    
    
    
    
    
    End Sub
    
    Function input_files1(PATH1, PATH2)
    '取文件数量
    '取文件名
    Dim arr1()
    
    
    file1 = Dir(PATH1 & PATH2)
    k = 0
    
    Debug.Print file1
    Debug.Print k
    
    
    Do Until Len(file1) = 0
       file1 = Dir
       k = k + 1
    
        ReDim arr1(1 To k)
        arr1(k) = file1
        
       Debug.Print "arr(K)=" & arr1(k)
       Debug.Print file1
       Debug.Print k
    
    Loop
    Debug.Print "sum= " & k
    
    
    
    For i = LBound(arr1, 1) To UBound(arr1, 1)
        Debug.Print arr1(i) & "?"
    Next i
    
    
    End Function
    

     

    Sub jackma101()
    '尝试每个txt导入为1行,或1个sheet
    
    x1 = input_files1("C:\Users\Administrator\Desktop\test1", "\*.txt")
    'x1 = input_files1("C:\Users\Administrator\Desktop", "\*.txt")
    'debug.print input_files1("C:\Users\Administrator\Desktop", "\*.txt")
    
    
    
    
    
    
    
    
    End Sub
    
    Function input_files1(PATH1, PATH2)
    '取文件数量
    '取文件名
    Dim arr1()
    
    
    file1 = Dir(PATH1 & PATH2)
    k = 0
    
    Debug.Print file1
    Debug.Print k
    
    
    Do Until Len(file1) = 0
       file1 = Dir
       k = k + 1
    
        ReDim Preserve arr1(1 To k)
        arr1(k) = file1
        
       Debug.Print "arr(K)=" & arr1(k)
       Debug.Print file1
       Debug.Print k
    
    Loop
    Debug.Print "sum= " & k
    
    
    
    For i = LBound(arr1, 1) To UBound(arr1, 1)
        Debug.Print arr1(i) & "?"
    Next i
    
    
    End Function
    

     

     

    Sub jackma101()
    '尝试每个txt导入为1行,或1个sheet
    
    x1 = input_files1("C:\Users\Administrator\Desktop\test1", "\*.txt")
    'x1 = input_files1("C:\Users\Administrator\Desktop", "\*.txt")
    'debug.print input_files1("C:\Users\Administrator\Desktop", "\*.txt")
    
    
    End Sub
    
    Function input_files1(PATH1, PATH2)
    '取文件数量
    '取文件名
    Dim arr1()
    
    
    file1 = Dir(PATH1 & PATH2)
    k = 0
    
    ReDim arr1(1)
    arr1(0) = file1
    
    
    Do Until Len(file1) = 0
       file1 = Dir
       k = k + 1
    
        ReDim Preserve arr1(0 To k)
        arr1(k) = file1
        Debug.Print "arr(K)=" & arr1(k)
    
    Loop
    Debug.Print "sum= " & k
    
    
    
    
    
    For i = LBound(arr1, 1) To UBound(arr1, 1)
        Debug.Print arr1(i)
        
        Open PATH1 & "\" & arr1(i) For Input As #1
        Input #1, str1
    
    '    ActiveSheet.Cells(i, 1).Value = arr1(i)
    '    ActiveSheet.Cells(i, 2).Value = str1
        Close #1
        
        
    Next i
    
    

    3.3 先写入数组array中,再写到其他地方,据说这样能大幅提高速度!

    把需要的筛选的数据,存在数据,然后从数组写到需要的地方,这是个好习惯

    第1版

    
    
    Sub 删除空格4()
    Dim arr1()
    
    
    ReDim arr1(11)                      '必须重新定义,现在不太理解
    j = 0                               'j=1开始就会越界
    For i = 1 To 11 Step 1
       If Not IsEmpty(Cells(i, 1)) Then
          arr1(j) = Cells(i, 1)
          j = j + 1
       End If
    Next i
    
    
    For j = 0 To UBound(arr1())
        Cells(j + 1, 9) = arr1(j)      '单元格得从1开始,arr()得从0开始
    Next j
    
    
    End Sub
    

    第2版重写

    • 要注意的问题
    • 1 定义数组arr1() 实际已经定义了index为0
    • 2 现在还不明白为啥这次redim 需要加 preseve?
    • 3 使用VBA函数,如countA时,不能像在EXCEL表公式里  countA("c:c") 这是countA  一个字符串
    • 必须用 countA(range("c:c"))  这才表示引用的excel对象
    • debug.print用来监测的时候,需要注意,放在循环的位置,尤其是在k=K+1这种变化时,和放在哪个for循环之内外!
    Sub ponyma_array2()
    Dim arr1()  '当数组定义,且默认开始的index为0! preserve时需要有0的index
    'dim arr1 当变量定义
    
    
    k = 1
    m = 1
    
    'Application.WorksheetFunction.CountA (Range("c:c"))
    'Debug.Print Application.WorksheetFunction.CountA("c:c")
    '这种counta只会把"a:a"当成1个字符串,不知道是对象1列,只会统计出1
    
    
    ReDim Preserve arr1(0 To Application.WorksheetFunction.CountA(Range("c:c")))
    ' 下标越界  ReDim Preserve arr1(1 To Application.WorksheetFunction.CountA(Range("c:c")))
    
    
       For i = 1 To Range("c65536").End(xlUp).Row Step 1
           If Cells(i, 3) <> "" Then
         
              Debug.Print Cells(i, 3)
              arr1(k) = Cells(i, 3)
              Debug.Print arr1(k)
              k = k + 1
    '          Debug.Print arr1(k),写在这里问题1:k已经变了,下一个k还没赋值为空,2最后的k越界
    '          循环是很精巧的,放的地方很讲究,放得不对,就错误百出
             
           End If
       Next i
       
       For j = 1 To UBound(arr1, 1)
           Cells(m, 10) = arr1(j)
           m = m + 1
       Next j
    
    End Sub

    第3版

    Option Explicit
    
    Sub ponyma1()
    
    
    Dim arr1()
    Dim k1, k2, k
    Dim i, j
    k1 = WorksheetFunction.CountA(Range("a:a"))
    k2 = Range("a65536").End(xlUp).Row
    Debug.Print "这列非空数据个数k1=" & k1
    Debug.Print "这列最后1个有数据的行数k2=" & k2
    
    
    'arr1(0) = 1
    'ReDim Preserve arr1(1, k)
    '这样会越界,因为你需要preserve数据。但是index系不符合
    '但是,如果不preserve 就无所谓
    '或者虽然 dim arr1() 是动态数据从index0开始,但是arr1()一直为空,preserve也不会出现index越界问题
    
    ReDim Preserve arr1(1 To k1)
    'ReDim Preserve arr1(1, k1) 这样就会越界。。。因为语法是2维数组了!
    'ReDim Preserve arr1(1 to k1) 这样就对的
    
    k = 1
    For i = 1 To k2
       If Cells(i, 1) <> "" Then
          arr1(k) = Cells(i, 1)
          Debug.Print arr1(k)
          k = k + 1
       End If
    Next i
    展开全文
  • Redim方法其实我在上篇文章中已经用过,是用来调整动态数组的大小,因为我们有时候在用数组的时候,是不知道需要多大的数组的,而且Dim定义数组大小的时候是不支持变量的,所以这时候需要用到Redim。例一:用数组...
    47389e342f2fab911bc9fb114fe87d47.png

    Redim方法其实我在上篇文章中已经用过,是用来调整动态数组的大小,因为我们有时候在用数组的时候,是不知道需要多大的数组的,而且Dim定义数组大小的时候是不支持变量的,所以这时候需要用到Redim。

    例一:用数组实现依次将下表中数据依次存放到E列

    7adb077c8dcaa84f8f1126a1bc1847e7.png

    例一

    代码如下:

    Sub test()    Dim arr    Dim brr()    arr = [A1].CurrentRegion    ReDim brr(1 To UBound(arr) * UBound(arr, 2), 1 To 1)'定义brr数组的大小    n = 1    For i = 1 To UBound(arr)        For j = 1 To UBound(arr, 2)            brr(n, 1) = arr(i, j)            n = n + 1        Next    Next    [E1].Resize(UBound(brr), 1) = brrEnd Sub

    从例一中可以看出,在程序运行前,我们是不知道数据的个数,所以需要用到Redim,定义数组brr的大小。


    Redim方法还有个可选参数Preserve ,用来保留数组原数据,因为如果不加Preserve 的话,每次Redim后,数组中的数据将被清空,有时候我们需要在保留原数据的同时扩充数组,就必须加上Preserve

    例二:如图,有一列数据,用数组实现将其中大于50的数取出,存放到E列

    243270969e7d0432cb35d9e9d74762cc.png

    例二

    代码如下:

    Sub test()    Dim arr    Dim arr2()    Dim n%    arr = [A1].CurrentRegion    n = 0    For i = 1 To UBound(arr)        If arr(i, 1) > 50 Then            n = n + 1'统计符合条件的值得个数,            ReDim Preserve arr2(1 To n)'调整数组arr2的大小,并且保留原有数据            arr2(n) = arr(i, 1)        End If    Next    [D1].Resize(n, 1) = Application.Transpose(arr2)End Sub

    Excel VBA 之 统计词汇出现次数Sub test() Dim arr Dim arr2() Dim n% arr = [A1].CurrentRegion n = 0 For i = 1 To UBound(arr) If arr(i, 1) > 50 Then n = n + 1'统计符合条件的值得个数, ReDim Preserve arr2(1 To n)'调整数组arr2的大小,并且保留原有数据 arr2(n) = arr(i, 1) End If Next [D1].Resize(n, 1) = Application.Transpose(arr2) End Sub

    ReDim Preserve在使用时有以下注意点:

    1. 只能通过更改上限来更改数组大小;更改下限会导致错误
    2. 只能调整最后一个数组维度的大小,并且无法更改维度数目
      这样做是错误的:ReDim Rreserve arr(1 to n,1 to 2)
      应该这样: ReDim Preserve arr(1 to 2,1 to n)
      如果需要调整第1维大小,那就要先扩充第2维,然后用Application.Transpose转置一下就可以了。

    大家可以点开下面链接,查看我的其他文章哦!

    848个Excel VBA 实用技巧,实例+详细解析,入门必看,建议收藏

    Excel VBA 之 数组的优点及应用

    Excel VBA 之 统计词汇出现次数

    Excel VBA 之 去除重复项

    Excel VBA 之 自动建立工作表目录

    Excel VBA 之 将txt文档批量导入至Excel

    。。。

    喜欢本文章的朋友记得收藏、点赞、关注哦,网友们如果在Excel中遇到问题都可以找我交流,也可以在评论区或私信告诉我你想看到的VBA办公教程,我将在下期分享给大家,以后不定期更新Excel VBA技巧!

    展开全文
  • Redim方法其实我在上篇文章中已经用过,是用来调整动态数组的大小,因为我们有时候在用数组的时候,是不知道需要多大的数组的,而且Dim定义数组大小的时候是不支持变量的,所以这时候需要用到Redim。例一:用数组...
  • 关于二维数组Redim Preserve: 如果使用了Preserve关键字,就只能重定义数组最末维的大小,且根本不能改变维数的数目。 具体参考 1 如果使用了 Preserve 关键字,就只能重定义数组最末维的大小,且根本不能...
  • redim时只有最后1维可变化,redim不太适合和循环搭配,即使用 redim preserve也不行! 你装数据时一般都会有一个充当计数器的变量,这个变量最后的值就是数组中装入值的数量 一般是声明一个足够大的静态数组,或二次...
  • VBA动态数组

    2016-08-08 13:25:00
    如何动态地向数组中添加新的数据,可以用...redim preserve arr(row,col) as string 'redim就是起动态定义的作用,因为这里row和col可以是变量,dim中必须是常量。preserve按列保留数组中已有的数据,所有加preserve...
  • VBA动态数组简单应用

    2021-01-18 12:35:36
    ###VBA动态数组简单应用 动态数组在VBA中,用于筛选大数据是比较好用的.当一行数据满足筛选要求时,将该行数据写入到新的数组中,逐维增加,最后再将这个新的数组输出... redim preserve arr(1 to 5, 2 to x) *注意
  • VBA Excel 的数组输入以及循环显示,应用于VBA中的Visual Basic 其中涉及数组的大小的重新定义尺寸,用Redim ...ReDim Preserve i考试成绩(i人数) For i = 1 To i人数 i考试成绩(i) = InputBox("输入考试成绩" &
  • ' 优先队列 Private pq() As Integer Private n As Integer '创建一个优先队列 Private Sub class_initialize() ' 0 位置没有使用 n = 0 ReDim pq(1) End Sub ... ReDim Preserve pq(max) En
  • 利用dimArr()asstring这样声明,...如果要改变数组大小,要用redim命令redimarr(10) 加preserve可以不清空数组,保持原有数据preserveredimarr() 转载于:https://www.cnblogs.com/jenney-qiu/p/4346623.html...
  • myarray=rs.GetRows'将记录集结果赋值给数组示例语句 ...ReDim Preserve myarray(UBound(myarray) + 1)'重置数组大小且保留原来数据 将数组写入表格 [a1:a?] = Application.WorksheetFunction.T...
  • 动态数组与静态数组 在声明数组时将指定数组的上下界限与维度,由此创建的数组为静态数组。如下代码声明5行2列的静态二维数组,在...Sub StaticArray() Dim astrStatic(1 To 5, 1 To 4) As String ReDim Preserve...
  • Sub test() Dim my my = Array("a", "b", "c", "d") ae = UBound(my) + 1 my = WorksheetFunction.Transpose(my) ReDim Preserve my(1 To ae, 1 To 3) Debug.Print my(1, 1) End Sub
  • 一个VBA群里有个网友求助,我写了个试试,好像可以。。。以后在改进 Sub test_find1() Dim sh1 As Object Dim cell1 As Object Dim arr1() target1 = "A" I = 1 ... ReDim Preserve...
  • (接上讲)四 代码的运行过程及讲解1 窗体文件的构建Dim Txt() As New mytextPrivate Sub UserForm_Initialize()For Each myctl In Me.ControlsIf TypeName(myctl) = "TextBox" Thenm = m + 1ReDim Preserve Txt(1 To ...
  • ReDim Preserve PanelName(UBound(PanelName) + 1) Wend If I res = WarningMsg("PanelName not found!") Exit Sub End If DeleteWorkSheet ("板材加工信息") Set NewSheet = Worksheets.Add NewSheet....
  • 看了下,代码有问题 b=0 一般不应该在循环内,并且redimpreserve 数组估计被不断重置了 另外combobox1.list 报错不应该有问题,怀疑是写成了comboboxl 或有几个combobox 造成当前的不是combobox1 1.1 ...
  • LIB, LIKE, LINE_INPUT, LSET, ME, MID, MKDIR, MOD, NAME, NEXT, NEW, NOT, NOTHING, NULL, ON, ON_ERROR, ON_LOCAL_ERROR, OPEN, OPTIONAL, OR, OUTPUT, PARAMARRAY, PRESERVE, PRINT, PRIVATE, PUBLIC, PUT, ...
  • ReDim Preserve brr(1 To 200000, 1 To UBound(arr, 2)) End If For i = a To UBound(arr) '遍历行 k = k + 1 '累加记录条数 For j = 1 To UBound(brr, 2) '遍历列 brr(k, j) = arr(i, j) Next Next End If...
  • RANDOM, RAISEEVENT, READ, READ_WRITE, REDIM, REM, RESET, RESUME, RETURN, RSET, SEEK, SELECT, SET, SHARED, SINGLE, SPC, STATIC, STEP, STOP, STRING, SUB, TAB, TEXT, THEN, TO, TRUE, TYPE, TYPEOF, UNLOCK,...
  • ReDim Preserve arr(features.Columns.Count - 1) Dim i As Integer For i = 0 To UBound(arr) arr(i) = features(1, i + 1) Next i SCOREROW = score(arr) End Function </code></pre> <p>...
  • OPTIONAL, OPTION_BASE, OPTION_EXPLICIT, OPTION_COMPARE, OPTION_PRIVATE_MODULE, OR, OUTPUT, PARAMARRAY, PRESERVE, PRINT, PRIVATE, PROPERTY_GET, PROPERTY_LET, PROPERTY_SET, PUBLIC, PUT, RANDOM, ...
  • Visual Basic 2008/2010从入门到精通

    热门讨论 2012-02-28 19:05:54
    11.2 使用ReDim Preserve语句保存数组原有数据 11.3 补充知识:使用Array类中的方法处理大型数组 11.4 本章小结 第12章 使用集合和System.Collections命名空间 12.1 使用对象集合 12.1.1 引用集合中的对象 ...
  • 8.1.4 preserve关键字 315 8.2 集合 315 8.2.1 循环语句 317 8.2.2 装箱 319 8.3 泛型 320 8.3.1 泛型的使用 321 8.3.2 nullable类型 322 8.3.3 泛型类型 323 8.3.4 泛型方法 326 8.4 创建泛型 327 8.4.1 ...
  • 8.1.4 preserve关键字 315 8.2 集合 315 8.2.1 循环语句 317 8.2.2 装箱 319 8.3 泛型 320 8.3.1 泛型的使用 321 8.3.2 nullable类型 322 8.3.3 泛型类型 323 8.3.4 泛型方法 326 8.4 ...
  • 8.1.4 preserve关键字 315 8.2 集合 315 8.2.1 循环语句 317 8.2.2 装箱 319 8.3 泛型 320 8.3.1 泛型的使用 321 8.3.2 nullable类型 322 8.3.3 泛型类型 323 8.3.4 泛型方法 326 8.4 创建泛型 ...

空空如也

空空如也

1 2
收藏数 32
精华内容 12
关键字:

preserveredimvba