VBA(6)数组基本用法及写入输出

这篇具有很好参考价值的文章主要介绍了VBA(6)数组基本用法及写入输出。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.数组的基本概念就不过多介绍了;本次为基础复习篇:直接上实例备注说明

Option Explicit			'强制声明变量要求		
Sub k1()         		  
    Dim t As Date
    Dim x#, m#
    t = Timer		'当前时间
    For x = 1 To 10000	'以内存形式运行
        m = m + 1000
    Next x
    MsgBox Timer - t
End Sub
Sub k2()
    Dim t As Date
    Dim x#, m#
    t = Timer
    For x = 1 To 10000	'调用单元格运行
        m = m + Cells(1, 1)
        Next x
        MsgBox Timer - t
End Sub

K例在本机测试K1运行时间为1帧不到,K2为16帧左右.故而注:调用内存时运行速度较快,在写宏时应尽量多使用内存/数组运算.

2.数组的写入及输出

Sub a1() 
    t = Timer
    Dim arr(1 To 10)
    Dim x#
    For x = 1 To 10
    arr(x) = x 		'循环数组方式写入数组
    Next
    Stop			'暂时方便查看立即窗口arr是否已写入数组
End Sub
Sub a2() 
    t = Timer
    Dim x#, y#
    Dim arr(1 To 10, 1 To 10)	'二维格式,已知最多可定义60维度,但常用是一维二维
    For x = 1 To 10		'循环将cells写入数组
        For y = 1 To 10
            arr(x, y) = Cells(x, y)
        Next y
    Next x
    Stop
End Sub
Sub a3()
    Dim arr()	 	   '声明动态数组,声明类型留空默认为Variant类型
    Dim y#, x#			
    y = Sheets(1).Range("a65536").End(xlUp).Row - 1		'表1最后一行-1
    ReDim arr(1 To y)			'重新声明ARR
        For x = 1 To y
            arr(x) = Cells(x, 1)
        Next
    Stop
End Sub
Sub a4() 
    Dim arr2()
        arr2 = Array(1, 2, 3, 4, "arr5")	'用函数批量写入
    Stop
End Sub
Sub a5() 
    Dim arr()	
        arr = Range("a1:a5")		'单元格写入
    Stop				'此处暂停查看可得知用单元格写入动态数组默认为一个二维的数组,例a5的arr(1 to 5,1)
    Range("b1:b5") = arr()
End Sub
Sub a6() 
    Dim arr(), arr1(1 To 5, 1 To 1)
    Dim x As Integer
    arr = Range("b2:c6")		
    For x = 1 To ubound(arr,1)			'ubound(数组,2)指定维度的最大上标
        arr1(x, 1) = arr(x, 1) * arr(x, 2)		'ubound(数组)数组上标
    Next					'lbound(数组)数组下标
    Range("d2").Resize(ubound(arr1,1)) = arr1	'读取数组到单元格
End Sub
Sub a7()
    Dim arr, arr1(1 To 5)
    Dim x As Integer
    arr = Range("b2:c6")
    For x = 1 To 5
        arr1(x) = arr(x, 1) * arr(x, 2)
    Next					    '一维数组放入列需转置
    Range("d2").Resize(5) = Application.Transpose(arr1)
End Sub
Sub a8()
    Dim arr, arr1(1 To 1000, 1 To 1)		
    Dim x As Integer
    arr = Range("b2:c6")
    For x = 1 To 5
        arr1(x, 1) = arr(x, 1) * arr(x, 2)		    '数组部分存入
    Next
    Range("d2").Resize(4) = arr1		 '不管数组有多大,单元格赋值只能按单元格区域大小部分
End Sub

'以上几种为数组常见赋值方式,部分版本定义一个变量体可也以将单元格装入(a8例:dim arr)
'Option base 默认下标不改变的情况下:数组声明如果为arr(5)则arr(0 - 5)有6个元素.

3.数组常用函数

Sub s1()
    Dim arr(), arr1()
   'Dim arr(), arr1(1 To 100, 1 To 4)   '可以定义一个足够大的数组,利用区域大小限置输入
    Dim x#, k#
    arr = Range("a1:c3")
    For x = 1 To UBound(arr)                        'ubound(arr) 如果有多维默认= ubound(arr,1)
        If arr(x, 1) = 1 Then                       '如果arr(x,1)第一列的值符合则
        k = k + 1                                   'k为记录行数,
        ReDim Preserve arr1(1 To 3, 1 To k)         'dim preserve arr1()重新声明数组大小;保留原有数值
        arr1(1, k) = arr(x, 1)
        arr1(2, k) = arr(x, 2)
        arr1(3, k) = arr(x, 3)
    End If
    Next
    'Stop
        'ReDim Preserve arr1(1 To 3, 1 To 1)        '测试如减少维度则相对应减少。其他保留值
    Range("e10").Resize(k, 4) = Application.Transpose(arr1)     'Resize扩展多少行多少列,如数组不够单元格区域大则返回错误值#N/A
End Sub
Sub s2()
    Dim arr, arr1(1 To 1000, 1 To 1)    '定义一个足够大的数组
    Dim x#, m#, k#                      '定义三个数值型变量
    arr = Range("a1:a10")               '数据源为{1;2;3;;5;6;;8;9;}
    For x = 1 To UBound(arr)            '上标为10
        If arr(x, 1) <> "" Then         '如果不为空则计数
        k = k + 1
        arr1(k, 1) = arr(x, 1)          '装入新数组
        Else                            '如果为空的则计数
        m = m + 1
        Range("e1").Offset(0, m).Resize(k) = arr1   '将之前连续不为空的数组输出到单元格
        Erase arr1                      '清空数组,使用ERASE语句
        k = 0                           '重置计数
    End If
    Next x
End Sub
'表格内加入一个ActiveX控件:组合框
Private Sub ComboBox1_Change() 	'利用数组将条件要求的数存入控件
    Dim arr(), arr1
    Dim x#, k#
    arr1 = Range("a1:a10")		'装入数组1
        For x = 1 To UBound(arr1)	'数组1循环
            If arr1(x, 1) > 8 Then		'条件设置
            k = k + 1			'计数
            ReDim Preserve arr(1 To k)	'保留原有值重新声明
            arr(k) = arr1(x, 1)		'满足条件的值装入新数组
        End If
    Next x
    ComboBox1.List = arr		'新数组赋值给控件
End Sub
Sub s4()
    Dim sr$, arr
    sr = "A-1-BB-2CD-EFG"
    arr = VBA.Split(sr, "-") 	'split(拆分,分隔符)
    MsgBox Join(arr, "-")  	 'join(合并, 连接符)/join ( arr )第二参数省略情况下默认为空格连接
End Sub
Sub s5()
    Dim arr, arr1, arr2, arr3
    arr = Application.Transpose(Range("a2:a10"))
    arr1 = VBA.Filter(arr, 333, True)                  '数组里面包含333的      filter(数组,关键字,TRUE=包含/FALSE反之)
    arr2 = VBA.Filter(arr, "B", False)                  '数组里面不包含B的
    Range("b2").Resize(UBound(arr1) + 1) = Application.Transpose(arr1)          'filter返回数组为0至上标,故+1=元素个数
    Range("c2").Resize(UBound(arr2) + 1) = Application.Transpose(arr2)          '一维数组输出单元格用Transpose转置
    'Stop                                               '调试时可用暂停查看
End Sub
Sub s6()
    Dim arr, arr1, arr2
    arr = Range("a2:d6")
    arr1 = Application.Index(arr, 0, 1)		'index(二维,0,列数)返回一个二维数
    arr2 = Application.Index(arr, 2, 0)		'index(二维,行数,0)返回一个一维数
    Stop
End Sub
Sub s7()
    Dim arr, arr1, arr2
    arr = Range("a1:B11")
    arr1 = Application.VLookup(Array("B", "A"), arr, 2, 0)      '利用单元格函数返回array("B","A")第一个查找的值的数值arr(1 to 2)
    arr2 = Application.SumIf(Range("a2:a10"), Array("A", "B"), Range("b2:b10"))     '利用sumif返回一个数组
    Stop
End Sub
Sub s8()
    Dim arr, arr1(1 To 3, 1 To 2), x#
    arr1(1, 1) = "A"
    arr1(2, 1) = "B"
    arr1(3, 1) = "C"
    For x = 1 To 100                '循环100行
        Select Case Cells(x, 1)
            Case "A"                '如果为A则累加。下面同理
            arr1(1, 2) = Cells(x, 2) + arr1(1, 2)
            Case "B"
            arr1(2, 2) = Cells(x, 2) + arr1(2, 2)
            Case "C"
            arr1(3, 2) = Cells(x, 2) + arr1(3, 2)
        End Select
    Next
    Stop         '暂停查看得到一个arr1{A,B,C;累加,累加,累加}同sumifs效果的数组
End Sub

'调用工作表函数的情况下运行速度不如VBA函数,常见处理函数ARRAY,SPLIT,JOIN,FILTER,INDEX。文章来源地址https://www.toymoban.com/news/detail-505869.html

到了这里,关于VBA(6)数组基本用法及写入输出的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 深入浅出 Spring:核心概念和基本用法详解

    深入浅出 Spring:核心概念和基本用法详解

    个人主页:17_Kevin-CSDN博客 收录专栏;《Java》 在 Java 企业级应用开发中,Spring 框架已经成为了事实上的标准。它提供了一种轻量级的解决方案,使得开发者能够更轻松地构建灵活、可扩展的应用程序。在本文中,我们将探讨 Spring 框架的一些核心概念和基本用法,以此更好地

    2024年03月20日
    浏览(11)
  • MySQL 基本概念 基础用法 增删改查(特殊查询)语法 详细篇

    今天来分享一期MySQL的基本用法(增删改查 对库 对表 对值) 目录 MySQL的基础概念  SQL 语言的主要分类 DDL(数据定义语言) DML(数据操控语言) DQL(数据库查询语言) DCL(数据库控制语言) 基础语法 增 库的操作 表操作 列操作 值操作 删 删除库 删除表 删除值 改 修改表名 更新数

    2024年03月16日
    浏览(10)
  • 【C++入门】学习使用二维数组基本知识及用法详解

    【C++入门】学习使用二维数组基本知识及用法详解

    🧛‍♂️iecne个人主页: : iecne的学习日志 💡每天 关注 iecne的作品,一起进步 💪一起学习,必看iecne 🐳希望大家多多支持🥰一起进步呀! 二维数组就是在一维数组上多加一个维度。 建议:以下三种定义方式,利用第二种更加直观,提高代码可读性 第二种就是在定义一

    2024年01月25日
    浏览(15)
  • VBA二维数组追加数据

    VBA二维数组追加数据

    redim对二维数组扩展时会丢失数据,即使使用Preserve参数,也不行。 如果使用了 Preserve ,就只能重定义数组最末维的大小,且根本不能改变维数的数目。 本例试图解决这样一个问题:从EBS报表中导出Accout弹性域的值,其中文本格式的,有许多题头类的脏数据,必须过滤

    2024年02月16日
    浏览(11)
  • VBA 二维数组查找并定位数据

    VBA 二维数组查找并定位数据

    数据源:   将这个二维数组导入内存后,存储到一个二维数组里,查找其中一个数组成员,返回其在表格中的地址. 如找44,返回M20

    2024年02月16日
    浏览(12)
  • VBA基本语法及基本使用

    1.准备工作环境 1.1、office的下载 1.2、新建工作环境 打开新建一个Excel表格,后缀名为.xls 或 . xlsm,但是excel默认后缀名为 .xlsx (xlsx不支持宏的定义,其余2种都支持,宏可以理解为不支持写VBA。。。。其实也可以写,就是保存有点问题,最好用其他2种吧) 1.2.1有开发工具选项

    2024年02月04日
    浏览(18)
  • Excel·VBA二维数组组合函数、组合求和

    Excel·VBA二维数组组合函数、组合求和

    之前的文章《Excel·VBA数组组合函数、组合求和》和《Excel·VBA数组排列函数》,都是针对 一维数组 的组合和排列 二维数组组合:对一个 m行*n列 的二维数组,每行抽取1个元素进行组合,则共有 n ^ m 个组合 代码思路,类似之前的文章“VBA排列函数”尾数循环的方式 举例 组合

    2024年02月11日
    浏览(14)
  • flink-cdc,clickhouse写入,多路输出

    kafka日志数据从kafka读取 1、关联字典表:完善日志数据 2、判断日志内容级别:多路输出 低级:入clickhouse 高级:入clickhouse的同时推送到kafka供2次数据流程处理。

    2024年02月09日
    浏览(13)
  • 实现对象转成字节数组(整型支持按位写入,字符串则按字节写入)

    闲着无聊,写了一个对象转换成byte[]的工具类,支持整型按位写入(大大节省空间),具体步骤如下: 1. 定义实体类和注解 2. 工具类     3. 测试结果     参考文章: https://www.cnblogs.com/Dotnet9-com/p/17981055

    2024年01月23日
    浏览(13)
  • mysql查询结果命令行方式导出/输出/写入到文件的三种方法

    mysql查询结果命令行方式导出/输出/写入到文件的三种方法

    直接执行命令: 在目录/tmp/下会产生文件test.xls 遇到的问题: 可能原因:mysql没有向/data/下写的权限 查询都自动写入文件: 跳出mysql命令行

    2024年02月11日
    浏览(12)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包