1、计算机硬件的组成部分
内存,一旦断电,存储在里面的数据就消失了,而硬盘是永久存储数据的,所以刚开始我们在文件里面编辑没有按保存的时候,数据是在内存里面的,一旦断电数据就没了,但我们点了保存,数据就会存储到硬盘里面,永久保存啦。
2、数据存储方式
计算机最小存储单元:字节(单位:B),最小单位:位(单位:b),1字节=8位=1B=8b
3、数据类型及变量
:布尔型、整数型、浮点型、字符型、数组、对象、类
4、布尔运算符
5、高级语言不能直接被计算机执行,高级语言需要编译成为机器语言才能被计算机执行,程序运行过程图示:
6、 VBA命名方式
(1)可用字母,数字或一些标点符号命名,但第一个字符必须是字母
(2)不能使用空格
(3)不含有特殊类型的声明字符(#$%&!)
(4)变量名不区分大小写
7、运算符
(1)算术运算符
+、--、*、/、\(取商运算符)、Mod(取余运算符)
\取商运算符:7\2=3 Mod取余运算符:7 Mod 2 =1
(2)赋值运算符的优先级高于算术运算符
的含义是把8赋值给b,然后a+b
8、流程控制语句
(1)分支控制语句:if语句 select case语句
(2)循环语句:while循环语句 for next循环语句
小插曲:excel中时间表示:
1天=1 1小时=1/24 12点=12/24=0.5
在excel中时间的实质就是数值,
9、if条件判断语句使用:
(1)if 条件 then 结果
(2)if 条件 then
结果
end if
ps:这里注意两种写法的区别:如果"结果"在下面,就需要加end if结束语句,如果"结果"在上面,就不需要写end if
(3)多条件分支:
vbnet
if 条件 then
结果
else
结果
end if
vbnet
if 条件 then
结果
elseif 条件 then
结果
else
结果
end if
多条件嵌套语句:
10、select case语句
当判断条件太多时,用if看起来就太麻烦,代码可读性太差,这时就可以用select case 语句,进行多条件判断
语法:
vbnet
select case 条件判断对象
case 条件1 结果
case 条件2 结果
case 条件3 结果
...
case else 全部条件都不满足的结果
end select
图示:
图一: 图二:
图三:
ps:
(1)select case 条件判断对象,这个对象只是一个对象,不在这里进行条件判断,在下面的case后面进行判断,写法:<0.5,is是系统自动补足的
(2)如果结果跟case写在同一行,那条件后面一定要加" 冒号:",见上面图二
如果结果放在case的下一行,那条件后面可以不用加" 冒号:",见上面图三
11、循环语句Do...Loop循环
11.1、Do while...Loop的用法:
语法一:条件体在Do后面
vbnet
Do While 条件表达式
循环体
Loop
语法二:条件体在Loop后面
vbnet
Do
循环体
Loop While 条件表达式
两者的区别是:语法一是先判断条件,再进入循环,循环有可能一次都不执行;语法二是先进入循环再判断条件,循环至少循环一次。
案例:(这里只举语法一的例子)
vbnet
Sub 求和()
Dim i As Integer
Dim sum As Integer
i = 1
sum = 0
Do While i <= 100
sum = sum + i
i = i + 1
Loop
MsgBox sum
End Sub
ps:
(1)Msgbox 在vba里表示弹出一个显示框,类似于print打印的意思
(2)Do while ...Loop循环是,执行完一次循环体,执行Loop,然后再Do whlie 条件判断
(3)vba中添加注释的方法有两种:(1)加单引号' (2)Rem+注释
例:
vbnet
Sub Example()
' 这是单行注释
Rem 这也是单行注释
' 可以在单行的开始使用Rem,但不能在其他位置
Dim i As Integer
i = 10 ' 这是行内注释
End Sub
循环结束设置:
标志法:主要用在循环次数不确定的情况下。其基本思想是:设置一个标志变量,标志变量的值随着循环发生变化,每循环一次,就测试一次标志变量的值,当标志变量的值等于指定标志值时,结束循环。
计数法:主要用在循环次数确定的情况下。其基本思想时:设置一个计数变量,称为计数器,循环开始前给出初始值,每循环一次,计数变量增1,直到计数变量的值达到指定次数。
上述代码中的i就是标志变量,用的就是标志法:
11.2、Do Until...Loop的用法:
Until跟while的用法一样,不一样的是条件,Until后面的条件满足条件时,跳出循环,Until是"直到"的意思 ,while是满足条件执行循环,Until是满足条件跳出循环。
例子:下面循环的含义是当i>100时,跳出循环
vbnet
Sub 求和2()
Dim i As Integer
Dim sum As Integer
i = 1
sum = 0
Do Until i > 100
sum = sum + i
i = i + 1
Loop
MsgBox sum
End Sub
12、For Next循环
语法:
vbnet
Dim 变量 '定义一个变量
For 变量=初始值 To 最大值 (step 步长)
循环体
Next
for next循环用于有确定的循环次数的语句,
例:
vbnet
'默认步长为1
Sub 求和2()
Dim i As Integer
Dim sum As Integer
For i = 3 To 5
sum = sum + i
Next
MsgBox sum
End Sub
'步长为2
Sub 求和2()
Dim i As Integer
Dim sum As Integer
For i = 1 To 100 step 2
sum = sum + i
Next
MsgBox sum
End Sub
'步长为-2
Sub 求和2()
Dim i As Integer
Dim sum As Integer
For i = 100 To 1 step -2
sum = sum + i
Next
MsgBox sum
End Su
ps:
(1)步长可以为负,
(2)在VBA中对于整型变量,可以不用赋初值,默认是0,不写步长,默认是1,只是在VBA里面,如果在C语言里,一定要赋初值
13、循环语句 For Each ... in Next
作用:针对一个集合或是数组中的每个元素重复执行操作
语法:
例:
vbnet
Sub 循环()
Dim rng As Range
For Each rng In Range("A1:A3")
rng.Value = 1
Next
End Sub
结果:
ps:
(1)Range是对象类型,rng是对象变量,
(2)代码的含义是:rng=A1时,给单元格赋值1,当rng=A2时,给单元格赋值1,rng=A3时,给单元格赋值1,结束循环
总结:几个语句的区别:
14、变量定义
(1)变体型:Variant
语法:
vbnet
Dim a as Variant
当你不知道输入数据是什么类型时,可以定义为变体型,到时候系统会根据用户输入的数据,来自动判断数据类型,但是变体型的存储空间会很大,都使用变体型的话会使得系统变慢,如果你没有明确一个变量的类型,那变量的类型默认是变体型。
(2)数组类型
定义:
vbnet
Dim a(2) as integer
ps:
① 关于存储空间,定义变量,系统给每个变量分配的存储空间是随机的,但是数组不一样,定义一个数组,那系统就会给这个数组分配一个连续的存储空间,里面的元素按照从a[0]开始往后顺序存储,是有序的
② 一个数组里面只能放相同的数据类型
(3)结构体
① 作用:是一种聚合数据类型,用以实现较复杂的数据结构。结构体同时也是一些元素的集合,这些元素称为结构体的成员,且这些成员可以为不同的类型,成员一般用名字访问。
② 语法:
vbnet
'自定义一个数据类型
Struct student{
char name
int age
char sex
float score
}
'定义一个变量
Struct student zhangru
'给变量赋值
zhangru.name="林耶"
zhangru.age=18
zhangru.sex="女"
zhangru.score=99
这个Struct student是用户自定义的student的数据类型,系统内存分配图示:
③ 结构体嵌套
vbnet
'结构体嵌套
Struct student{
char name
int age
char sex
float score
Struct date{
int year
int month
int day
}bir
}
'定义一个变量
Struct student linye
'给嵌套变量赋值
linye.bir.year = 2005
linye.bir.month = 2
linye.bir.day = 5
重点:一个对象的属性可能是一个值,也可能是另一个对象
点运算符:结构体变量名.成员名
15、函数调用
vba里面的sub过程就相当于函数过程
调用方式:
vbnet
call 函数名
call可以省略,直接写一个函数名,可以进行传参,函数调用和传参过程如下:
16、变量的作用域和生命周期
(1**)过程变量:**定义在过程中的变量叫做过程变量,该变量只能使用在该过程中,不用被其他过程使用,例如下面的demo2中不能使用demo1中的a
在不同的过程中,可以定义相同的变量名,不会相互影响
(2) 模块变量:在模块里面定义的变量,在过程之外,每个过程都可以调用,图示:
(3)全局变量:在模块里面定义一个全局变量,在过程之外,每个模块都可以调用,图示:
各个变量的生命周期:
ps:过程的调用:
在过程前面加上Public或者省略,都是代表这个过程是公共过程,所以模块都可以调用这个过程;
如果在过程前面加上private代表这个过程是私有过程,只能在本模块中被调用,图示:
vbnet
Option Explicit
Public a As Integer
'私有过程
Private Sub demo1()
a = 100
MsgBox a
End Sub
'公共过程
Public Sub demo2()
MsgBox a
End Sub
'公共过程
Sub demo2()
MsgBox a
End Sub
17、静态变量
普通变量和静态变量的区别:
(1)静态变量
代码: 关键字static
vbnet
Sub 静态变量()
Static a As Integer
Dim i As Range
a = a + 3
Cells(1, 1) = a
End Sub
静态变量的特点是:可以保留上一次变量的值,也就是上一次变量的值会保留在内存中,不会被释放,如果要释放可以手工写代码让他释放,,或者等整个程序关闭的时候就会释放。
图示:
区别:程序执行第一次,执行完a不会被释放,会保留值,当第二次再运行的时候,就在a=3的基础上计算,但是普通变量是程序执行完一次a就会被释放,释放完第二次再运行的时候,还从新定义变量a
(2)普通变量
代码:cells(1,1):选取单元格A1,cells函数就是选取excel单元格的函数
vbnet
Sub 普通变量()
Dim a As Integer
a = a + 3
Cells(1, 1) = a
End Sub
结果:
代码在内存执行过程:
dim a as integer以后在内存分配一块空间给a存储----->>>>然后执行a=a+3----->>>>然后把a赋值给A1单元格,结束后执行end sub,过程结束,变量a的空间被释放,过程图示:
18、excel定义常量、ByVal按值传递、ByRef按引用传递
(1)定义常量:公式-定义名称-名称用于计算
(2) 在VBA中定义常量的写法:
vbnet
Const PI=3.1415926
(3) ByVal按值传递
代码:
vbnet
Sub usechage()
Dim x As Integer
x = 5
change x '输出change过程的x值
MsgBox x '输出本过程的x的值
End Sub
Sub change(ByVal x As Integer)
x = x + 2 '更改x的值
MsgBox x
End Sub
结果:第一个x的结果是7(change过程的x值),第二个x的结果是5(本过程x)
在形参前面加上ByVal后,传递的x就只传递x的值,也就是复制一个x的值,给形参x,形参x和实参x不是同一个值,这就是按值传递。
当形参前面不加ByVal的时候,是按引用传递(默认),关键字:ByRef,按引用传递是,形参和实参存储在两个空间,形参引用的是实参的地址,所以当change过程更改了x的值,实参的值也会变,代码:
vbnet
Sub usechage()
Dim x As Integer
x = 5
change x
MsgBox x
End Sub
Sub change(ByRef x As Integer)
x = x + 2
MsgBox x
End Sub
结果:
图示: