VBA教程初级(一):简单宏
针对本教程的读着,默认已经知道什么是宏,可以打开宏编辑。如果不会,请百度。百度是万能的。
进入正题,首先打开代码窗口,然后编辑窗口敲入如下代码:
PublicSub myFirstVBA()
' 第一个vba程序
MsgBox "hello vba"
EndSub
· 1
· 2
· 3
· 4
step 1:
step 2:
step 3:
VBA教程初级(二):数据结构
举个例子,如果不懂编程的人很难理解数据结构。生活中,装酱油就要用酱油瓶;装米就要用米袋子。你用米袋子装酱油,那就开玩笑了。所以,你可以理解数据结构就是将对应的“东西”放在相应的容器里,然后你就使用容器来工作。
vba里的常用数据类型有:
字节型(Byte),整数型(Integer),长整数型(Long),单精度浮点型(Single),双精度浮点型(Double),货币型(Currency),小数型(Decimal),字符串型(String),日期型(Date),布尔型(Boolean)等。
ps:不要问我为什么有这些类型,要问就问为什么米袋子不能装酱油。
不同的数据类型可以告诉Excel应该用什么形式保存它。
举个例子,如何使用数据类型,就跟我们生活中,吃饺子蘸酱油一样。
有一个员工叫做王大力,年龄55周岁,他所在的国家有14亿人,出生是1988年1月1日。我们可以使用String类型存放名字,使用Integer来存放年龄,由于国家人数太大了,我们使用Long类型来存放人,因为人没有小数点。。不要问我为什么。。。你能给我找一个小数点的人就行。使用Date类型来存放生日。看这样我们就简单实用了数据类型。
VBA总声明变量很简单语法为:Dim 变量名 As 数据类型,比如我们生命一个日期类型的变量d1就可以这样写
Dim d1 As Date
下面我们来做这样一个例子,我们声明一个字符串类型的变量a,然后让MsgBox输出变量a
PublicSub
f1()
Dim
a
AsString
a =
"啊哈哈"
MsgBox a
EndSub
· 1
· 2
· 3
· 4
· 5
· 6
· 7
Step 1:
Step 2:
我们输出了变量a的结果是“啊哈哈”,你可以试试给a的值变成其他的看能变化么
我们知道了什么是变量。也就可以理解知道了拿酱油瓶,里面有酱油。那么问题来了,你拿谁家的酱油瓶呢?是自己家的,还是隔壁老王家的?这就涉及到了变量的作用域。
变量的声明很简单,就是告诉计算机,这个变量是存放什么类型的数据,也可以理解为这个空瓶子里面装酱油还是白醋。我们详细的来聊一聊作用域。
作用域,可以理解为变量可以使用的范围吧,就是在哪里可以使用这个变量。比如我在a的excel中使用了变量age,但是我在b的excel中直接使用age是不可以的,这就涉及到了作用域的概念。
作用域包括:
单个过程,在一个过程也可以理解是一个函数中使用Dim或者Static语句声明的变量,这里static是静态的意思,就是说这个变量一旦声明了就不可变,比如身份证,一个人对应一个身份证不可以变。
单个模块,在模块的第一个过程之前使用Dim或者Private语句声明的变量,可以在这个模块内所有的过程中使用。
所有模块,在一个模块的第一个过程之前使用Public语句声明的变量,作用域为所有模块,这样所有的模块都可以引用(使用它)。
OptionExplicit
Publica3
AsString
'所有模块可以使用的变量
Dima1
AsString
'模块内可以使用的变量
PublicSub
myFirstVBA()
' 第一个vba程序
MsgBox
"hello vba"
EndSub
PublicSub
f1()
Dim
a
AsString
'过程内的变量'
a =
"啊哈哈"
Let
a1 =
"hello(*@ο@*) 哇~"
Range(
"A1").Value = a1
EndSub
· 1
· 2
· 3
· 4
· 5
· 6
· 7
· 8
· 9
· 10
· 11
· 12
· 13
· 14
· 15
· 16
· 17
· 18
这里就可以看出,f1这个过程中的a变量,只有在f1中可以使用。然后f1中也可以使用a1,和a3的变量,这样你运行一下f1就可以发现a1这个单元格已经被更改了。
我们在f1中还使用了Let a1 = “hello(@ο@)哇~”这是给变量赋值的语句,就是说这个a1的容器放什么东西,当然let可以省略,写着原因的是为了跟下文的给对象赋值使用Set作为区分。
总结,我们上述操作是在模块1中进行的,为了证明Public的变量可以在所有模块中进行使用,那么我们创建模块2.
执行a1后的结果为
step 1:如图在模块上右键,选择“插入”,然后新建模块。
step 2:在新建的模块中定义一个方法叫module,然后使用a3这个变量。
step 3:执行一下module这个方法可以看到a2被我们更改了
我们现在就可以简单的掌握了作用域。也就是说知道这个容器都在哪里生效了。
数组有大小,你可以简单理解数组是一个班级,里面有多少个学生,大家都有学号,每个学号代表一个学生。
数组的声明Dim 数组名 (a to b) As 数据类型
其中a to b是长度例如:Dim 一年七班 (1 to 50) As String.就声明了50个长度的“一年七班”数组。
给数组赋值,我们生命了一个容器之后得告诉程序,容器里都有什么数据,那么我们就来给数组赋值。一年七班(1) = “邓超” 这样我们就给第一位的数组赋值了。
我们这样做一个例子,我们一年七班中有跑男的十个嘉宾,然后呢,我们给他们在A这列竖着都显示出来,我们这样实现程序
PublicSub
pss_Array()
'数组的声明和使用
Dim
一年七班
(
1To
10
)
AsString
一年七班
(
1) =
"邓超"
一年七班
(
2) =
"陈赫"
一年七班
(
3) =
"郑凯"
一年七班
(
4) =
"王祖蓝"
一年七班
(
5) =
"李晨"
一年七班
(
6) =
"鹿晗"
一年七班
(
7) =
"王宝强"
一年七班
(
8) =
"包贝尔"
一年七班
(
9) =
"夏雨"
一年七班
(
10) =
"陈坤"
'将班级的成员添加到excel的第一行
Cells(
1,
"a") =
一年七班
(
1)
Cells(
2,
"a") =
一年七班
(
2)
Cells(
3,
"a") =
一年七班
(
3)
Cells(
4,
"a") =
一年七班
(
4)
Cells(
5,
"a") =
一年七班
(
5)
Cells(
6,
"a") =
一年七班
(
6)
Cells(
7,
"a") =
一年七班
(
7)
Cells(
8,
"a") =
一年七班
(
8)
Cells(
9,
"a") =
一年七班
(
9)
Cells(
10,
"a") =
一年七班
(
10)
Range(
"A1").
Select
EndSub
· 1
· 2
· 3
· 4
· 5
· 6
· 7
· 8
· 9
· 10
· 11
· 12
· 13
· 14
· 15
· 16
· 17
· 18
· 19
· 20
· 21
· 22
· 23
· 24
· 25
· 26
· 27
运行这段程序,我们在a这列把这10个 同学都输出了。然后租后一行Range(“A1”).Select是选中了a1.也就是队长邓超被选中了。运行之后的结果是
上次我们说到了数组。大家可以理解为一列很长很长的存放数据的容器。那么我们可以用多个这样的容器一起来存放数据吗。就像我们上学的时候站的方队,有横有纵。回答是,可以的。我们还是用酱油来举例子,让大家明白,多维数组。
我借用别人的酱油图片了。自己实在是画不出来。大家可以看到,我们有3层酱油,,每一层5列,那么我们就可以说,一个二维数组存放了酱油。
这样的好处是,我想要第一层第四个酱油,就可以酱油(1,4)这样拿到了。
下面我们使用vba来操作数组。
声明数组:Dim 酱油 (1 to 3,1 to 20)。说明这个数组是3*20个空间的变量。大家要记住。
代码片段:
PublicSub pss_dArray()
Dim酱油(1To3, 1To20) AsString
酱油(4, 20) = "一品海鲜"
MsgBox 酱油(3, 20)
EndSub
如果在声明数组的时候,不能确定会往这个数组里存储多少个元素,就是说不能预知数组大小。我们可以在定义数组是括号内写空,就是:Dim 数组名 ();
然后在程序里试用ReDim语句来重新制定它大小。
PublicSub
pss_Dynamic_Array()
'定义一个未知长度的数组arr
Dim
arr()
AsString
Dim
n
AsLong
'统计a列有多少个非空单元格
n = Application.WorksheetFunction.CountA(Range(
"A:A"))
ReDim
arr(
1To
n)
AsString
MsgBox (UBound(arr) - LBound(arr) +
1)
'统计a2到a15不为空的单元格
n = Application.WorksheetFunction.CountA(Range(
"A2:A15"))
ReDim
arr(
1To
n)
AsString
MsgBox (UBound(arr) - LBound(arr) +
1)
End
Sub
· 1
· 2
· 3
· 4
· 5
· 6
· 7
· 8
· 9
· 10
· 11
· 12
· 13
这里的n就是动态长度。这里你运行一下就可以看到动态数组的神奇功能了。
如果运行不出来,请如图添加数据:
数组的使用是很频繁的,下面介绍两种常用的使用数组的方法。
首先利用split
'使用split函数创建数组
PublicSub
pss_split()
Dim
arr As Variant
' 利用split创建数组
arr =
Split(
"邓肯 科比 麦迪",
" ")
MsgBox
"arr第二个元素为:"
& arr(
1)
End
Sub
· 1
· 2
· 3
· 4
· 5
· 6
· 7
其次利用Range
' 区域复制
PublicSub
pss_copy()
Dim
arr As Variant
'通过Range对象直接创建数组
arr = Range(
"A1:C3").Value
Range(
"D1:F3").Value = arr
End
Sub
· 1
· 2
· 3
· 4
· 5
· 6
· 7
请大家自行准备数据,也可以利用第六讲的数据来操作利用Range的数组复制