VBA数组

博客围绕VBA数组展开,介绍了固定宽度数组和动态数组的定义,获取数组上下标的方法,还提及数组可使用的工作表函数,如sum、index、join等。给出数组写入单元格、筛选的代码示例,以及遍历目录区分存放文件夹和文件的内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定义数组

  • 固定宽度数组
'在声明数组时,必须指定数组上界索引号,下界索引号没有指定,则默认为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(Visual Basic for Applications)中,数组是一种非常重要的数据结构,用于存储和操作一组相关的数据。以下是对VBA数组的详细讲解,涵盖声明、初始化、遍历以及常见问题的解决方法。 #### 1. 数组的基本概念 数组是用于存储一组相同类型数据的集合。在VBA中,可以通过静态数组或动态数组来实现数据的存储[^1]。静态数组在声明时就需要指定大小,而动态数组则可以在运行时调整大小。 #### 2. 静态数组的声明与初始化 静态数组在声明时需要明确其大小。例如: ```vba Dim arr(3) As Integer ``` 上述代码定义了一个包含4个元素的整型数组(索引从0到3)。如果需要初始化数组,可以使用`Array`函数: ```vba Dim arr As Variant arr = Array(1, 2, 3, 4) ``` 通过`Array`函数创建的数组默认为变体型(Variant),并且索引从0开始[^1]。 #### 3. 动态数组的声明与调整 动态数组不需要在声明时指定大小,可以使用`ReDim`语句在运行时调整数组的大小。例如: ```vba Dim dynArr() As Integer ReDim dynArr(5) ``` 上述代码定义了一个动态数组,并将其大小调整为6个元素。如果需要保留原有数据,可以使用`Preserve`关键字: ```vba ReDim Preserve dynArr(10) ``` 这将扩展数组大小至11个元素,同时保留原有数据。 #### 4. 使用`Split`函数生成数组 `Split`函数可以根据指定的分隔符将字符串拆分为数组。例如: ```vba Dim items As Variant items = Split("苹果-香蕉-橙子", "-") For Each item In items Debug.Print item Next item ``` 上述代码将字符串拆分为一个包含三个元素的数组,并逐一打印每个元素[^2]。 #### 5. 二维数组的初始化 在VBA中,二维数组可以通过嵌套的方式进行初始化。例如: ```vba Dim twoDArray(1 To 2, 1 To 3) As String twoDArray(1, 1) = "A" twoDArray(1, 2) = "B" twoDArray(1, 3) = "C" twoDArray(2, 1) = "D" twoDArray(2, 2) = "E" twoDArray(2, 3) = "F" ``` 此外,还可以使用`WorksheetFunction.Transpose`或直接赋值的方式初始化二维数组[^4]。 #### 6. 数组的遍历 遍历数组可以使用`For...Next`循环或`For Each...Next`循环。例如: ```vba Dim i As Integer For i = LBound(arr) To UBound(arr) Debug.Print arr(i) Next i ``` 上述代码使用`LBound`和`UBound`函数获取数组的下界和上界,从而遍历整个数组[^1]。 #### 7. 常见问题及解决方法 - **问题:如何确定数组的大小?** 可以使用`LBound`和`UBound`函数获取数组的下界和上界,从而计算数组的大小。 - **问题:如何将数组写入Excel单元格?** 可以直接将数组赋值给单元格区域。例如: ```vba Dim arr As Variant arr = Array(1, 2, 3, 4, 5) Range("A1:E1").Value = arr ``` - **问题:如何将单元格区域转换为数组?** 可以通过直接赋值的方式将单元格区域转换为数组。例如: ```vba Dim arr As Variant arr = Range("A1:E1").Value ``` #### 8. 实用函数 - `Join`函数:将数组中的元素连接成字符串。例如: ```vba Dim result As String result = Join(Array("苹果", "香蕉", "橙子"), ",") Debug.Print result ``` - `Filter`函数:筛选数组中的特定元素。例如: ```vba Dim filtered As Variant filtered = Filter(Array("苹果", "香蕉", "橙子"), "香蕉") Debug.Print filtered(0) ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值