欢迎光临~弹性体站
服务热线全国服务热线:

150-1569-1537

您的位置: HOME > 文章导读 > 建站资源&office办公教程 > VBA数组函数学习及数组的常见问题

本站新闻

VBA数组函数学习及数组的常见问题

Excel VBA中数组的常见问题集锦:
1.数组定义中Dim Arr() As Variant与Dim Arr As Variant的区别

Dim Arr As Variant只是定义了一个Variant型变量,不代表这是数组

Dim Arr() As Variant是定义了一个动态数组,数组中的元素是Variant型

2.数组下标的区别

数组默认下标可能为0或者1,具体情况如下

(1)使用方括号赋值或者从工作表Range读入数据并赋值给数组时,下标为1

方括号赋值举例:

[{“一”, “二”, “三”, “四”}] ‘一维数组

[{“五”, “六”;”七”, “八”}] ‘二维数组

工作表Range赋值时,即使只有一列数据,也是一个二维数组。

(2)利用Array()函数为数组赋值时,下标取决于Option Base语句

如有Option Base 1,数组下标为1;如有Option Base 0或省略该句,数组下标为0。

其中Option Base语句是模块级语句,必须写在模块的最前部分,且不能后续更改。

(3)如果未指定Option Base 1,且想用Array()函数批量赋值,并使下标为1,是做不到的,只能先定义下标为1的数组(动态数组Redim亦可),然后对元素依次赋值。

3.静态数组不允许Redim,动态数组允许Redim,Redim只允许改变最高维

例如:

Dim Arr(1 To 2) As Variant,不允许Redim Arr(1 To 3)

Dim Arr() As Variant,允许Redim Arr(1 To 3)

4.二维数组与数组嵌套

(1)方括号赋值可以直接对二维数组赋值,举例见2(1)部分

(2)Array()函数不能形成二维数组,只能是数组的嵌套

(3)二维数组必须是一个“矩形”,而数组嵌套则无此限制

举例:

Arr1=[{“一”, “二”; “三”, “四”}] ‘允许

Arr2=[{“一”, “二”; “三”, “四”, “五”}] ‘不允许

Arr3=Array(Array(“一”, “二”), Array(“三”, “四”, “五”)) ‘形成的是一维数组的嵌套,Arr3()有两个元素,都是数组,其中第一个数组有两个元素,第二个数组有三个数组

如果要引用Arr1中值为”三”的元素,代码为Arr(2,1);要引用Arr2中值为”三”的元素,代码为Arr(2)(1)。

VBA中的5个内置数组函数:

Array函数
Array函数允许你在代码执行中间创建一个数组,而不必事先确定其大小。该函数总是返回一个Variant数组。使用Array函数你可以快速地将一系列数据放置在一个清单里面。下面的过程创建了一个叫做auto的固定大小,一维的三个成员的数组。

1. 在当前工程里插入一新模块
2. 输入下列过程 Array函数:
Option Base 1
Sub Array函数()
Dim arr As Variant
arr= Array(“再战”, “江湖”, “2021”)
MsgBox arr(2) & ” ” & arr(1) & “, ” & arr(3)
arr(2) = “龙争虎斗”
MsgBox arr(2) & ” ” & arr(3) & “, ” & arr(1) & arr(2)
End Sub
另外一个例子,示范如何使用Array函数将列标输入到工作表里:
Sub ColumnHeads()
Dim heading As Variant
Dim cell As Range
Dim i As Integer
i = 1
heading = Array(“First Name”, “Last Name”, “Position”, _
“Salary”)
Workbooks.Add
For Each cell in Range(“A1:D1”)
cell.Formula = heading(i)
i = i+1
Next
Columns(“A:D”).Select
Selection.Columns.AutoFit
Range(“A1”).Select
End Sub
IsArray函数
Sub IsThisArray()
‘declare a dynamic array 声明一动态数组
Dim sheetNames() As String
Dim totalSheets As Integer
Dim counter As Integer
‘count the sheets in the current workbook 计数当前工作簿里的工作表数目
totalSheets = ActiveWorkbook.Sheets.Count
‘specify the size of the array 明确数组大小
ReDim sheetNames(1 To totalSheets)
‘enter and show the names of sheets 输入和显示工作表名称
For counter = 1 to totalSheets
sheetNames(counter) = ActiveWorkbook.Sheets(counter).Name
MsgBox sheetNames(counter)
Next counter
‘check if this is indeed an array 检查它是否确实为数组
If IsArray(sheetNames) Then
MsgBox “The sheetNames is an array.”
End If
End Sub

Erase函数
当你要清除数组里的数据时,应该使用Erase函数。该函数删除静态或动态数组储存的所有数据,另外,对于动态数组,Erase函数将重新分配原来分配给该数组的所有内存。下面的例子教你如何删除数组cities里的数据。

1. 在当前工程里插入一新模块,重命名为Erase_Function
2. 输入如下过程FunCities:
‘ start indexing array elements at 1
Option Base 1
Sub FunCities()
‘declare the array
Dim cities(1 to 5) As String
‘assign the values to array elements
cities(1) = “Las Vegas”
cities(2) = “Orlando”
cities(3) = “Atlantic City”
cities(4) = “New York”
cities(5) = “San Francisco”
‘display the list of cities
MsgBox cities(1) & Chr(13) & cities(2) & Chr(13) _
& cities(3) & Chr(13) & cities(4) & Chr(13) _
& cities (5)
Erase cities
‘show all that was erased
MsgBox cities(1) & Chr(13) & cities(2) & Chr(13) _
& cities(3) & Chr(13) & cities(4) & Chr(13) _
& cities (5)
End Sub
在函数Erase清除数组里的数据后,函数MsgBox就显示一个空信息框了。

LBound函数和UBound函数
LBound函数和UBound函数分别返回表明数组的下界和上界的数字。

1. 在当前工程里插入模块,命名为L_and_UBound_Function
2. 输入如下代码FunCities2:
Sub FunCities2()
‘declare the array
Dim cities(1 to 5) As String
‘assign the values to array elements
cities(1) = “Las Vegas”
cities(2) = “Orlando”
cities(3) = “Atlantic City”
cities(4) = “New York”
cities(5) = “San Francisco”
‘display the list of cities
MsgBox cities(1) & Chr(13) & cities(2) & Chr(13) _
& cities(3) & Chr(13) & cities(4) & Chr(13) _
& cities (5)
‘display the array bounds
MsgBox “The lower bound: ” & LBound(cities) & Chr(13) _
& “The upper bound: ” & UBound(cities)
End Sub
当你要确定一个二维数组的上下界时,你就必须明确维数:1表示第一维,2表示第二维。在本章早先时候将的Exchange过程里的后面加上如下语句,可以确定该二维数组的上下界(将下列代码加入到关键字End Sub之前):
MsgBox “The lower bound (first dimension) is ” _
& LBound(Ex, 1) & “.”
MsgBox ” The upper bound(first dimension) is ” _
& UBound(Ex, 1) & “.”
MsgBox “The lower bound (second dimension) is ” _
& LBound(Ex, 2) & “.”
MsgBox ” The upper bound(second dimension) is ” _
& UBound(Ex, 2) & “.”

上一条: 下一条:
扫一扫,加站长微信!关闭
二维码