精华内容
下载资源
问答
  • VBA数组
    千次阅读
    2019-05-03 01:49:57

    定义数组

    • 固定宽度数组
    '在声明数组时,必须指定数组上界索引号,下界索引号没有指定,则默认为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数组使用

    2019-01-19 17:00:07
    数组和字典也是VBA的常用到数据类型之一。但是我翻了有四五本VBA教程相关的书,里面都没有介绍到字典,数组到是在介绍数据类型时有介绍,而并没有提到字典。 事实上,字典不是VBA内置的类型,它是Windows脚本语言的...
  • VBA简单代码,合并数组,并且去除数组中的相同项!生成新的数组里不包含相同项。
  • 今天和大家要说的是VBA数组的应用,上篇文章我们说的是数组的基础知识点,有不明白的小伙伴可以点击链接进行知识点回顾Excel VBA 数组基础知识,初学者不可不学的关键知识,今天主要说说数组的几个操作方法,这个是...

    今天和大家要说的是VBA数组的应用,上篇文章我们说的是数组的基础知识点,有不明白的小伙伴可以点击链接进行知识点回顾Excel VBA 数组基础知识,初学者不可不学的关键知识,今天主要说说数组的几个操作方法,这个是我们以后会经常遇到的,也是经常会使用的方法。

    数组的合并和字符串拆分(Join & Split)

    在Excel的数据处理时候,我们经常会遇到拆分和合并的操作,可能你在Excel中的基础操作都会,但是我们如果要操作数组呢?数组是在我们内存之中的,我们无法再Excel中可以看到,除非是在本地窗口中可以看到。

    一起来看看例子:

    拆分字符串 split(字符串,"分隔符")

    用分隔连接数组的每个元成一个字符串 join(数组,"分隔符")

    ed8b156f01f93b52705e7b95943b8965.png

    是不可以看到这2个函数的用法其实很简单,他们的作用是相反的,一个是合并,一个拆分,天下分分合合,就在你和我之间。有么有喜欢上这对冤家?

    但是需要注意的一点是,他们都只能操作一维数组,这个是比较限制的。如果们在二维数组时候,想使用个方法,我们应该第一步转化成一维数组,然后在操作即可。

    Filter实现数组筛选

    其实数组的筛选就是根据我们指定的条件,从数组中筛选出来符合我们指定条件的值,然后在组成一个新的数组。这个操作你肯定不陌生,如下图所示,我们在Excel中的常规操作:

    250311989c89e147400487bb93a9bbe7.png

    但是今天我们猪脚是在数组中进行帅选,我们用的是Filter函数,用法是:Filter(数组, 筛选的字符, 是否包含)

    我们可能只说使用方法,其实你还是不太明白,我们举一个例子,你看了就明白,如需他所示:

    3b363ef8e9c12c5e677baacc2b00e528.png

    Arr是我们利用常数数组进行赋值的数组,arr1是我们帅选包括字符”A”的新组成的一个数组,arr2,是我们帅选出来不包括“A”的新数组。不知道你发现没有,我们在数组中使用这个函数的时候,只能模糊帅选,并不能精确进行帅选,这个请务必注意一点。

    取出数组中的最大值和最小值(Max和Min)

    在Excel中我们取出最大值和最小值,我们都是用的MAX和MIN函数,其实这2个在我们的数组中,亦可使用,具体使用方法如下所示:

    353f92046ecc6891c0c4458823a8a0b3.png

    顺便再说一下,我们也可以取出数组的第几大值和几小值,如下:

    b2dda1dbcadfdf2b62278c6ff042af4a.png

    这个方法在我们统计数据的时候,经常会用到。

    数组求和

    在数组中,我们同样可以求和,同样也是借用工作表函数SUM来完成,我们一起看看:

    f33f86bf8f7e10e76427f63054583bd7.png

    是不是发现,数组怎么这么好用?其实数组操作还不止这些,我们在继续看看:

    数组的计数Count和Counta

    Count和Counta可以统计数组中数字的个数和数字+文本的个数。如下图所示:

    e7c7c21dc9bd3c1ccff39e22e645656f.png

    Count和Counta在数组中和Excel中的使用方法是一样的,是通用的。

    数组的查询和拆分

    假如我们已经有了一个数组,但是我们想查询其中的某一个值,通过帅选只能模糊匹配,那我们有没其他的方法呢?如下:

    1b8baddf11cf796cbca25c0cef66aa02.png

    数组从二维拆分成一维,你是否还记得我们上篇文章说的?

    我们可以借用工作表函数index达到按列拆分数组,即多列构成的数组,你可以任意拆分出一列构成新的数组。方法是:Application.Index(数组, , 列数) :

    2eebd387653dace6d828f9fcc978624b.png

    数组拆分其实在VBA中间很难操作,有时候我们是借用API函数,或者说这个函数有多少人知道呢?所以我们一般记下index函数拆分数组即可:

    数组维数的转换

    今天说的最后一个,数组的维数的转变。这个也可借用工作表函数来完成这个,我们一起来看看吧 !

    8a3475dd285cf196330ad11494ebde43.png

    在转置时只有1列N行的数组才能直接转置成一维数组,这个请注意一下,否则会报错的。

    其实我们很多的工作表函数都可以在我们的Excel中进行使用,我们可以自行尝试一下,看看实际的效果。

    以上就是我们今天和大家说的代码的中的数组常用技巧,其实VBA代码学习起来非常简单,他就是一个脚本语言的存在,他有自己的条条框框,你按照他的游戏规则来写代码就可以。如果有不明白的或者不懂的可以在下方留言,我们会一一解答的。

    be4144d3758b2910be529da96e79f10b.png

    我是Excel教案,关注我持续分享更多的Excel技巧!

    展开全文
  • 58. 如何对以下数组进行简写?Arr(1)=10Arr(2)=20Arr(3)=30Arr(4)=40答:可以简写为一个常量一维数组,即arr=array(10,20,30,40)59. arr = [{"a",10;"b",20;"c",30}]是什么数组?答:这是一个二维常量数组。60. 要求...
    49ffc75ac4ff524c84442d210fc62d6d.png

    58. 如何对以下数组进行简写?

    Arr(1)=10

    Arr(2)=20

    Arr(3)=30

    Arr(4)=40

    答:可以简写为一个常量一维数组,即arr=array(10,20,30,40)

    59. arr = [{"a",10;"b",20;"c",30}]是什么数组?

    答:这是一个二维常量数组。

    60. 要求在数组arr = [{"a",10;"b",20;"c",30}]中精准查找是否存在“b”这个字符,代码应该如何书写?结果如何?

    93dd9cce66aa96fe76a19d93e2d71915.png

    答:其实就是从一个单元格区域查找数据:

    e76a9751700964014e3fde6a5cff191b.png

    61. VBA内长代码如何换行?

    答:1)如果是文本字符串可以加以加一个空格一个&和一个空格加一个下划线:

    x = "ABCDEFG" & _

    "HIJKLMNO"

    2)如果不是文本字符串,则空格+下划线+回车,如:

    MsgBox "查找结果是"& Application.VLookup _

    ("b", arr, 2, 0), , "调用工作表函数vlookup"

    62. 如何去掉字符串Two,beautiful,girls,and,a,handsome,boy中的逗号并将它们放入一个数组中?

    e907b7789710a6d69a4f4d30f1be3015.png

    答:另外一种代码写法是:

    b0d61fa25db2f27dd593a2f2e1fb51c2.png

    值得注意的是:split和join只能对一维数组进行操作,如果是单元格或二维数组怎么办?只有一条途径,想办法转换为一维数组。

    63.如下图所示,如何将A1:D1单元格用”-”连接起来并存放到E1中单元格?

    52739465ecc0a6e7d3d97c2e65a2db8e.png

    答:代码及运行结果如下:

    53fb7198947c747cdf4f1c52e7bcb323.png

    64. 如何将同列单元格内容用”-”连接起来?

    答:代码及演示效果如下

    2614eebbf0b79d0b2deaecf8ed743d33.png

    65.如何将数组(“ABC”,”A”,”CD”,”ABOUT”,”AND”,”END”)中含A的数值组成一个新数组?

    答:筛选需要用到fliter函数,代码及演示效果如下:

    29c413f89741604c3bcc61f750b835ad.png
    展开全文
  • VBA数组的排序

    2021-09-13 16:12:32
    今天就好奇如果数组中实现排序 他是怎么实现的呢。 经过一番折腾查找,真是一看吓一跳,真是感觉蚂蚁看大象,发现排序分为: 今天仅整理了最简单的两种排序。。。 先来看下定义和实现的方法吧。 选择排序(Selection...

    我们平时用的表格排序,只相对来说是在在表格中的升序降序。今天就好奇如果数组中实现排序
    他是怎么实现的呢。

    经过一番折腾查找,真是一看吓一跳,真是感觉蚂蚁看大象,发现排序分为:
    1,稳定排序与不稳定排序2,内排序和外排序内部排序可分为:直接插入排序、冒泡排序、简单选择排序、希尔排序、快速排序、堆排序、归并排序、基数排序。

    晕

    今天仅整理了最简单的两种排序。。。
    先来看下定义和实现的方法吧。

    选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。

    请添加图片描述

    1.简单选择排序

    
    Sub  选择排序()
    Dim i, j, MinIndex As Integer
    Dim MinValue As String
    arr = Range("a1:a10")
     For i = 1 To UBound(arr)
        MinValue = arr(i, 1) '将第一个值先默认为最小值
        MinIndex = i         '记录最小值的索引位置
        For j = MinIndex + 1 To UBound(arr)
            If arr(j, 1) < MinValue Then
                MinValue = arr(j, 1)
                MinIndex = j
            End If
      	Next
        '以此和当前的最小值做对比,比较出后面的最小值并记录 值及索引的位置
        '因为小的值我们都放在最前面,所以遍历只需从当前值的后面开始就可以了,节省时间
        
        If MinIndex > i Then
            arr(MinIndex, 1) = arr(i, 1)
            arr(i, 1) = MinValue
        End If
        '这里的MinIndex和i的关系会有些绕,只会有两个可能,一种是MinIndex > i(在默认最小值的后面有比当前还小的值),另一种MinIndex = i :(在最小值的后面没有找到比当前值的再小的)。
        '【不出现MinIndex < i的情况,只为理解,加不加基本没有影响】
     Next
    [b1].Resize(UBound(arr), 1) = arr
    End Sub
    

    2.冒泡排序

    原理:
    1、比较相邻的元素。如果第一个比第二个大,就交换他们两个。
    2、对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
    3、针对所有的元素重复以上的步骤,除了最后一个。
    4、持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
    请添加图片描述

    Sub 冒泡排序()
    arr = Range("a1:a10")
    For j = 1 To UBound(arr)
        For i = 1 To UBound(arr) - 1
              If arr(i, 1) > arr(i + 1, 1) Then
                MinStr = arr(i + 1, 1)
                arr(i + 1, 1) = arr(i, 1)
                arr(i, 1) = MinStr
            End If
        Next
    Next j
    [b1].Resize(UBound(arr), 1) = arr
    End Sub
    
    类别说明
    选择排序缺点:不稳定,具体怎么不问题不知道。。优点:速度要比冒泡排序快很多
    冒泡排序缺点:速度很慢。。优点:稳定

    太多了 ,其他的在这里插入图片描述

    展开全文
  • Next 'dict1去重 For Each i In arr3 dict1(i) = "" Next '遍历字典 X = 1 For Each i In dict1.keys() ReDim Preserve arr4(1 To X) '每次改数组都要先redim redim 时记得一定要考虑是否 preserve !!! arr4(X) =...
  • VBA数组VBA数组VBA数组

    2010-07-14 23:15:29
    VBA数组VBA数组VBA数组VBA数组VBA数组
  • vba 数组填充单元格

    2021-07-11 10:54:02
    Sub 数组填充单元格() Dim aaa(3, 3) Dim temp(0, 2) aaa(0, 0) = "姓名" aaa(0, 1) = "llll" aaa(0, 2) = "jjjj" aaa(1, 0) = "性别" aaa(1, 1) = "男" aaa(1, 2) = "女" aaa(2, 0) = "序号" aaa(2, 1) =...
  • vba 数组 数组参数

    千次阅读 2019-08-10 18:00:37
    关于赋值 我看了很多本书都没有看到这样子的,包括官方文档,所以我就写了下来。 sub a() dim a() dim c() ...a = array(1,2,3,4) '这里a后面的()可以给也可以不给 ...sub a(paramarray a() as variant) 'paramarray...
  • VBA80 26集VBA数组之VBA排序算法(下)
  • VBA 数组定义,赋值,一维数组

    万次阅读 2019-12-19 13:35:43
    1VBA数组的基础定义 1.1什么是数组? 就是一组数/字符等用同一个名字(这个名字就是:数组名),作为一个整体存储在一起 1.2什么是元素 这些被保存在同一个数组名下的,多个内容,称为element 元素 数组里的元素是...
  • 目录1,一维数组冒泡排序函数2,二维数组冒泡排序函数 1,一维数组冒泡排序函数 2,二维数组冒泡排序函数
  • 获取vba数组元素个数

    2022-04-02 21:12:13
    VBA中是 application.count(arr)
  • 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行...
  • 经过多次实验证明:VBA数组起始标只能以1开始,否则无法转置 二、列表设计思路 利用类模块,当成对象开发; 生成数组是二维数组,每个维度的长度都可以通过参数设置; 通过行标列表添加...
  • 使用VBA数组

    2020-03-10 11:29:25
    通过代码来理解VBA数组 1 '定义一维数组并赋值 Sub test() Dim arr(1 To 4) arr(1) = "张三" arr(2) = "李四" arr(3) = "王五" End Sub '定义二维数组并赋值 Sub test1() Dim arr(1 To 4, 1 To 2) arr(1, 1) =...
  • 本章主要内容:认识数组数组应用案例,小结。
  • 关于excel的vba数组

    2022-04-06 14:09:57
    什么是vba数组?先让我们从字面来看一下它的意思:“数:数据;组:组合”。从字面很直观地看出,数组就是N个数据的组合,如果某个变量只包含一个数据,就不是数组,只能是一个普通的变量。 有人把数组比喻为一串用...
  • 大家好,我们今日继续讲解VBA数组与字典解决方案第22讲:在VBA中如何使用动态数组,以及利用动态数组去除重复值的方法。如果文本中含有大量的重复值,此时,如果我们要剔除重复值,该怎么办?用VBA的方法该如何做到...
  • 随着字典讲解的深入,我们发现字典真的很神奇,在VBA代码中,给人以十分清爽的感觉,在这套数组与字典解决方案中,我会尽可能的把经常用到的实例多多讲解给大家,让大家对于字典的理解更加深入.虽然这块内容利用其它方案都...
  • 大家好,我们今日继续讲解VBA代码解决方案的第61讲内容:在VBA中如何使用动态数组,以及利用动态数组去除重复值的方法。在上一讲中我们讲了使用数组函数将单元格中的文本进行分隔后写入到工作表中的方法,那么问题...
  • VBA数组和字典

    2019-04-24 15:04:00
    转载自:http://www.cnblogs.com/wuzhiblog/p/vba_two.html 转载于:https://www.cnblogs.com/lybstudy/p/10762467.html
  • VBA 数组列不同值统计

    2011-04-24 20:23:36
    VBA 数组列不同值统计 VBA 数组列不同值统计
  • 巧用公式实现VBA数组快速赋值

    千次阅读 2020-07-03 06:44:53
    VBA中可以使用数组处理工作表中的数据,是个尽人皆知的秘密了,读取数据加载到数组中也很简单。 工作表中数据如下图所示,需要将B1:G1的内容加载到数组中。这个该如何弄到一个数组中呢,先分别读入数组,然后再使用...
  • 大家好,今日继续讲解VBA数组与字典解决方案,今日的内容是第8讲。在上一讲的数组专题中,我详细地讲了利用数组公式的好处,或许有的朋友还没有充分理解,今日继续给大家讲解。我在讲解中,力争每篇文章可以作为一个...
  • VBA数组与单元格格式

    2019-09-17 16:39:36
  • 浅谈:excel的vba数组

    2021-12-26 11:33:46
    什么是vba数组?先让我们从字面来看一下它的意思:“数:数据;组:组合”。从字面很直观地看出,数组就是N个数据的组合,如果某个变量只包含一个数据,就不是数组,只能是一个普通的变量。 有人把数组比喻为一串用...
  • VBA示例之 数组按降序排列,供初学者参考,大牛勿进~~~~~~~

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,104
精华内容 2,841
关键字:

vba数组

友情链接: QtTableWidget.zip