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(