精华内容
下载资源
问答
  • VBA数组VBA数组VBA数组

    2010-07-14 23:15:29
    VBA数组VBA数组VBA数组VBA数组VBA数组
  • VBA数组

    千次阅读 2019-05-03 01:49:57
    VBA数组详解

    定义数组

    • 固定宽度数组
    '在声明数组时,必须指定数组上界索引号,下界索引号没有指定,则默认为0。
    '所以:dim arr(10) 与 dim arr(0 to 10) 实际效果是一样的,arr上界索引都是0,数组从0-10
    dim arr(10) as Integer
    
    '该数组指定了下界索引为1,如果没有指定数组数据类型,则默认为变体型变量:Variant,可以赋值各种类型数据。
    dim arr(1 to 10)
    
    '定义二维数组:10*2列
    dim arr(1 to 10,1 to 2)
    
    '将字符串‘第二行第一列’赋值给数组arr
    arr(2,1) = "第二行第一列"
    
    • 动态数组
    dim arr
    '将区域单元格的值赋值给arr
    '数组的上标是从arr(1,1)开始的。注意:arr(1,1)的值是range("a3")的值,即单元格区域左上角值为arr(1,1)。
    arr = range("a3:c10")
    
    '不知道数组空间多大的情况下,先这么定义,假设需要一维数组。
    dim arr()
    '有一个数据符合条件,重新redim定义数组,将其赋值给数组。
    redim arr(1 to 1) 
    arr(1) = "第一个数据"
    
    '现在发现了第二个符合条件的数据,需要先重新定义数组大小,再赋值。
    '这里需要注意,重新定义数据,如果不想丢失之前赋值的数组内容,需要在定义时使用‘preserve’关键字。
    redim preserve arr(1 to 2)
    '赋值
    arr(2) = "第二个数据"
    

    获取数组的上下标

    dim arr
    arr = range("a1:c10")
    '获取上标,我们可以知道数组的形状大小。
    ubound(arr)		'数组行的上标,这里是10,一共有10行。
    ubound(arr,2)		'数组列的上标,指定第二个参数为‘2’是获取列的上标,这里是3,a列到c列一共是3列。
    
    '获取下标
    '一般是1,没什么意义,当然如果是dim arr(10),这样下标是0lbound(arr)
    lbound(arr,2)
    

    可能用到的函数&方法

    • 数组也可以使用工作表一些函数,比如:
    1. sum:求和
    '对数组数据求和
    Application.WorksheetFunction.Sum(arr)
    
    1. index:截取数组某行或者某列
    '定义1010列数组
    dim arr(1 to 10,1 to 10)
    '这里需要注意的是,index第二个或第三个参数,必须有一个为0,只能截取某行或者某列。
    '截取第二列,第三个参数表示截取哪一列。
    Application.WorksheetFuncion.Index(arr,0,2)
    '截取第三行,第二个参数表示截取哪一行。
    Application.WorksheetFuncion.Index(arr,3,0)
    
    1. join:使用指定字符串拼接数组
    arr = array("姓名","年龄")
    '使用下划线将数组连接起来,类似sql的concat函数。
    st = join(arr,"_")
    '输出:姓名_年龄
    
    1. 清空数组
    '有时候我们并不需要该数组了,为节省内存空间,可以清空数组。
    Erase arr
    

    数组写入到单元格

    '定义一个一个105列数组。
    dim arr(1 to 10,1 to 5)
    dim rg as range
    dim i as Byte
    'for each 循环只能用变体型变量,这也是一个需要注意的地方
    dim each_arr
    
    i = 1
    '对数组进行连续整数赋值
    for each each_arr in arr
    	each_arr = i
    	i = i + 1
    next
    
    '使用with语句,可以省去部分代码量。不用再重复引用activesheet,直接在‘.’后面使用with对象的属性或方法即可。
    with activesheet
    	set rg = .range("a1").resize(10,5)
    	'resize用于表示单元格范围,第一个参数表示以起点单元格a1为始的行数,第二个表示列数,数组是105列的。
    	 rg = arr
    	
    	'清除单元格内容
    	rg.clearcontents
    	'将第三列数组数据写入到单元格
    	.range("a1").resize(10,1) = application.worksheetfunction.index(arr,0,3)
    
    	rg.clearcontents
    	'将第五行数组数据写入到单元格
    	.range("a1").resize(1,5) = application.worksheetfunction.index(arr,1,0)
    	'注意,如果单元格的长度不够数组长度,则会从数组下标开始截取单元格长度填充内容到单元格。
    	.range("a1").resize(1,3) = application.worksheetfunction.index(arr,1,0)
    	
    	rg.clearcontents
    	'将第五行数组数据纵向写入到单元格,使用工作表函数:transpose数组转置
    	.range("a1").resize(5,1) = application.worksheetfunction.transpose(application.worksheetfunction.index(arr,1,0))
    	
    	'数组写入到单元格不需要了,清空。
    	Erase arr
    end with
    

    数组筛选代码示例:

    数据源:
    地区 |水果 |销量
    广东 |苹果 | 1
    湖南 |苹果 | 2
    海南 |椰子 | 6
    湖南 |苹果 | 5
    河北 |柿子 | 7
    湖南 |橘子 | 4

    Sub arr_autofiter()
    '关闭屏幕更新
    Application.ScreenUpdating = False
    '关闭自动重算
    Application.Calculation = xlCalculationManual
    Dim arr(), brr
    Dim i, r As Long
    r = 1
    
    With ActiveSheet
        brr = .[a1].CurrentRegion
        ReDim Preserve arr(1 To 3, 1 To r)
        arr(1, r) = "地区"
        arr(2, r) = "水果"
        arr(3, r) = "销量"
        For i = 2 To UBound(brr)
            If brr(i, 1) = "湖南" And brr(i, 2) = "苹果" Then
                r = r + 1
                ReDim Preserve arr(1 To 3, 1 To r)
                arr(1, r) = brr(i, 1)
                arr(2, r) = brr(i, 2)
                arr(3, r) = brr(i, 3)
            End If
        Next
        '将筛选后的数组写入到单元格
        .Cells(1, "e").Resize(UBound(arr, 2), UBound(arr)) = Application.WorksheetFunction.Transpose(arr)
    End With
    
    '恢复屏幕更新,工作表自动重算
    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
    End Sub
    
    • 效果如图:
      在这里插入图片描述

    遍历目录下文件夹和文件区分存放

    arr存放文件,brr存放文件夹

    Sub find_dir()
    Dim arr()
    Dim brr()
    Dim a, b As Byte
    
    path1 = ThisWorkbook.Path & "\"
    f = Dir(path1, vbDirectory)
    Do While f <> ""
        If InStr(f, ".") > 0 Then
            a = a + 1
            ReDim Preserve arr(1 To a)
            arr(a) = f
        Else:
            b = b + 1
            ReDim Preserve brr(1 To b)
            brr(b) = f
        End If
        f = Dir
    Loop
    
    End Sub
    
    展开全文
  • 大家好,我们今日继续VBA数组与字典解决方案,今日讲解VBA数组的声明,一些朋友会问了:数组都讲了这么长时间了,怎么才讲声明啊?是的,有些知识不到一定的程度即使讲了,大家也不能深入的理解,只有到了一定的程度...

    大家好,我们今日继续VBA数组与字典解决方案,今日讲解VBA数组的声明,一些朋友会问了:数组都讲了这么长时间了,怎么才讲声明啊?是的,有些知识不到一定的程度即使讲了,大家也不能深入的理解,只有到了一定的程度,再次讲解,大家才能有真正的收获。

    一 我们先看看下面的声明方法

    1 Dim arr as Variant

    2 Dim arr(1 to 10, 1 to 2 )

    3 dim arr()

    4 ReDim arr(1 To k)

    我们分析一下各种声明方法:

    第一种:声明通常用于单元格直接装入数组如:

    arr =range("a9:c100")

    这种装入非常简单,直接用变量 = 单元格区域即可。但是这里要注意的是对于这种写入时数组的声明只能是:

    Dim arr as Variant

    这时,声明一个变量,不能声明其他数据类型。

    第二种:通常用于一个固定数组的声明,同时给出了数组的上下界。这种声明要注意的是不能一次性的装入单元格的数据,要靠循环

    第三种,是一个动态数组的声明,也就是说,我们在命名数组时还不知道数组的大小,要靠后期的再次定义

    第四种 是再次声明arr的大小,以正好盛下k数量的值。

    二 把单元格数据填入数组和数组数据的回填

    我们利用数组就是为了计算,下面我们看看把工作表中的数据填入数组,及计算后数组数据回填给工作表单元格的方法,看我给出的代码:

    Sub MyNZsz_31() '第31讲 数组的声明及赋值的回填

    Dim arr As Variant '注意此处的Variant

    Dim brr() '注意此处定义了一个动态数组

    Sheets("31").Select

    arr = Sheets("31").UsedRange 'Usedrange的行数和列数是未知的

    MsgBox UBound(arr, 1) '可以计算这个区域有多少行

    MsgBox UBound(arr, 2) '可以计算出这个区域有多少列

    ReDim brr(1 To UBound(arr, 1), 1 To UBound(arr, 2))

    For x = 1 To UBound(arr, 1) '通过循环在arr数组中循环

    For y = 1 To UBound(arr, 2)

    brr(x, y) = arr(x, y) * arr(x, y) '数组自身相乘

    Next

    Next

    '把数组放回到单元格中

    Range("A" & Range("A1").End(xlDown).Row + 2).Resize(UBound(arr, 1), UBound(arr, 2)) = brr

    End Sub

    代码截图:

    7c927a56883c05378682671c52875469.png

    代码的讲解:此代码在代码部分我都做了详细的注释,不再一一讲解了,仅看看下面的这句代码:

    Range("A" & Range("A1").End(xlDown).Row + 2).Resize(UBound(arr, 1), UBound(arr, 2)) = brr

    这句设定了数组回填的区域大小,注意这个区域必须和数组的大小要一致,不然会产生错误。所以我利用了Resize(UBound(arr, 1), UBound(arr, 2))来保证这一点。

    下面我们看代码的运行:

    运行前:

    36d59c741f435efca210bdb398b80d4c.png

    运行,先提示行数:

    48ade9ba4a43cc996711a9a1ee2c3dea.png

    再提示列数:

    260c4f63a5b4a8662f618b02556775be.png

    最后看结果:

    49eebd8fb64156b50c08089d1cf7169f.png

    今日内容回向:

    1 如何给数组声明?

    2 上述实例如果再次运行一下会有什么结果呢?

    展开全文
  • 大家好,我们今日继续讲解VBA数组与字典解决方案,今日讲解第18讲:VBA数组如何定义,又该如何创建呢?从这一讲开始,我们开始进入VBA数组阶段,VBA数组和工作表数组有着不同的意义,在很大程度上,工作表数组的运算...

    大家好,我们今日继续讲解VBA数组与字典解决方案,今日讲解第18讲:VBA数组如何定义,又该如何创建呢?

    从这一讲开始,我们开始进入VBA数组阶段,VBA数组和工作表数组有着不同的意义,在很大程度上,工作表数组的运算甚至可以看做是程序的运行,能够理解工作表数组的运算过程对于VBA代码的书写是非常有益的,但VBA数组在大多数情况下,只是作为变量来存储数据。这点和工作表数组有很大的不同。

    一、什么是VBA数组 所谓VBA数组,就是共享一个名字,有着多个元素按顺序排列的变量。数组中的数据具有相同的类型和结构,元素通过索引加以区分。这里我把数组的元素看做变量来对待,大家要注意,这个观点在应用过程中是非常有意义的。

    二、如何定义数组 数组在使用前必须要进行声明,声名数组同声明其他变量的方式一样,也是用Dim语句来声明。唯一不同的是数组有大小,即有多少个元素,或者说变量,还有就是要说明数组的维数。一般情况下使用较多的是一维数组和两维数组,需要注意的是数组要以字母开头,所用的字符仅限字母、数字和下下划线,不允许出现标点符号和空格。当声明了一个数组,便决定了这个数组用于存储数数据所用的内存空间。

    默认情况下数组是以0为下届,也就是Option Base 0大多数情况下我们都是遵守此默认情况的,并且在用数组时忽略数组的第一个元素,上届不能超过LONG数据类型的范围,而且上届值不能小于下届值。

    如果我们习惯了用1作为我们的下界,可以强制声明:Option Base 1,需要注意的是Option Base 0(1)必须放在所有模块之前。当然,我们也可以忽略这个强制声明,那我们就需要在声明数组时,指明数组的上界和下界,如:Dim arrSheetName(1 to 3) as String表明这个数组的上下界分别是1和3

    下面我们讲通过一个实例来说明数组的声明及赋值,如下面的代码:

    Sub Mynzsz() '第18讲 VBA数组的定义及创建

    Dim i As Integer, j As Integer

    Dim arr(1 To 10, 1 To 2) As Integer '定义一个10*2的二维数组(10行,2列)

    j = 1 '数组1 to 10的索引号

    For i = 1 To 20 Step 2

    arr(j, 1) = i '赋值

    arr(j, 2) = i + 1 '赋值

    j = j + 1 '索引号增加

    Next

    [a1:b65536].ClearContents '清除原有数据

    [a1].Resize(10, 2) = arr '将数组赋值给A1单元格向下10行,向右2列的区域

    End Sub

    代码截图:

    fcaf3280358e9d8aad15a84ec88b01e3.png

    代码讲解:

    1 Dim arr(1 To 10, 1 To 2) As Integer 这里给出了数组的范围最小的是arr(1, 1),最大的是

    arr(10, 2)

    2 [a1].Resize(10, 2) = arr 讲数组回填给工作表。大家是否理解arr的意义呢?我们看看下面的图:

    8c8b5f10fce371e2000445cf924113dd.png

    arr 是一个集合。这个集合包括了20个元素(或者叫变量),分别是arr(1,1);arr(2,1);arr(1,2);arr(2,2);arr(1,3);arr(2,3);arr(1,4);arr(2,4);arr(1,5);arr(2,5);arr(1,6);arr(2,6);arr(1,7);arr(2,7);arr(1,8);arr(2,8);arr(1,9);arr(2,9);arr(1,10);arr(2,10)

    运行后:

    b6bb660f845cbcfef4a128243ffb88c2.png

    今日内容回向:

    1 什么是VBA数组。

    2 VBA数组如何声明?

    展开全文
  • 大家好,我们今日继续讲解VBA代码解决方案的第111讲内容:VBA数组的深入讲解,如何创建VBA数组及数组大小的判断一、如何创建数组: 1、使用Array创建数组。 看以下代码: Sub Mynz_sz1() Dim arr() arr = Array(1, ...

    23170840a205ab7f932458267b39c0d5.png

    大家好,我们今日继续讲解VBA代码解决方案的第111讲内容:VBA数组的深入讲解,如何创建VBA数组及数组大小的判断

    一、如何创建数组:

    1、使用Array创建数组。

      看以下代码:

    Sub Mynz_sz1()

    Dim arr()

    arr = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) '将1到10十个自然数赋给数组arr

    [a1].Resize(1, 10) = arr '将数组的值输入单元格,注意这里没有用转置函数

    End Sub

    代码窗口

    fad6e3143713c20769c6291549258d2f.png

    运行:

    2acc2d6b1fc871ae53b385006bd503dc.png

     特别注意点1:使用Array创建的数组索引号默认从0开始,当然,如果已经用“OPTION BASE 1”语句指定了的另当别论。

     特别注意点2:如果赋的值是文本,那需要用英文引号引起来,如:

      代码: arr = Array("张一", "徐一", "陈一", "王一")

    2、使用Split创建数组

    Split的作用是把一个文本,根据指定的分隔符,建立一个数组。感觉就有点像我们EXCEL中的基础操作中的“分列”。不同的是“分列”操作是将一个单元格的文本按指定的分隔符分开,存放在同行的多个单元格里,而Split的作用是将一个文本(也可以是存放在单元格里的)按指定的分隔符分开,存放在一个数组变量里。

    arr = Split("张一,徐一,陈一,王一,许一,张二,陈二,张三,徐二,张四", ",")

     特别注意点3:用Split把文本转换成数组,索引号总是从0开始。不管你是否使用了Option Base语句,这点和Array不同。

    3、通过Range创建数组

      (1)循环给单元格赋值

      比如想把A1:A100单元格的值给数组arr,则代码为:

    Sub Mynz_sz2()

    Dim arr(1 To 29)

    For i = 1 To 29

    arr(i) = Cells(i, 1)

    Next

    [d1].Resize(29, 1) = Application.WorksheetFunction.Transpose(arr)

    End Sub

    代码窗口:

    41b437afc73c16a99790d4d1b3eab4e9.png

    运行:

    8e07db6c6fe58fa717ba4a553c8edcbb.png

    (2)直接等于单元格区域

      这个很简单,直接数组名等于单元格区域就可以了。比如想把A1:A100单元格的值给数组arr,代码还可以简单写为:

    代码:

    arr = [a1:a100]

    二数组大小的判断:UBount和LBound函数

    我们定义数组时,我们可以指定数组的起始索引号不为0,而为1或其他的任意数。比如Dim arr(5 to 6)定义的这个数组起始索引号为5,共有两个元素。

    那么,对于一个已经定义了的数组,我们想知道它的最大索引号(上界)和最小索引号(下界)是多少,怎么办呢?别慌,用UBound和LBound两个函数就可以了。

    如,要想知道数组arr的上界是多少,则:UBound(arr);要想知道数组arr的下界是多少,则:LBound(arr)。想知道数组有多少个元素,则:UBound(arr)- LBound(arr)+1

    如代码:

    Sub Mynz_sz3()

    Dim arr(10 To 50)

    Dim brr(1 To 10, 1 To 100)

    MsgBox "第一个一维数组数组的上标是:" & UBound(arr) & Chr(13) _

    & "数组的下标是:" & LBound(arr) & Chr(13) _

    & "数组的元素个数是:" & UBound(arr) - LBound(arr) + 1 & Chr(13) _

    & "第二个两维数组第一维的上界是:" & UBound(brr, 1) & Chr(13) _

    & "第二维的上界是:" & UBound(brr, 2)

    End Sub

    191190738b4854c7f324f169ce14ef44.png

    运行后:

    904983d7f4d2309fdedebd5ebfe79efa.png

    今日内容回向:

    1 如何创建数组?

    2 数组的大小如何判断

    《VBA代码解决方案》终于可以和大家见面了,这些将一些非常实用的VBA内容结集成册,PDF文件,可以从中直接查找到你想要解决问题的思路和方法,可以复制文中的VBA代码直接使用。有需要的朋友微信联络我NZ9668。

    47e8e25ba9fdb7009a99566b759754a0.png

    1e975d6e562a620f7f53a4f1e3153a73.png
    展开全文
  • 第二节 将工作表数据写入VBA数组在上一节中我们讲了实现工作表数据与VBA代码间传输的几种方法,这讲我将我们将着重讲解如何将工作表的数据写入数组。1 读取工作表上的范围并将其放入数组在VBA中,可以直接读...
  • 大家好,我们今日继续讲解VBA代码解决方案的第111讲内容:VBA数组的深入讲解,如何创建VBA数组及数组大小的判断一、如何创建数组: 1、使用Array创建数组。 看以下代码: Sub Mynz_sz1() Dim arr() arr = Array(1, ...
  • 大家好,我们今日继续VBA数组与字典解决方案,今日讲解VBA数组的声明,一些朋友会问了:数组都讲了这么长时间了,怎么才讲声明啊?是的,有些知识不到一定的程度即使讲了,大家也不能深入的理解,只有到了一定的程度...
  • Hello,大家好,在前面我们说过Excel函数中间的数组含义,...VBA数组可以理解成是储存的一组数据的一个地方。他的数据类型可以是数字,文本,对象,当然也可以是VBA数组。可能有些同学会觉得比较抽象,但是经过慢慢...
  • 大家好,我们今日继续讲解VBA数组与字典解决方案,今日讲解第18讲:VBA数组如何定义,又该如何创建呢?从这一讲开始,我们开始进入VBA数组阶段,VBA数组和工作表数组有着不同的意义,在很大程度上,工作表数组的运算...
  • 朋友们好,今日给大家继续讲解VBA数组与字典解决方案的第17讲,数组大小的扩充问题。这一讲的内容相对比较简单,在之前的章节中讲了数组与数组的计算规律,也是利用了数组的扩展原理。其实,两个数组计算时,参与...
  • VBA80 26集VBA数组之VBA排序算法(下)
  • VBA80集第20集VBA数组1
  • VBA数组进阶

    2011-10-13 08:51:42
    VBA数组进阶, vba操作数组的一些知识,不要分,分享。
  • VBA 数组入门

    2013-04-14 13:42:56
    vba数组入门讲解,供excel学习者初步的理解。
  • VBA数组完全教程

    万次阅读 多人点赞 2017-06-25 11:45:15
    兰色幻想VBA数组入门教程10集 1. 前言:不要把VBA数组想的太神秘,它其实就是一组数字而已。 2. 数组的维数: Sub 数组示例() Dim x As Long, y As Long Dim arr(1 To 10, 1 To 3) '创建一个可以容下10行...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,448
精华内容 579
关键字:

vba数组