Excel-宏、VBA

4 篇文章 1 订阅

1 什么是VBA

VBA是一种编程语言,它依托于Office软件,不能独立运行,通过VBA可以实现各种Office软件操作的自动化。通俗易懂的来说就是在Excel中想实现什么功能,就可以通过VBA语言编写的程序区实现。

2 宏

2.1 打开Excel的开发工具功能

在这里插入图片描述

2.2 初级宏
  • 给成绩不及格的单元格标红
    在这里插入图片描述
  1. 录制宏:开发工具-录制宏-添加宏名“不及格的成绩”-快捷键(可以设置快捷键,这里没有设置)-保存在(一般选择当前工作簿)-说明(可以添加这个宏的说明信息)
    在这里插入图片描述
  2. 录制宏开始,所有的操作都会被记录
    点击一个空白单元格-条件格式-突出显示-小于
    在这里插入图片描述
    设定小于60分的用浅红色填充
    在这里插入图片描述
  3. 停止录制红
  4. 选中需要筛选不及格成绩的列-点击“宏”
    在这里插入图片描述
  5. 结果
    在这里插入图片描述
2.3 使用相对引用
  • 给A列的单元个标红,并且每执行一次,选中的单元格下移一次
  1. 选中A1单元格-点击“使用相对引用”-录制宏
    在这里插入图片描述
  2. 将A1单元格的改为红色文本-选中A2单元格
    因为宏会记录鼠标的所有操作,所以如果想更改一个单元格后让选中的单元格下移一个,这一步就很关键
    在这里插入图片描述
  3. 执行宏
    在这里插入图片描述
  4. 执行结果:每标红一次,光标下移一行
    在这里插入图片描述
2.4 制作工资条
  • 源数据在这里插入图片描述
  • 目标数据
    在这里插入图片描述
    1.录制宏:
    选中A1单元格-使用相对引用-录制宏-宏名“制作工资条”
    在这里插入图片描述
    2.宏的内容
    (1)选中第二和第三行-右键-插入-活动单元格下移

在这里插入图片描述
(2)复制第一行工资条列头至第四行
在这里插入图片描述
(3)选中第三行-右键-设置单元格格式-边框-取消左右竖线
在这里插入图片描述
(4)将鼠标选中A4单元格-停止录制-取消使用相对引用
在这里插入图片描述
3. 执行
选中A1单元格-制作工资条
在这里插入图片描述

2.5 添加表单控件

在这里插入图片描述
指定-制作工资条
在这里插入图片描述
这样,点击按钮就会执行宏
在这里插入图片描述
但是这样还是点击一次,生成一行,如果想一键生成怎么办
点击Visual Basic
在这里插入图片描述
添加循环

在这里插入图片描述
一键生成
在这里插入图片描述

3 VBA

3.1 VBA编码语法
  • VBA的代码的开始和结束

Sub 代码名称()
代码内容
End Sub

3.2 变量

所谓变量就是内存开辟出来的用于存储数据的存储单元

3.2.1 定义变量

方法1:dim 变量名 as 数据类型
方法2:dim 变量名 as 数据类型,变量名 as 数据类型
方法3:dim 变量名,变量名 as 数据类型 ()
方法4:dim 变量名+数据类型符

Sub 变量测试()

Dim i As Integer
Dim i1 As Integer, str As String
Dim i2, i3 As Integer
Dim i4%

End Sub
3.2.2 变量名的命名规则
  • 由字母、数字、下划线以及汉字构成
  • 只能以字母或汉字开头,不可以是数字或者下划线开头
  • 长度不可以超过255个字符
  • 不可以使用VBA中的关键字
  • 见名知意
  • 不建议使用汉字
  • 变量名的后面可以添加一个符号,表示该变量盛装的数据的类型,常用符号:%、&、#、$、!

注意

  1. 变量名字不要重复
  2. VBA中变量可以不声明就使用,但是不建议,如果不声明就使用,那么该变量里面可以盛装任意类型的数据
3.2.3 变量的赋值
  • 格式1:变量名 = 值
  • 格式2:如果变量要盛装的是对象,如工作表,单元格,可以使用如下格式set 变量名 = 对象,如
    1.第一步:定义变量,存储对象:Dim 变量名 As WorkSheet
    2.第二步:为变量赋值一个工作表(被激活的工作表):set sht = ActiveSheet
  • 注意1:如果要将数据表对象赋值给一个变量,那么也可以使用如下格式
    1.set 变量名 = Sheets(数据表的编号)
    2.set 变量名 = Sheets(数据表的名称)
  • 注意2:如果标量声明但是没有被赋值,那么默认情况下:
    1.整数默认值为0
    2.字符串为空串
    3.布尔值为false
3.3 数据类型
数据类型类型关键字类型符前缀存储空间取值范围
字节型ByteByt1字节
整型Integer%Int2字节-32768~32767
长整型Long&Lng4字节-2147483648~2147483647
单精度型SingleSng4字节负数-3.402823E38~-1.401298E-45正数1.401298E-45~3.402823E38
双精度型Double#Dbl8字节负数-1.79769313486232E308~-4.9406545841247E-324正数4.9406545841247E-324~1.79769313486232E308
货币型Currency@Cur8字节-922337203685477.5808~922337203685477.5808
字符串型String$Str暂不定定长字符串可包含0个字符~216个字符,变长字符串可包含0个字符~331个字符
布尔型BooleanBln2字节True或False
日期型DateDtm8字节100年1月1日~9999年12月31日
3.4 常量

所谓常量就是程序运行过程中值不可以改变的量,简单说常量就是程序中的具体数值

注意事项如下

  1. 字符串:VBA中的字符串需要使用双引号包起来
  2. 日期/时间类型:
  • 日期型数据用8个字节来存储,日期数据要用#号括起来
  • 允许用各种表示日期和时间的格式
  • 日期可用“/”、“,”、“-”分隔,可以是年、月、日,也可以是月、日、年的顺序。时间必须用“:”分隔,顺序是:时、分、秒。
#2009-08-11 10:25:00 PM#
#03/23/2019#
#03-25-2008 20:30:00#

3)布尔型数据(Boolean):

  • 布尔型数据只有两个值:TRUE和False,用2个字节存储
  • 布尔型数据转化为数值型时,False为0,True为-1
  • 其他数据类型转换为逻辑型时,0转换为False,其他值均转换为True
3.5 运算符
3.5.1 算术操作符
  • + : 两个操作数相加
  • -: 两个操作数相减
  • *: 两个操作数相乘
  • / : 两个操作数相除
  • mod: 模运算符,整数除法后的余数,结果的符号和被除数相同
  • ^ : 指数运算符
3.5.2 比较运算符
  • = : 检查两个操作数的值是否相等。如果是,那么条件是真。
  • <> : 检查两个操作数的值是否不相等。如果值不相等,则条件为真。
  • > : 检查左操作数的值是否大于右操作数的值。如果是,那么条件是真。
  • < : 检查左操作数的值是否小于右操作数的值。如果是,那么条件是真。
  • >= : 检查左操作数的值是否大于或等于右操作数的值。 如果是,那么条件是真。
  • <= : 检查左操作数的值是否小于或等于右操作数的值。如果是,那么条件是真。
3.5.3 逻辑运算符
  • AND : 两个条件都为真,则表达式为真。(只要有一个操作数是假结果就是假)
    1.真 and 真 = 真
    2.真 and 假 = 假
    3.假 and 真 = 假
    4.假 and 假 = 假
  • OR : 如果两个条件中的任何一个为真,则条件为真。
    1.真 or 真 = 真
    2.真 or 假 = 真
    3.假 or 真 = 真
    4.假 or 假 = 假
  • NOT : 用于反转其操作数的逻辑状态。 如果条件成立,那么逻辑非运算符结果是条件不成立。
3.5.4 连接操作符
  • & : 连接两个值
    示例1:1 & 2 = 12
    示例2:“1” & “2” = 12
  • + : 将两个值添加为变量,其值是数字,注意如果+两侧的操作数都是字符类型的字符串,如”a”、”b”,那么+就具有连接功能,但是如果操作数中有数值类型的字符串,那么会有转型效果,即将字符串转换为数值在进行运算(注意操作数中有且只有一个数值构成的字符串,即如”1”+2,如果都是字符串,如”1”+”2”,那么也是直接拼接,结果为12)
3.5.5 运算符优先级

算术运算符>连接运算符>关系运算符>逻辑运算符

3.6 MsgBox
Sub Text()
Dim i%
Dim bool As Boolean
bool = True
MsgBox bool + 1, vbOKCancel, "bool+1的值"
'      显示的内容,显示的按钮,标题
End Sub

在这里插入图片描述

Sub Text()
Dim i%
Dim bool As Boolean
bool = True
'MsgBox bool + 1, vbOKCancel, "bool+1的值"
'      显示的内容,显示的按钮,标题
i = 2 + 9
MsgBox (i)
End Sub

如果MsgBox里只填显示的内容,标题时默认的,按钮时默认的只显示“确定”
在这里插入图片描述

3.7 获取要操作的数据表
  • 格式1:
  1. 声明变量:dim 变量名 as Worksheet
  2. 为变量赋值:set 变量名 = Sheets(数据表编号),注意一个工作簿中的数据表时从1开始编号的
  • 格式2
  1. 声明变量:dim 变量名 as Worksheet
  2. 为变量赋值:set 变量名 = Sheets(数据表名称),注意一个工作簿中的数据表时从1开始编号的
  • 格式
  1. 声明变量:dim 变量名 as Worksheet
  2. 为变量赋值:set 变量名 = Activesheet
3.8 单元格的基本操作
  • 获取单元格的值
  1. Sheets(表名/表的编号).range(“单元格名称”)
  2. Sheets(表名/表的编号).[单元格名称]
  3. Sheets(表名/表的编号).Cells(行号,列号)
  • 为单元格赋值
  1. Sheets(表名/表的编号).range(“单元格名称”).value = 值
  2. Sheets(表名/表的编号).[单元格名称] .value = 值
  3. Sheets(表名/表的编号).Cells(行号,列号) .value = 值
  • 为单元格设置颜色:Sheets(表名/表的编号).range(“单元格名称”).interior.ColorIndex = 数值,数值范围为1-56
  • 复制单元格中的内容:Sheets(表名/表的编号).range(“单元格名称”).copy Range(要放置的位置)
  • 剪切单元格中的内容:Sheets(表名/表的编号).range(“单元格名称”).cut Range(要放置的位置)
3.9 三大结构
3.9.1 顺序结构

顺序结构就是指程序自上而下执行,不经任何跳转

3.9.2 选择结构

程序在执行前会判断条件是否成立,如果条件成立则执行某个语句段,如果条件不成立,可以执行其它的语句段
包含两大语句if、select
(一) if语句

  • 单分支:所谓单分支即只考虑条件成立时的情况
Sub test1()
Dim i%
i = 5
If i > 0 Then
    MsgBox ("i是正数")
End If
End Sub

在这里插入图片描述

  • 双分支
Sub test1()
Dim i%
i = -5
If i > 0 Then
    MsgBox ("i是正数")
Else
    MsgBox ("i是负数")
End If
End Sub

在这里插入图片描述

  • 多分支:注意else可以省略
Sub test1()
Dim i%
i = 50
If i > 90 Then
    MsgBox ("A")
ElseIf i > 70 Then
    MsgBox ("B")
ElseIf i > 60 Then
    MsgBox ("C")
Else
    MsgBox ("D")
End If
End Sub

在这里插入图片描述

  • select语句
Sub test1()
Dim i%
i = 1
Select Case i
    Case 1 To 5
        MsgBox ("weekday")
    Case 6, 7
        MsgBox ("weekend")
    Case Else
        MsgBox ("error!!!!!")
End Select
End Sub

在这里插入图片描述
Case表达式可以是下列4种格式之一:

  • 单一数值,如Case2
  • 一行并列的数值,数值之间用逗号隔开。如Case 5,6,7
  • 用关键字To分隔开两个数之或表达式之间的范围。如Case 1 To 10
  • 用关键字ls连接关系运算符。如=、<>、<、<=、>、>=,后面跟变量或具体的值,ls>=15

Case语句是依次测试的,并执行第一个符合Case条件的相关的程序代码,即使再有其它符合条件的分支也不会再执行。如果没有找到复合条件的,并且有Case Else语句,就会执行该语句后面的程序代码。

3.9.3 循环结构
  • 所谓循环结构就是指能够重复执行的代码段
  • 格式
    for 变量=起始值 to 终止值 step 步长值
    循环体
    next 变量
  • 注意事项
  1. step可以省略,如果省略,默认为步长为1
  2. next后面的变量也可以省略,但是不建议,next的作用就是表示对next后面的变量做修正
  • 常用思想
  1. 累加算法:sum sum = 0 sum = sum + i
  2. 累乘算法:p p = 1 p = p * i
  3. 计数器:count count = 0 count = count + 1
1.打印1-10到a1-a10单元格
Sub text()
Dim i%
For i = 1 To 10
    Sheets("sheet2").Range("a" & i).Value = i
Next i
End Sub


2.打印1-10间的偶数
Sub text()
Dim i%
For i = 1 To 10
	if (i mod 2)=0 then
    	Sheets("sheet2").Range("b" & i/2).Value = i
    end if
Next i
End Sub



3.打印1-100间能被3和7同时整除的数
Sub text()
Dim i%
For i = 1 To 100
	if (i mod 3)=0 and (i mod 7)=0 then
    	msgbox(i)
    end if
Next i
End Sub



4.打印1-10的和
Sub text()
Dim i%
Dim s%
s = 0
For i = 1 To 10
	s = s + i
Next i
msgbox(s)
End Sub



5.打印1-10间偶数的和
Sub 打印1-10间偶数的和()
Dim i%
Dim s%
s = 0
For i = 1 To 10
    If (i Mod 2) = 0 Then
        s = s + i
    End If
Next i
MsgBox (s)
End Sub



6.打印5! = 5*4*3*2*1
Sub text()
Dim i%
Dim s%
s = 1
For i = 1 To 5
    s = s * i
Next i
MsgBox (s)
End Sub



7.计算1-10间偶数的个数
Sub text()
Dim i%
Dim c%
c = 0
For i = 1 To 10
    If (i Mod 2) = 0 Then
        c = c + 1
    End If
Next i
MsgBox (c)
End Sub


8.2-99之间能整除3的数字之和
Sub text()
Dim i%
Dim a%
a = 0
For i = 2 To 99
    If (i Mod 3) = 0 Then
        a = a + i
    End If
Next i
MsgBox (a)
End Sub


9.求1-10偶数的平均分
Sub text()
Dim i%
Dim c%
c = 0
s = 0
For i = 1 To 10
    If (i Mod 2) = 0 Then
        s = s + i
        c = c + 1
    End If
Next i
MsgBox (s / c)
End Sub



10.计算1*1 + 2*2 + 3*3 +4*4 + 5*5 +...+ 10*10的和
Sub text()
Dim i%
Dim j%
Dim s%
s = 0
For i = 1 To 10
    j = i
    s = s + i * j
Next i
MsgBox (s)
End Sub



11.实现九九乘法表
sub text()
For a = 1 To 9
    For b = 1 To 9
        If a >= b Then
        Sheets("Sheet2").Cells(a, b).Value = (a & "*" & b & "=" & a * b)
        End If
    Next b
Next a
End Sub

在这里插入图片描述

3.10 数组

数组就是用来存储大量的数据的存储空间,数组在存储数据时是有序存储。数组中的每一个值被称为数组元素,每一个数组元素都有一个编号(即索引,也可以称为下标),从0开始到数组长度-1为止

3.10.1 数组的创建
  1. 格式1:Dim 数组名(上界) as 数组中存储的数据的类型,示例:Dim arr(4) as Integer
    arr(4)里有5个数据,即a[0],a[1],…,a[4]
  2. 格式2:数组名 = Array(值1,值2,值3…)
3.10.2 数组元素的操作
  1. 赋值:数组名(下标) = 值
  2. 修改:数组名(下标) = 值
  3. 获取值:数组名(下标)
3.10.3 利用循环对数组元素进行赋值和遍历
Sub text()
'数组定义的第一种方法
'dim 数组名(数组长度) as 数据类型
'数组内的元素的数据类型必须相同
'Dim arr(3) As Integer
'Dim i%
'arr(0) = 1
'arr(1) = 2
'arr(2) = 3
'For i = 0 To 2
'    MsgBox (arr(i))
'Next i

'第二种定义方式
Dim i%
arr = Array(1, 2, 3)
'修改数组元素
arr(0) = 5
For i = 0 To 2
    MsgBox (arr(i))
Next i
End Sub
Sub text()
Dim arr(10) As Integer
Dim i%
'为数组赋值,将A1-A10单元格种的值赋给数组
For i = 0 To 9
    arr(i) = Cells(i + 1, 1)
Next i
'利用循环输出数组里面的值
'遍历数组
For i = 0 To 9
    MsgBox (arr(i))
Next i
End Sub
3.10.4 数组常用的方法
  • lbound
  1. 格式:Lbound(数组名)
  2. 作用:返回数组的最小下标
  • Ubound
  1. 格式:Ubound(数组名)
  2. 作用:返回数组的最大下标,即上界
Sub text()
Dim i%
arr = Array(1, 2, 4, 5, 8)
For i = LBound(arr) To UBound(arr)
    MsgBox (arr(i))
Next i
End Sub
3.10.5 多维数组

定义格式:Dim 数组名(行数,列数) as 数据类型

  • 二维数组元素的操作

格式:数组名(下标1,下标2),注意:下标1表示行数,下标2表示列数,无论行还是列都是从0开始,到长度-1结束

Sub text()
'二维数组的定义方式
'dim 数组名(数组下标1,数组下标2) as 数据类型
Dim arr(3, 3) As Integer
Dim i%, j%
arr(0, 0) = 1
arr(1, 0) = 2
arr(2, 0) = 3
arr(0, 1) = 4
arr(1, 1) = 5
arr(2, 1) = 6
arr(0, 2) = 6
arr(1, 2) = 7
arr(2, 2) = 8
For i = 0 To 2
    For j = 0 To 2
        MsgBox (arr(i, j))
    Next j
Next i
End Sub

在这里插入图片描述

  • 打印单元格里的数组的内容
Sub text1()
    Dim arr(3, 3), i, j As Integer
    For i = 0 To 2
        For j = 0 To 2
            arr(i, j) = Cells((i + 1), (j + 1))
        Next j
    Next i
    
    For i = 0 To 2
        For j = 0 To 2
            MsgBox (arr(i, j))
        Next j
    Next i
End Sub
  • 打印对角线
    在这里插入图片描述
Sub text2()
    Dim arr(3, 3), i, j As Integer
    For i = 0 To 2
        For j = 0 To 2
            arr(i, j) = Cells((i + 1), (j + 1))
        Next j
    Next i
    
    For i = 0 To 2
        MsgBox (arr(i, i))
    Next i
End Sub
3.11 函数
  • 什么是函数:具有特定功能的模块
  • 函数的分类:无参函数有返回值函数、有参函数有返回值函数
  • 无参函数定义格式:
    Function 函数名() as 数据类型
    函数体
    函数名 = 函数运行后的结果
    end Function
  • 无参函数的调用:函数名(),调用语句可以写在excel表格内部,也可以在sub中调用
Function fn()
    fn = "hello world"
End Function

Sub test1()
'调用fn种的内容
    MsgBox (fn())
End Sub
  • 有参函数的定义格式:
    function 函数名(形参1 as 数据类型,形参2 as 数据类型….) as 数据类型
    函数体
    函数名 = 结果
    End Function
  • 有参函数的调用:函数名(实参1,实参2…),调用语句可以写在excel表格内部,也可以在sub中调用
Function fn() As String
    fn = "hello world"
End Function

Sub test1()
'调用fn中的内容
    MsgBox (fn())
End Sub
  • 什么是实参和形参
  1. 形参:定义函数时所使用的参数被称为形参,形参的本质就是用来存储函数调用时传递过来的具体数据,简答说形参就是变量,定义格式:(形参名1 as 数据类型,形参名2 as 数据类型…. )

  2. 实参:调用函数时传递过来的具体的数据被称为实参,格式:函数名(实参1,实参2…)

'                  形参
Function fn(num1, num2 As Integer) As Integer
    Dim sum%
    sum = num1 + num2
    fn = sum
End Function
Sub getSum()
'                  实参
    MsgBox (fn(1, 2))
End Sub

在sheet中调用
在这里插入图片描述
注意:需要在Visual Basic中插入一个模块,将函数写在该模块中,就可以在单元格中直接调用自己写好的函数啦

  • 形参和实参的关系
  1. 实参传递给形参,只能是单向传递
  2. 实参在传递时和形参是一一对应的关系
  • 计算单元格A1-A10的和和平均数
    在这里插入图片描述
Function fn(arr)
    Dim i%, sum%, max%, min%, avg As Double
    sum = 0
    For i = 0 To UBound(arr)
        sum = arr(i) + sum
    Next i
    
    avg = sum / (UBound(arr) + 1)
    
    max = arr(0)
    For i = 0 To UBound(arr)
        If max < arr(i) Then
            max = arr(i)
        End If
    Next i
    
    min = arr(0)
    For i = 0 To UBound(arr)
        If min > arr(i) Then
            min = arr(i)
        End If
    Next i
    
    fn = "sum is :" & sum & "," & "avg is " & avg & "," & "max is :" & max & "," & "min is :" & min
    
End Function
Sub test2()
Dim my_arr(9), i As Integer
For i = 0 To UBound(my_arr)
    my_arr(i) = Cells(i + 1, 1)
Next i
MsgBox (fn(my_arr))
End Sub

在这里插入图片描述

  • 11
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值