VBA for Excel(二)

社会主义新天地 提交于 2020-02-26 23:16:45

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开始

注意:

  1. 利用循环向数组赋值前必须明确数组大小
  2. 在声明大小后不能一次性给数组赋值(即把数组付给数组)。

说实话我这种静态数组用的场景很少。总之数组在声明维度后只能通过循环赋值,数组赋数组是不用声明维数的。

比较多的是直接给数组赋数组,这时可以如下定义变量。

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篇就打算扎扎实实的做点东西了,再然后就是补充一些常用的对象,方法之类的。我向来不喜欢长篇大论,所以内容已经很精简了,不过我文笔向来不太行的,怕就怕精简到别人和以后的自己看不明白,哈哈,希望大家也提提意见。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!