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 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) End Sub Sub a4() Dim arr2() arr2 = Array(1, 2, 3, 4, "arr5") '用函数批量写入 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) '数组部分存入 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
    '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)返回一个一维数
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返回一个数组
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
    Stop         '暂停查看得到一个arr1{A,B,C;累加,累加,累加}同sumifs效果的数组
End Sub

'调用工作表函数的情况下运行速度不如VBA函数,常见处理函数ARRAY,SPLIT,JOIN,FILTER,INDEX。

4.获得文件修改的日期和时间(FILEDATETIME函数) 147 5.获得文件大小(FILELEN函数) 147 6.返回和设置文件属性(GETATTR函数和SETATTR函数) 147 7.更改缺省文件夹或驱动器(CHDIR语句和CHDRIVE语句) 149 8.创建和删除文件夹(MKDIR语句和RMDIR语句) 149 9.复制文件(FILECOPY语句) 149 10.删除文件(KILL语句) 151 11.从文件读取和写入数据(INPUT/OUTPUT) 151 12.文件访问类型 152 13.使用顺序文件 152 14.读取储存于顺序文件里的数据 152 15.逐行读取文件 152 16.从顺序文件读取字符 153 17.读取分隔文本文件 155 18.往顺序文件里写数据 155 19.使用WRITE # 和PRINT # 语句 156 20.操作随机文件 157 21.创建用户定义的数据类型 157 22.操作二进制文件 161 23.操作文件和文件夹的时髦方法 162 24.使用WSH获取文件信息 164 25.FILESYSTEMOBJEC的方法和属性 165 26.对象FILE的属性 168 27.文件夹对象属性 169 28.驱动器对象属性 169 29.使用WSH创建文本文件 170 30.使用WSH进行其它操作 172 31.运行其它应用程序 172 32.创建快捷方式 173 33.接下来…… 174 第九章 利用VBA控制其它应用程序 174 1.启动应用程序 174 2.在应用程序之间切换 177 3.控制其它应用程序 177 4.控制应用程序的其它方法 179 5.了解自动控制 179 6.了解链接和嵌入 180 7.使用VBA进行链接和嵌入 181 8.COM和自动控制 182 9.了解绑定 182 10.后期绑定 182 11.早期绑定 182 12.建立到对象库的引用 183 13.创建自动控制对象 184 14.使用CREATEOBJECT函数 184 15.使用自动控制创建一个新的WORD文档 185 16.使用GETOBJECT函数 185 17.打开存在的WORD文档 186 18.使用关键字NEW 187 19.使用自动控制访问MICROSOFT OUTLOOK 188 20.接下来…… 189 第十章 对话框和自定义窗体 189 1.文件打开和另存为对话框 192 2.GETOPENFILENAME和GETSAVEASFILENAME方法 196 3.创建窗体 197 4.创建用户窗体的工具 199 5.标签 200 6.文字框 200 7.框架 200 8.选项按钮 201 9.复选框 201 10.切换按钮 201 11.列表框 201 12.复合框 201 13.滚动条 201 14.旋转按钮 201 15.图像 201 16.多页控件 202 17.TABSTRIP控件 202 18.REFEDIT控件 202 19.在窗体上放置控件 202 20.应用程序示例1:信息调查 202 21.在窗体上添加按钮、选项框和其它控件 204 22.更改控件名称 206 23.设置其它控件属性 206 24.准备工作表以储存窗体数据 207 25.显示自定义窗体 208 26.设置TAB顺序 208 27.了解窗体和控件事件 209 28.编写VBA过程对窗体和控件事件反应 211 29.编写过程来初始化窗体 211 30.编写过程填充列表框控件 213 31.编写过程控制选项按钮 213 32.编写过程同步文字框和旋转按钮 214 33.编写过程关闭用户窗体 214 34.转移窗体数据到工作表 215 35.使用INFO SURVEY应用程序 216 36.应用程序示例2:学生和考试 216 37.使用多页和TABSTRIP控件 216 38.给窗体STUDENTS AND EXAMS自定义窗体编写VBA过程 218 39.使用自定义窗体STUDENTS AND EXAMS 223 40.接下来…… 225 第十一章 自定义集合和类模块 225 1.使用集合 226 2.声明自定义集合 227 3.给自定义集合添加对象 227 4.从自定义集合移出对象 228 5.创建自定义对象 229 6.创建类 229 7.变量声明 229 8.定义类的属性 230 9.创建PROPERTY GET过程 230 10.创建PROPERTY LET过程 231 11.创建类方法 232 12.创建类的示例 232 13.类模块里的事件过程 232 14.创建用户界面 233 15.观察VBA过程的执行 242 16.接下来…… 245 第十二章 使用VBA创建自定义菜单和工具栏 245 1.工具栏 245 2.创建自定义工具栏 247 3.删除自定义工具栏 249 4.使用COMMANDBAR的属性 249 5.使用COMMANDBAR控件 249 6.理解和使用控件属性 251 7.控件方法 253 8.使用菜单 254 9.菜单编程 256 10.创建子菜单 258 11.修改内置快捷菜单 260 12.创建快捷菜单 262 13.接下来…… 264 第十三章 调试VBA过程和处理错误 264 1.测试VBA过程 265 2.终止过程 265 3.使用断点 266 4.在断模式下使用立即窗口 269 5.使用STOP语句 271 6.添加监视表达式 271 7.清除监视表达式 274 8.使用快速监视 274 9.使用本地窗口和调用堆栈对话框 275 10.逐句运行VBA过程 276 11.逐句运行过程 277 12.逐过程执行过程 277 13.设置下一条语句 278 14.显示下一条语句 279 15.终止和重新设置VBA过程 279 16.了解和使用条件编译 279 17.操纵书签 281 18.捕捉错误 281 17.接下来…… 285 第十四章 微软EXCEL 2002 的事件编程 285 1.事件过程介绍 285 2.激活和失活事件 287 3.事件次序 289 4.工作表事件 289 5.工作簿事件 294 6.图表事件 312 7.内嵌图表事件 316 8.可为应用软件对象识别的事件 317 9.查询表时间 320 10.接下来…… 323 第十五章 在EXCEL里使用ACCESS 323 1.对象库 323 2.建立对对象库的引用 329 3.链接到ACCESS 329 4.使用AUTOMATION链接到ACCESS数据库 331 5.使用DAO链接到ACCESS数据库 334 6.使用ADO链接到ACCESS数据库 334 7.从EXCEL执行ACCESS任务 336 8.创建新ACCESS数据库 336 9.打开ACCESS窗体 338 10.打开ACCESS报表 343 11.运行ACCESS查询 345 12.运行选择查询 347 13.运行参数查询 348 14.调用ACCESS函数 350 15.获取ACCESS数据到EXCEL工作表 350 16.使用GETROWS方法获取数据 350 17.使用COPYFROMRECORDSET方法获取数据 354 18.使用TRANSFERSPREADSHEET方法获取数据 354 19.使用OPENDATABASE方法 356 20.从ACCESS数据创建文本文件 360 21.从ACCESS数据创建查询表 363 22.在EXCEL里使用ACCESS数据 365 23.用ACCESS数据创建内嵌图表 365 24.传输EXCEL电子表格到ACCESS数据库 367 25.将EXCEL电子表格链接到ACCESS数据库 369 26.将EXCEL电子表格导入ACCESS数据库 370 27.放置EXCEL数据到ACCESS表 370 28.接下来…… 374 Dim i, j, k, rowall, columnall, rownum As Integer rownum = InputBox("输入标题行所占行数") rowall = Cells(Rows.Count, 1).End(xlUp).Row columnall = Cells(1, Columns.Count).End(xlToLeft).Column k = WorksheetFunction.Count(Range(Cells(1,... Dim wk_data As Variant Set wk_data = Sheets("Sheet1") strArray = wk_data.Range("A1:CV100").Value 2 把数组的内容写入到Excel wk_data.Range("A1").Resize(