VBA for Excel(二)
本文涉及到的问题
- 没什么问题,就一些基础理论知识
计算机专业或计算机爱好者可以跳过
本文目录:
2.1 代码规范
- "
'
" 开头的行代表注释,也可像Dos一样使用Rem开头 - 用 "
Dim
" 定义变量,可连续定义多个但需分别指定类型,如:Dim a$,B$
- 代码可使用 "
+
_
" 换行续写 - 一行存在多个语句用 "
:
" 间隔 - 引用变量方法函数对象时不区分大小写
2.2 变量
2.2.1 数据类型
数据类型 | 字节数 | 范围 |
---|---|---|
Byte | 1 | 0~255 |
Boolean | 2 | True,False |
Integer | 2 | -32768-32767 简写:% |
Long | 4 | 正负20多亿 简写:& |
Single | 4 | 小数,更大 简写:! |
Double | 8 | 小数,更更大 简写:# |
Currency | 8 | 会计用小数,足够大 简写:@ |
Date | 8 | 0100年-9999年 |
Object | 4 | 对象的引用 |
String | - | 足够大 简写:$ |
Variant | - | 足够大 |
Dim A as Integer,B as Boolean,C as Date,D as string
A=1
B=false
C= #2009/9/9#
'日期需用#包裹
'下面语句用了简写与第一句等价
'Dim A%,B as Boolean,C as Date,D$
也可以不申明类型的,那么变量就被默认就是Variant,初始化后系统会根据初始化的值进行转换。变量隐式转换也是可以的比如"1"- 1 = 0
是不会报错的,但 " +
" 慎用,对于字符串 " +
" 等同于 " &
" 。
除了变量还有常量,可用Const
定义Const PI = 3.1415926
2.2.2 作用域
作用域就是保存变量的范围,作用域之外变量要么未创建要么释放掉。
运行过宏就知道,它的执行是以sub为单位的,而sub又放在模块中,因此作用域就分为三种:
作用域 | 声明方式 |
---|---|
模块内 | 模块内Dim最常用 |
模块中 | 模块中Dim,Private |
模块间 | 模块中Public |
2.2.3 对象变量
就是将对象赋给变量后的变量
Dim Rng As Range
Set Rng = Range("A1:B2")
'将A1:B2赋值给Rng
- 对象变量必须使用Set赋值
一般对象变量会配合With,用Excel录设置单元格格式的宏就清楚
With Rng
.Value = 5
.Interior.Color = 65535
End With
'区域背景设置为黄色,值设置为5
使用With可提高代码执行效率,也可以少打点字
2.3 操作符
类别 | 符号集 |
---|---|
运算 | +、-、*、/、^、Mod() |
连接 | +、& |
比较 | >、<、=、<>、>=、<=、Is |
逻辑 | And、Not、Or、Xor |
代数运算的操作符最先执行,然后是连接操作符、比较操作符,最后是逻辑操作符,具体顺序可百度,优先级各语言差别不大
2.4 数组
数组的本质是数据的组合,VBA允许数组存不同类型的变量,但当你明确声明数组类型后,数组内数据必须匹配之前声明。
Dim arr
arr=array(1,"s")
Dim arr() as string
arr=array(1,"s")
#类型错误
静态数组
Dim arr(1) '索引从零开始
Dim arr(1,2) '索引从零开始
Dim arr(1 to 2) '索引从1开始
Dim arr(1 to 2,1 to 2) '索引从1开始
注意:
- 利用循环向数组赋值前必须明确数组大小
- 在声明大小后不能一次性给数组赋值(即把数组付给数组)。
说实话我这种静态数组用的场景很少。总之数组在声明维度后只能通过循环赋值,数组赋数组是不用声明维数的。
比较多的是直接给数组赋数组,这时可以如下定义变量。
Dim arr
Dim arr()
'如果你打算给arr赋单元格,上面两个没有区别
arr = range("A1,B1")
一般直接把单元格赋给数组,注意生成的数组必然是二维数组
如果你想要把循环结果赋值给数组这时就需要动态数组了,如果你知道循环次数直接在赋值前Redim就可以,不然就只能在循环里赋值之前不断Redim
dim arr
'我知道循环次数为a
redim arr(1 to a)
for i = 1 to a
arr(i)=1
Next
dim arr
Dim arr
'我不知道循环次数
i = 1
For Each Rng In Rngs
ReDim Preserve arr(1 To 1) '边定义边赋值
arr(i) = 1
i = i + 1
Next
2.5 流程控制
选择
if语句
if condition then
statements
[elseif]
[statements]
[else]
[statements]
end if
Select语句
Select case variable
Case Value1
statements
[Case Value2
statements]
[……]
[Case else
statements]
End select
循环
For counter = startnum To endnum [Step step]
[statements]
[Exit For]
Next
For each object in objects
[statements]
[Exit For]
Next
Do [until]/[while] condition
[statements]
[Exit Do]
Loop
'[until]/[while] condition也可写在loop后就是多做一次循环
While Condition
[statements]
WEnd
最后:以上便是VBA骨架。没有看过多少代码的人,读这篇文章可能比较吃力。后面就不会再有偏理论的东西了,再有个2~3篇就打算扎扎实实的做点东西了,再然后就是补充一些常用的对象,方法之类的。我向来不喜欢长篇大论,所以内容已经很精简了,不过我文笔向来不太行的,怕就怕精简到别人和以后的自己看不明白,哈哈,希望大家也提提意见。
来源:CSDN
作者:少看点海绵宝宝
链接:https://blog.csdn.net/qq_42674105/article/details/104524010