楼主 杨开科 |
Array 函数返回一个包含数组的 Variant。 语法 Array(arglist) 所需的 arglist 参数是一个用逗号隔开的值表,这些值用于给 Variant 所包含的数组的各元素赋值。如果不提供参数,则创建一个长度为 0 的数组。 用来表示数组元素的符号由变量名、圆括号以及括号中的所需元素的索引号组成。在下面的示例中,第一条语句创建一个 Variant 的变量 A。第二条语句将一个数组赋给变量 A。最后一条语句将该数组的第二个元素的值赋给另一个变量。- Dim A As Variant
- A = Array(10,20,30)
- B = A(2)
注意 没有作为数组声明的 Variant 也可以表示数组。除了长度固定的字符串以及用户定义类型之外,Variant 变量可以表示任何类型的数组。尽管一个包含数组的 Variant 和一个元素为 Variant 类型的数组在概念上有所不同,但对数组元素的访问方式是相同的。 以下示例新建一个工作簿,工作簿中的新工作表数量为4,并将工作表按索引编号依次命名为各个季度。(运行下面3个示例时,请按Ctrl+G打开“立即窗口”,以观察Debug.Print语句的运行情况,在“立即窗口”中,按Ctrl+A,再按Delete可将窗口中的内容全部删除。) 示例1:- Option Explicit '强制显式声明模块中的所有变量
- Option Base 1 '将缺省的数组下标设为 1
- Sub Worksheet_Index1()
- Dim arr() '声明数组变量
- Dim i As Byte 'Byte 数据类型范围在 0 至 255 之间
- Application.SheetsInNewWorkbook = 4 '设置 Excel 自动插入到新工作簿中的工作表数目为4
- Workbooks.Add '新建一个工作簿
- arr = Array("一季度", "二季度", "三季度", "四季度") '使用 Array 函数创建数组
- Debug.Print LBound(arr) 'LBound 函数返回数组的指定维数的最小可用下标(由于使用了Option Base 1,返回1)
- For i = 1 To 4 '建立一个循环
- Sheets(i).Name = arr(i)
- '第一次循环, i=1,arr(1)="一季度",Sheets(1).Name="一季度"
- '第四次循环, i=4,arr(4)="四季度",Sheets(1).Name="四季度"
- Next
- Application.SheetsInNewWorkbook = 3 '设置 Excel 自动插入到新工作簿中的工作表数目为3
- End Sub
使用 Array 函数或 ParamArray 关键字创建的数组的下界为 0。使用 Array 函数创建的数组的下界受 Option Base 语句指定的下界的决定, 除非 Array 是由类型库(例如 VBA.Array )名称限定。如果是由类型库名称限定,则 Array 不受 Option Base 的影响。 在上例中,删除Option Base 1,则程序代码必须作出改动,否则,运行到Sheets(i).Name = arr(i),当i=4时会出现“下标越界”的错误(因为模块顶部缺少Option Base 1,数组arr的最小可用下标为0,而非1,最大可用下标为3,而非4)。当然,所有的Debug.Print语句都是可删除的,这里仅是为了便于用户在“立即窗口”中查看程序运行的相关情况(有关详细信息,请参阅)。 示例2:- Option Explicit '强制显式声明模块中的所有变量
- '使用 Array 函数或创建的数组的下界为 0
- Sub Worksheet_Index2()
- Dim arr() '声明数组变量
- Dim i As Byte 'Byte 数据类型范围在 0 至 255 之间
- Application.SheetsInNewWorkbook = 4 '设置 Excel 自动插入到新工作簿中的工作表数目为4
- Workbooks.Add '新建一个工作簿
- arr = Array("一季度", "二季度", "三季度", "四季度") '使用 Array 函数创建数组
- Debug.Print LBound(arr) '使用 LBound 函数返回数组的指定维数的最小可用下标,本例返回0
- Debug.Print UBound(arr) '使用 UBound 函数返回数组的指定维数的最大可用下标,本例返回3
- Debug.Print arr(0) '在立即窗口输出第一个元素的值(一季度)
- Debug.Print arr(1) '在立即窗口输出第二个元素的值(二季度)
- Debug.Print arr(2) '在立即窗口输出第三个元素的值(三季度)
- Debug.Print arr(3) '在立即窗口输出第四个元素的值(四季度)
- For i = 1 To 4 '建立一个循环
- Sheets(i).Name = arr(i - 1)
- '第一次循环, i=1,arr(i - 1)="一季度",Sheets(1).Name="一季度"
- '第四次循环, i=4,arr(i - 1)="四季度",Sheets(4).Name="四季度"
- Next
- Application.SheetsInNewWorkbook = 3 '设置 Excel 自动插入到新工作簿中的工作表数目为3
- End Sub
注意:arr = Array("一季度", "二季度", "三季度", "四季度") 和arr = VBA.Array("一季度", "二季度", "三季度", "四季度") 的不同。Array 由类型库( 例如VBA.Array )名称限定时,不受 Option Base 的影响。如下例,即使在模块顶部区域声明了Option Base 1,但在Array前面加了类型库名称限定,Debug.Print LBound(arr) 的返回值并不是1,而是0,故应使用Sheets(i).Name = arr(i - 1)。 示例3:- Option Explicit '强制显式声明模块中的所有变量
- Option Base 1 '将缺省的数组下标设为 1
- Sub Worksheet_Index3()
- Dim arr() '声明数组变量
- Dim i As Byte 'Byte 数据类型范围在 0 至 255 之间
- Application.SheetsInNewWorkbook = 4 '设置 Excel 自动插入到新工作簿中的工作表数目为4
- Workbooks.Add '新建一个工作簿
- arr = VBA.Array("一季度", "二季度", "三季度", "四季度") ' Array 由类型库( VBA.Array )名称限定
- Debug.Print LBound(arr) 'LBound 函数返回数组的指定维数的最小可用下标(不受Option Base 1的限制,返回0)
- For i = 1 To 4 '建立一个循环
- Sheets(i).Name = arr(i - 1)
- Next
- Application.SheetsInNewWorkbook = 3 '设置 Excel 自动插入到新工作簿中的工作表数目为3
- End Sub
Sub Worksheet_Index1()和Sub Worksheet_Index2()不能放在同一模块当中,这是由Option Base语句决定的,Sub Worksheet_Index2()中对4个工作表的命名是通过修改循环变量i,将其修改为i-1的方式实现的,若将它们放在同一模块,则Sub Worksheet_Index2()也受Option Base 1限制,代码运行就会产生错误,而Sub Worksheet_Index3()却可以和Sub Worksheet_Index1()放在同一个模块当中,因为在Sub Worksheet_Index3()中使用了VBA.Array,而非Array。 示例4:本示例使用 Array 函数创建数组,Range.Resize调整指定区域的大小,Transpose转置数组方向- Sub Add_Tile()
- Dim arr()
- arr = Array("序号", "姓名", "单位", "性别", "出生日期") '使用 Array 函数创建数组
- Range("A1").Resize(1, 5) = arr 'Resize调整单元格区域为A1:E5,在A1:E5中写入标题
- Range("A1").Resize(5) = Application.Transpose(arr) 'Resize调整单元格区域为A1:A5,'在A1:A5中写入标题,Transpose转置数组方向
- End Sub
使用 Array 函数创建数组.rar |