做减法代码示例:
Sub 做减法()
x = Cells(8, 4) //x是变量,替换后可以进行任何计算
Cells(x, 7) = "-" //cells(x,y)函数,x代表行号,y代表列号
Cells(x, 11) = Cells(x, 6) - Cells(x, 8)
End Sub
Sub 做加法()
x = Cells(8, 4)
Cells(x, 7) = "+"
Cells(x, 11) = Cells(x, 6) + Cells(x, 8)
End Sub
计算圆面积和球体体积的示例:
Sub 计算指定半径的圆形的面积和体积()
r = Cells(2, 1)
S = 3.14 * r * r
Cells(2, 2) = S
V = 4 / 3 * 3.14 * r * r * r
Cells(2, 3) = V
End Sub
添加强制声明和常量
强制声明
Option Explicit //必须写在一个模块的第一行,在所有Sub.....End Sub的前面
Sub 计算指定半径的圆形的面积和体积()
Dim r, S, V
Const Pi = 3.1415926 //Const 是常量声明的关键字,一旦声明永远不可修改!
r = Cells(2, 1)
S = Pi * r * r
Cells(2, 2) = S
V = 4 / 3 * Pi * r * r * r
Cells(2, 3) = V
End Sub
循环结构
Sub 计算美元价格()
Dim rate, i
For i = 5 To 21 Step 1
rate = Cells(2, 3)
Cells(i, 3) = Cells(i, 2) / rate
Next i
End Sub
规范代码正确使用Tab键显示从属关系
Sub 计算日元价格()
Dim rate, i
For i = 21 To 5 Step -1
rate = Cells(2, 4)
Cells(i, 4) = Cells(i, 2) * rate
Next i
End Sub
If语句的初步使用
Option Explicit
Sub evaluate()
Dim score
score = (Cells(3, 3) + Cells(4, 3) + Cells(5, 3)) / 3
Cells(6, 3) = score
If score >= 60 Then
Cells(7, 3) = "及格"
Else
Cells(7, 3) = "不及格"
End If
End Sub
嵌套if
Sub evaluate多个分支()
Dim score
score = (Cells(3, 3) + Cells(4, 3) + Cells(5, 3)) / 3
Cells(6, 3) = score
If score > 75 Then
If score > 85 Then
Cells(7, 3) = "A"
Else
Cells(7, 3) = "B"
End If
Else
If score > 60 Then
Cells(7, 3) = "C"
Else
Cells(7, 3) = "D"
End If
End If
End Sub
Elseif多个条件分支判断(else和if之间没有空格,记得写End if)
Sub evaluate_elseif()
Dim score
score = (Cells(3, 3) + Cells(4, 3) + Cells(5, 3)) / 3
Cells(6, 3) = score
If score >= 85 Then
Cells(7, 3) = "A"
ElseIf score >= 75 Then
Cells(7, 3) = "B"
ElseIf score >= 60 Then
Cells(7, 3) = "C"
ElseIf score < 60 Then
Cells(7, 3) = "D"
End If
End Sub
注意:
1、elseif是个整体不能有空格
2、注意条件的逻辑关系,顺序很重要
3、不等于在VBA中是 <>
代码调试
字符串要注意的问题
]一、[endif]必须用双引号括起来,有双引号可以避免字段被误认为是变量
二、[endif]字符串中可以包括常见的特殊字符,如:空格符、换行符等。
三、[endif]空串(“”):没有字符,空格有一个空格字符
四、[endif]字符串中大小写是不同的
五、[endif]字符串连接用&,两边必须要留空格
录制宏
计算机可以根据我们的操作,录制相应的宏,自动生成相应的代码
Option Explicit
Sub 整理会员卡()
Dim i
For i = 27 To 2 Step -1
//在执行删除操作时,顺序操作会导致数据整行前移导致个别行数据未经处理就前移,倒序操作可以有效的应对这个问题
If Cells(i, 3) = "注销" Then
Rows(i & ":" & i).Select
Selection.Delete Shift:=xlUp
ElseIf Cells(i, 4) < 0 Then
Cells(i, 4).Select
With Selection.Font
.Color = -16776961
. TintAndShade = 0
End With
End If
Next i
End Sub
DO While……LOOP
Option Explicit
Sub Aveage()
Dim i, total, count
i = 2
total = 0
count = 0
Do While Cells(i, 1) <> "" Or Cells(i, 2) <> ""
total = total + Cells(i, 2)
count = count + 1
i = i + 1 //注意循环变化条件
Loop
If count > 0 Then
Cells(20, 1) = total / count
End If
End Sub
While……Wend
Option Explicit
Sub mark_Red()
Dim i
i = 2
While Cells(i, 2) <> ""
If Cells(i, 2) < 300 Then
Cells(i, 2).Select
With Selection.Font
.Color = -16776961
.TintAndShade = 0
End With
End If
i = i + 1
Wend
End Sub
面向对象的理解
简单讲就是把我们在编程时所涉及的元素,按照不同的属性进行分类,然后抽象出一个共有的模板,这个模板就是类,然后按照我们的实际需要创建一个一个具体的对象,类似于我们做PPT的时候用模板做PPT就可以比从头做PPT快的多。
Excle中的类:
Application 应用类,代表正在运行的Excel系统本身
WorkBook 工作簿,代表一个打开的Excle文件
Worksheet 代表一张工作表
Range 代表一个或若干个单元格组成的内容区域
Sub sheet()
Dim s1 As Worksheet //在VBA中给对象赋值时必须加上set,不然就会报错
Set s1 = Worksheets(2)
s1.Cells(8, 6) = 500
End Sub
添加工作表并将设置指定单元格的值
Option Explicit
Sub sheet_add()
Dim w1 As Worksheet
Set w1 = Worksheets.Add
w1.Cells(8, 8) = 888
End Sub
多表求和
Option Explicit
Sub sum_grade()
Dim i, j, sum
Dim w1 As Worksheet
For i = 1 To Worksheets.Count
Set w1 = Worksheets(i)
sum = 0
For j = 2 To 6 Step 1
sum = sum + w1.Cells(j, 2) //这里如果没有对象归属就会只计算一张表
Next j
w1.Cells(2, 3) = sum
Next i
End Sub
多表信息提取
Sub extra_grade()
Dim w1 As Worksheet
Dim w2 As Worksheet
Dim i
i = 1
For i = 1 To 3
Set w1 = Worksheets(i)
Set w2 = Worksheets(4)
w2.Cells(i, 1) = w1.Cells(1, 2)
w2.Cells(i, 2) = w1.Cells(2, 3)
Next i
End Sub
注意:
1、当表移动位置时,用位置确定表很容易出错,可以使用表的名称确定,如Set w2 = Worksheets("总分榜"),用双引号引起
2、子过程无法返回结果,函数可以返回结果。
函数
1、过程的一种,在执行结束后能将运行结果返回给调用者。
2、不同过程中定义的变量,即使同名也互相无关
Option Explicit
Sub 暴力分类() //主函数
Dim i, score, level
i = 3
Do While Cells(i, 2) <> ""
score = Cells(i, 2)
level = 客户分类(score)
//主函数负责传递调用函数所需的参数,同时接收调用 函数计算的结果
Cells(i, 3) = level
i = i + 1
Loop
End Sub
Function客户分类(s) //被调用的函数
Dim score, level
score = s
If score < 30 Then
level = "温柔型"
ElseIf score < 60 Then
level = "冲动型"
ElseIf score < 90 Then
level = "暴躁型"
ElseIf score < 100 Then
level = "狂暴型"
End If
客户分类= level //将返回值返回给主函数
End Function
参数传递的演示示例
Sub 参数演示()
Dim a, b, j
a = Cells(14, 2)
b = Cells(14, 3)
j = 求积(5, 3)
Cells(14, 4) = j
End Sub
Function 求积(w1, w2)
Dim j
j = w1 * w2
求积= j
End Function
系统函数
Option Explicit
Sub 字符串函数示例01()
Dim a, s
s = " 大家好abc "
a = Len(s)
MsgBox a
End Sub
Sub 字符串函数示例02()
Dim a, s
s = " 大家好abc "
a = Trim(s) '删除两边空格的函数
MsgBox a
End Sub
Sub 字符串函数示例03()
Dim a, s
s = " 大家好abc "
a = Replace(s, " ", "") '替换空格的函数
MsgBox a
End Sub
Sub 字符串函数示例04()
Dim a, s
s = " 大家好abc "
a = Mid(s, 5, 4) '从中间抽子串
MsgBox a
End Sub
打开工作簿
Option Explicit
Sub 打开指定工作簿()
Dim wb As Workbook '定义一个workbook类对象的变量wb
Set wb = Workbooks.Open("C:\Users\Jovan_Jiang\Desktop\绩效评价数据表\海西州绩效评价报告生成数据表.xlsx")
wb.Worksheets(1).Cells(8, 2) = 8888
End Sub
工作簿相关的函数
Range对象的使用
Sub Range_对象示例()
Dim r As Range
Set r = Range("A3") 'A3单元格
Set r = Range("A3:B7")
Set r = Range("A3:B7,D6,A2:F4") '两个范围+D6单元格
Set r = Range(Cells(2, 3), Cells(8, 8)) '以两个单元格为对角定点,形成的范围
r.Value = 5 //所有r的范围内的单元格均被赋值为5
r.ClearContents //清除单元格的所有内容
r.Font.Size = 25
r.Font.Color = RGB(255, 0, 0) 'RGB编码颜色
r.Font.Bold = True '是否加粗
r.Font.Italic = True '是否斜体
r.Interior.Color = RGB(255, 255, 0) '单元格内部高亮显示为黄色
r.ClearFormats '清除所有格式
End Sub
合并和拆分单元格
With......Endwith可以省略重复的前缀
Sub Range_对象示例()
Dim r As Range
Set r = Range("C3:F8")
r.Value = 100
With r.Font
Color = RGB(255, 0, 0) 'RGB编码颜色
.Bold = True '是否加粗
. Italic = True '是否斜体
.Color = RGB(255, 255, 255) '单元格内部高亮显示为黄色
End With
End Sub
Application
Sub 活动工作簿示例()
Dim w2 As Workbook, w1 As Workbook
Set w1 = Application.ActiveWorkbook //当前的工作簿
Set w2 = Workbooks.Add //新增的工作簿
w2.Worksheets(1).Cells(5, 5) = "我是新打开的工作簿"
w1.Worksheets(1).Cells(10, 3) = "我是之前的工作簿"
End Sub
用application快速求最值
传统的方法
Sub application求最值()
Dim r As Range, m As Integer
m = 0
For Each r In Range("B2:D7") //可以学习一下for each 循环
If r.Value > m Then
m = r.Value
End If
Next r
Cells(10, 4) = m
End Sub
采用Application的方法
Sub application求最值02()
Dim r As Range, m As Integer
m = Application.WorksheetFunction.Max(Range("B2,B7"))
//在VBA中写公式的时候注意
Cells(10, 4) = m
End Sub
ApplicationDisPlayAlerts的用法
Sub 活动工作簿示例()
Dim w2 As Workbook, w1 As Workbook
Set w1 = Application.ActiveWorkbook
Set w2 = Workbooks.Add
w2.Worksheets(1).Cells(5, 5) = "我是新打开的工作簿"
w1.Worksheets(1).Cells(10, 3) = "我是之前的工作簿"
Application.DisplayAlerts = False
'将该文件保存在本工作簿所在文件夹下
w2.SaveAs ("数据")
w2.clese
End Sub
退出方法
规则明确,机械重复的活动均可以用VBA等代码替代
总结
VBA的两大内容 程序设计
变量常量
循环
1、for......next 适用条件:知道循环终止条件
2、Do while......Loop 适用条件:不知道循环终止条件(切记循环变化条件i=i+1)
3、For each in 集合......next (集合中已经包含元素的个数)
判断
If 条件语句 then //切记elseif不能有空格
Elseif ...
Elseif...
End if
常用的逻辑词And、or、not
字符串
过程
Sub......end sub
//子过程(没有返回值,但是可以让代码更清晰)
Function......end function
//函数(有返回值,有参数,还可以当公式用很方便)
VBA的两大内容 对象结构
类 对象 方法 属性
编程习惯和辅助工具
全民一起VBA基础篇(Excel数据处理)杨洋老师授课
https://study.163.com/course/courseMain.htm?courseId=1003088001