VBA01
来源:互联网 发布:淘宝假羽绒被 编辑:程序博客网 时间:2024/06/06 00:42
VBA语法
1. 数据结构
- Boolean : 布尔型
- Byte : 字节
- Long : 长整数型
- Integer : 整数型
- String : 字符串
- Variant : 变形
- Double : 双精度浮点型
- Single : 单精度浮点型
- Decimal : 小数型
- Date : 日期型
- Object : 对象型
- 用户自定义类型 : 用户自定义
- Currency : 货币型
2. 常量变量
声明常量 :
- Const 变量名 As 数据类型
- 如果在第1个过程前声明Const为模块级常量,加Public为公共常量
'定义一个Single类型常量,名称为p,常量存储数据为3.14 Const p As Single = 3.14
强制声明 : Option Explicit
Option Explicit
声明变量 : 作用域 变量名 As 数据类型
- Dim 变量名 As 数据类型;
- Public 变量名 As 数据类型;
- Private 变量名 As 数据类型;
- Static 变量名 As 数据类型
变量类型声明符
Dim Str$ '等同于Dim Str As String Dim Str '声明变量可不指定变量类型
变量赋值 : [Let] 变量名称 = 要存储数据
Dim intcount As Integer '定义integer变量 Let intcount = 3000 '给变量intcount赋值为3000,默认类型为Variant
或
Dim intcount As Integer '定义integer变量 intcount = 3000 '给变量intcount赋值为3000
作用域
Sub 本地变量() Dim a As String '定义一个String类型的变量,名称为a Static b As Integer '定义一个Integer类型变量,名称为b End Sub Dim a As String '定义模块级变量a Private b As String '定义模块级变量b Sub 合并文本() a = "我在excelhome论坛" 'a赋值 b = "学习xcel" 'b赋值 MsgBox a & b '用对话框表示a,b合并内容 End Sub Public c As String '定义全局变量
数组
声明
- 一元数组 : Public | Dim 数组名称 (a To b) As 数据类型
- 多维数组 : Public | Dim 数组名称 (row, col,…) As 数据类型
- 动态数组 : Public | Dim 数组名称 () As 数据类型
'定义一个byte类型的数组arr,可保存100个数据 Dim arr (1 To 100) As Byte '只用一个自然数确定数组大小,默认起始索引号0 Dim arr (99) As Byte '定义一个3行5列的数组,类型为Integer的二维数组 Dim arr (1 To 3, 1 To 5) As Integer'定义一个三维数组 Dim arr (1 To 3, 1 To 5, 1 To 4) As Integer' Sub a() Dim a As Integer '定义Integer变量'用工作表函数COUNTA求A列中的非空单元格个数,将结果保存在变量a中 a = Application.WorksheetFunction.CountA("A:A") Dim arr() As String '定义一个String类型的动态数组'ReDim可以重定义数组的大小,包括已经定义的数组,但不可改编版数组类型 ReDim arr(1 To a) As String '重新定义数组arr的大小 End Sub
索引
arr(1) '数组中的第1个数据arr(2) '数组中的第2个数据arr(3) '数组中的第3个数据......arr(100) '数组中的第100个数据
赋值创建
- Array函数
Sub ArrayTest()'使用array创建数组,应声明为variant类型变量 Dim arr As Variant '将1到10的自然数存储到数组arr中 arr = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)'用对话框显示数组中的第二个元素,使用array创建数组默认索引0开始,除非第一句写入"OPTION BASE 1"语句 MsgBox "arr数组的第二个元素为:" & arr(1) End Sub
- Split函数 : 将一个字符串按指定的分隔符拆分,将各部分保存在一个数组中
Sub SplitTest() '用Split函数创建数组,应为Variant类型 Dim arr As Variant 'Split函数的第一参数是包含分隔符的字符串或字符串变量 '返回索引号从0开始 arr = Split("枫叶, 空空, 小月, 老祝", ",") MsgBox "arr数组中的第2个元素时:" & arr(1) End Sub
- 通过单元格区域直接创建数组 : 所得到的索引号从1开始
Sub RngArr() '存储数据的数组应定义为一个Variant类型的变量 Dim arr As Variant '将A1:C3中保存的数据存储到数组arr中 arr = rang("A1:C3").Value '将arr中存储的数据写入到E1:G3单元格区域 Range("E1:G3").Value = arr End Sub
数组运算
- 使用工作表函数需要加前缀
Application.WorksheetFunction.函数名
- UBound(数组名称):求数组最大索引号
Sub ArrayTest() '定义一个Variant类型变量,名称为arr Dim arr As Variant arr = Array(1, 2, 3, 4, 5) '最大索引号 MsgBox "数组最大索引号是:" & UBound(arr) End Sub
- LBound(数组名称) : 最小索引号
Sub ArrayTest() '定义一个Variant类型变量,名称为arr Dim arr As Variant arr = Array(1, 2, 3, 4, 5) '最小索引号 MsgBox "数组最大索引号是:" & LBound(arr) End Sub
- 求多维数组的最大最小索引号
Sub dwsz() '定义一个Integer类型二维数组 Dim arr(1 To 10, 1 To 100) As Variant Dim a As Intege, b As Integer '第1参数是数组名称,第2参数用于指定数组名称 a = UBound(arr, 1) b = LBound(arr, 2) '最大索引号 MsgBox "第一维的最大索引号是:" & a & Chr(13) & _ "第二维的最大索引号是:" & b End Sub
- 求数组包含元素个数
UBound(数组名称) - LBound(数组名称) + 1
- Join函数 : 将一维数组合并成字符串
Sub JoinTest() '定义两个变量 Dim arr As Variant, txt As String arr = Array(0, 1, 2, 3, 4, 5) '以@为分隔符,合并arr中的元素为一个字符串 txt = Join(arr, "@") MsgBox txt End Sub
- 数组中保存的数据写入单元格区域
'将数组arr中索引号是2的元素写入活动工作表A1的单元格中 Range("A1").value = arr(2)
3. 控制结构
判断结构
- 判断两次以内 : If-条件-Then-True-Else-False-End If
- Else后可省略
If Range("B2").Value >= 60 Then Range("C2").Value = "及格" Else Range("C2").Value = "不及格" End If
- 判断三次以内 : If-条件-Then-Elseif-Else-False-End If
Sub Text() If Range("B2").Value >= 90 Then Range("C2").Value = "优秀" ElseIf Range("B2").Value >= 80 Then Range("C2").Value = "良好" ElseIf Range("B2").Value >= 60 Then Range("C2").Value = "及格" Else Range("C2").Value = "不及格" End If End Sub
- 判断三次以上使用 : Select Case 条件 - Case Is - End Select
Sub Text() Select Case Range("B2").Value Case Is >= 90 Range("C2").Value = "优秀" Case Is >= 80 Range("C2").Value = "良好" Case Is >= 60 Range("C2").Value = "及格" Case Else Range("C2").Value = "不及格" End Select End Sub
循环结构
- For … Next : 执行同一段代码
- For A To B Step num (B>A) - 语句块1 - [Exit For] - 语句块2 - Next [元素变量]
Sub ShtAdd() Dim i As Byte For i = 1 To 5 Step 1 Worksheets.Add '在工作表前插入一新工作表 Next i End Sub
- For Each … Next : 循环处理集合或数组中的成员
- 语句形式 : For Each 变量 In 集合名称或数组名称 - 语句块1 - [Exit For] - 语句块2 - Next [元素变量]
Sub ShtName()'sht变量是循环变量,在工作表集合中循环,所以变量类型应该定义为与之对应的Worksheet类型 Dim sht As Worksheet, i As Integer i = 1 For Each sht In Worksheets Range("A1" & i) = sht.Name i = i + 1 Next sht End Sub
- Do While
'开头判断式 Do [while循环条件] <循环体> [Exit Do] [循环体] Loop '结尾判断式 Do <循环体> [Exit Do] [循环体] Loop [while循环条件]
Sub ShtAdd() Dim i As Byte '定义byte类型变量,名称i i = 1 '给变量i赋值 Do 'Do语句开始 Worksheets.Add '在活动工作表前插入一张新工作表 i = i + 1 '执行一次循环,变量i的值就增加1 Loop While i <= 5 '如果变量小于等于5,执行循环 End Sub
- 在循环体中设置退出循环的条件
Sub ShtAdd() Dim i As Byte i = 1 Do If i > 5 Then Exit Do '如果变量i大于5,终止循环 Worksheets.Add i = i + 1 Loop 'Do语句结束的标志 End Sub
- Do Until : 与Do While语句用法基本相同, Do Until在循环条件True退出循环
'开头判断式 Do [until循环条件] <循环体> [Exit Do] [循环体] Loop '结尾判断式 Do <循环体> [Exit Do] [循环体] Loop [until循环条件]
- With语句 : 省略多次重复输入
Sub FontSet() 'with后跟操作对象 With Worksheets("S-heet1").Range("A1").Font .Name = "仿宋" '设置字体为仿宋 .Size = 12 '设置字号为12 .Bold = True '设置字体为加粗字体 .ColorIndex = 3 '设置字体颜色为红色 End With 'with语句结束标志 End Sub
4. 模块
- 声明私有过程 : Option Private Module
宏Sub :
[Private | Public][Static] Sub 过程名([参数列表]) [语句块] [Exit Sub] [语句块] End Sub
在过程中执行另一过程
- 直接使用过程名调用
过程名, 参数1, 参数2, ...
Sub RunSub() ShtAdd '因为过程没有参数,直接写过程 End Sub
- 使用Call关键字调用
Sub RunSub() Call ShtAdd End Sub
- 使用Application对象的Run方法调用过程
Application.Run 表示过程名的字符串(或字符串变量), 参数1, 参数2, ......
Sub RunSub() '"ShtAdd"表示过程名字符串,用双引号 Application.Run "ShtAdd" End Sub
向过程传递参数
- 引用传递
'创建参数shtcount,integer类型 Sub ShtAdd(shtcount As Integer) '通过参数指定新建的工作表 Worksheets.Add Count:=shtcount End Sub
- 引用按保存数据内存地址传递,子过程修改参数会影像主过程中变量存储的值
Sub Test() Dim c As Integer c = 2 Call ShtAdd(c) End Sub
- Byval关键字传递 : 不会改变主过程变量
'使用关键字ByVal Sub ShtAdd(ByVal shtcount As Integer) Worksheets.Add Count:=shtcount End Sub
自定义函数Function :
- 可在用户定义函数查找
- 语言结构
[Private | Public][Static] Function 函数名([参数列表]) [As 数据类型] [语句块] [函数名 = 过程结果] [Exit Function] [语句块] [函数名 = 过程结果] End Function
'在使用函数时,函数的参数只能设置为单元格区域 Function CountColor(arr As Range) Dim rng As Range '循环处理过程参数arr中的每个参数 For Each rng In arr '判断底纹颜色是否黄色 if rng.Interior.Color = RGB(255,255,0) Then CountColor = CountColor + 1 End If Next rng End Function
5. 对象、集合、属性和方法
- 类Python
6. 运算符
- 算术运算符
* 比较运算符
* 通配符
* 逻辑运算符
7. VBA内置函数
'输入"VBA."显示函数列表 VBA.
8. 排版注释
- 长代码显示为多行代码 : ” _”
Sub test()'换行后下一行应该适当缩进,式视觉上和其他完整一行代码区分 Application.Workbooks("Book1").Worksheets("Sheet1") _ .Range("A1:D100").Font.Bold = True End Sub
- 多行代码合并 : 英文冒号(:)
Sub test() '定义与赋值 Dim a%, b%, c%: a = 1: b = 2: c = 3 End Sub
- 添加注释 : 单引号(‘), Rem关键字
Sub test() Dim i As Integer Rem利用For循环语句 , 向单元格中输入数据 For i = 1 To 10 Cells(i, "a") = i Next i End Sub
阅读全文
0 0
- VBA01
- 数据科学家应知必会的6种常见概率分布
- jquery怎么设置复选框选中
- 数据库修改表名,字段名 字段类型
- 多线程常用方法比较汇总
- 深度学习主机配置:Ubuntu16.04+1080ti+cuda8+cudnn6+tensorflow1.3
- VBA01
- 运行js代码的两种方式
- rabbitMQ第一篇:rabbitMQ的安装和配置
- 在没有DOM操作的日子里,我是怎么熬过来的(上)
- 已知如下的一颗二叉排序树,问可能的关键字输入顺序有几种
- HTML && CSS 学习笔记(5)div、class(关键词:html/div/class)
- Linux进程间通信
- Eclipse项目上红色感叹号,jar包无报错,无缺失
- 一个敏捷项目的咨询记录