VBA基础教程Day01 : vba基础语法
1.1、宏在工作中的运用
1、宏的定义(macro)
一组可以让自动执行的代码(VBA)
2、宏的运用时机
重复执行相同的操作。可以考虑用宏。
优点:重复执行相同操作,提高工作效率
缺点:不够智能化,无法交互工作,代码冗余
解决方案:VBA
3、宏在excel中的地位
虽然宏看起来不够灵活。但对于学习VBA编程却非常重要。
- 提高代码编写效率
- 帮助学习VBA知识
1.2、VBE窗口介绍
1、VBE就是VBA的编辑窗口- 按ALT+F11快捷键;
- 开发工具-Visual Basic
- 代码帮助(F1)
2、VBE窗口代码的编写规则
- 代码换行 (下划线+空格+换行)
1.3、对象:现实生活所谓的对象,是真实存在物体。
在excel中就指的是:工作簿,工作表,单元格,图表,透视表之类的
1、工作簿(Workbooks)
Workbooks(N)第N个工作簿
Workbooks ("工作簿名")
ActiveWorkbook 活动工作簿
ThisWorkBook '代码所在工作簿
2、工作表(Worksheets)
Sheets(N) 第N个工作表
Sheets("工作表名")
SheetN 第N个工作表
ActiveSheet 活动工作表
worksheets 与 Sheets的区别
3、单元格(cells)
Range ("单元格地址")
Cells(行号,列号)
[A1]单元格简写
Activecell 活动单元格
Selection 当前被选取的区域
1.4、VBA属性:指对象所具有的特性
1.5、方法:实际上就是对对象的操作,它是一种动作,一种行为。
如果单元格区域前没有写工作表名,则默认为活动工作表
1.6、常量和变量
1、常量:常量是定义了之后就不做变化了。
常量定义格式:Const 常量名= 常量表达式
2、变量:在定义之后还能再次赋值
变量定义格式:Dim 变量 As 变量类型
3、注意事项
- VBA允许使用未定义的变量,默认是变体变量(Variant)
- 变量的强制声明:Option Explicit
4、变量名的命名规则
- 以字母开头
- 不能用保留字
- 不超过 255 个字符。
- 同一范围内必须是唯一
1.7、数据类型
这只是VB中一个String的的不同用法在内存中的表示。VB中字符串可以是“定长”和“不定长”二种。
“定长”是Dim s As String * 2 (那么就是字符串的长度为2),字符串长度不可变化。
变长”直接就是:Dim s As String。串的长度直接是字符的个数(最多可以定义达到2G个字符的长度),且在这个范围之内,字符串长度可以随时发生变化。
1.8、数据类型
VBA中的常见数据类型:
| 类型 | 注释 | 简写 |
占用内存 |
| Integer | 整型 | % | 2Byte |
| Single | 单精度 | ! | 4Byte |
| Double | 双精度 | # | 8Byte |
| Long | 长整型 | & | 4Byte |
| String | 字符型 | $ | 定长或变长 |
| Currency | 货币型 | @ | 8Byte |
1.9、IF语句
语法结构:
If Then ElseIf ElseIf Else End If
1.10、Select Case 语句
语法结构:
Select Case i Case Case Else End Select
1.11、do ...loop 语句
do ...loop 循环语句,直到满足某个条件
Sub 基本示例() Dim a% Do a = a + 1 If a > 10 Then MsgBox a & "终于大于10" Exit Do End If Loop End Sub
1.12、do While ...loop 语句
Sub 循环语句while()
Dim rs As Integer
rs = 2
Do While Cells(rs, 2) <> "" '当单元格不等于空时,则循环
If Cells(rs, 2) >= 90 Then Cells(rs, 3) = "√"
rs = rs + 1
Loop '循环
End Sub
1.13、do until...loop 语句
Sub 循环语句DOLOOP2()
Dim rs As Integer
rs = 2
Do Until Cells(rs, 2) = "" '直到单元格为空为止,才结束
If Cells(rs, 2) >= 90 Then Cells(rs, 3) = "√"
rs = rs + 1
Loop '循环
End Sub
实例-隔行填色
Sub 隔行填色()
Dim rs As Integer
rs = 2
Do Until Sheet2.Range("a" & rs) = ""
Sheet2.Range("a" & rs & ":g" & rs).Interior.ColorIndex = 7
rs = rs + 2
Loop
End Sub
while与until不但可以放在DO后面,也可以放在LOOP后面
事实上有时在循环的最后一行进行判断,更具有意义
1.14、for each..next 语句 处理对象集合
当需要处理集合成员时,一般会用for each..next,实际上就是处理对象
Sub foreachnext循环1()
Dim rng As Range, n!
For Each rng In Sheet1.Range("a2:a10") '取a2:a10中的每个单元格
If rng = "A1" Then rng.Interior.ColorIndex = 3
Next
End Sub
Sub foreachnext循环2()
Dim wsh As Worksheet, n As Byte, m As String
For Each wsh In Worksheets '取当前工作表集合中的每个成员
n = n + 1
Sheet1.Cells(n, 3) = wsh.Name
Next
End Sub
1.15、FOR...NEXT语句
FOR...NEXT也是循环语句,与之前的DO...LOOP不同之处在于,for next有一个内置计数器
Sub fornext循环2()
Dim i!, j!
For i = 100 To 1 Step -2
j = j + i
Next
MsgBox j
End Sub
Sub fornext循环()
Dim rng!
For rng = 2 To 16
Sheet1.Cells(rng, 4) = Sheet1.Cells(rng, 2) * Sheet1.Cells(rng, 3)
Next
End Sub
Sub 九九乘法表制作()
Dim a!, b!
For a = 1 To 9
For b = 1 To 9
If b > a Then
Sheet2.Cells(a, b) = ""
Else
Sheet2.Cells(a, b) = a & "×" & b & "=" & a * b
End If
Next
Next
End Sub
1.16、Exit和End语句
exit是退出当前语句
1.Exit Do
2.Exit For
3.Exit Function
4.Exit Sub
Sub exitfor退出()
Dim i!
For i = 2 To 7
If Sheet1.Cells(i, 1) = "田七" Then
Exit For
End If
Next i
MsgBox "第一个(田七)的位置在" & i & "行"
End Sub
end结束一个过程或块。
End
End Function
End If
End Select
End Sub
Sub aa() i = 1 End Exit Sub j = 1 End Sub
1.17、跳转语句
GoTo line无条件地转移到过程中指定的行。
注意太多的 GoTo 语句,会使程序代码不容易阅读及调试。
尽可能使用结构化控制语句(Do...Loop、For...Next、If...Then...Else、Select Case)。
Sub gotoline()
Dim str$
line:
str = InputBox("请录入用户名!")
If str <> "admin" Then GoTo line
End Sub
go to...return
Sub gotoreturn()
Dim i!
For i = 2 To 10
If Sheet1.Range("a" & i) > 1 / 3 Then GoSub 100
Next i
Exit Sub
100:
Sheet1.Range("b" & i) = "迟到"
Return
End Sub
1.18、错误分支语句
Sub onerrorresume()
Dim i!
On Error Resume Next '当错误的时候继续执行下去
For i = 2 To 8
Cells(i, 4) = Cells(i, 3) + Cells(i, 2)
Next i
End Sub
On Error GoTo当错误的时候去哪儿?
Sub onerrorgoto()
On Error GoTo 100
For i = 2 To 8
k = Sheet1.Cells(i, 2) + Sheet1.Cells(i, 3)
Next i
100:
MsgBox "对不起,错误发生在第" & i & "行"
End Sub
1.19、With语句
with 语句 ,当对某个对象执行一系列的语句时,不用重复指出对象的名称。
Sub with语句1()
a = Range("a1").Address
b = Range("a1").Parent.Name
Range("a1") = "1234"
End Sub
Sub with语句2()
With Range("a1")
a = .Address
b = .Parent.Name
.Value = "1234"
End With
End Sub
Sub with嵌套1()
Range("a1").Value = "Who am i ?"
Range("a1").Parent.Name = "Hello World"
Range("a1").Font.Size = 20
Range("a1").Font.Bold = True
End Sub
Sub with嵌套2()
With Range("a1")
.Value = "Who am i ?"
.Parent.Name = "Hello World"
With .Font
.Size = 20
.Bold = True
End With
End With
End Sub
1.20、Vba与公式
在VBA中也可以像在工作中一样录入公式
Sub VBA中的做法()
Dim i%
For i = 1 To 10
Range("c" & i) = Range("a" & i) + Range("b" & i)
Next
End Sub
Sub 普通公式() Sheet1.Cells(1, 3) = "=a1+b1" End Sub
Sub 批量计算()
Dim i As Integer
For i = 1 To 10
Sheet1.Cells(i, 4) = "=a" & i & "+b" & i
Next i
End Sub
Sub 数组公式()
Range("e1:e10").FormulaArray = "=a1:a10+b1:b10"
End Sub
1.21、Vba与函数
Sub 带工作表函数的计算()
Dim i As Integer
For i = 1 To 10
Sheet1.Cells(i, 4) = "=sum(a" & i & ":b" & i & ")"
Next i
End Sub
Sub 公式带引号的计算()
Cells(12, 1) = "=COUNTIF(A1:A10,"">9"")"
Cells(12, 2) = "=sum(INDIRECT(""a1:a10""))"
End Sub
借用工作表函数
Sub 运用工作表函数()
MsgBox Application.WorksheetFunction.CountIf(range("a1:a10"), "钢笔")
MsgBox WorksheetFunction.CountIf(range("a1:a10"), "钢笔")
MsgBox Application.CountIf(range("a1:a10"), "钢笔")
End Sub
VBA函数
Sub VBA函数()
MsgBox VBA.Format(range("b1"), "yyyy年m月d日")
MsgBox Format(range("b1"), "yyyy年m月d日")
End Sub
自定义函数
Function SEX(rng As range) SEX = IIf(Mid(rng, 15, 3) Mod 2, "男", "女") End Function
1.22、Vba与运算符
定义: 运算符是代表VBA某种运算功能的符号?
1、赋值运算符 :=
2、数学运算符: &(字符连接符)、+(加)、-(减)、Mod(取余)、\(整除)、*(乘)、/(除)、-(负号)、^(指数)
3、逻辑运算符:Not(非)、And(与)、Or(或)、Xor(异或)、Eqv(相等)、Imp(隐含)
4、关系运算符: = (相同)、<>(不等)、>(大于)、<(小于)、>=(不小于)、<=(不大于)、Like
like用来比较两个字符串。
Sub likess() a = 1 Like "[!2]" End Sub
?任何单一字符
* 零个或多个字符。
# 任何一个数字 (0–9)。
[charlist] charlist.中的任何单一字符?
[!charlist] 不在 charlist 中的任何单一字符。
Sub a1() a = "admin" Like "Admin" '区分大小写 End Sub
Sub a2() b = "abc" Like "a?c" ' 通配符运用 b2 = "abc" Like "???" End Sub
Sub a3() c = "excel函数" Like "*函*" End Sub
Sub a4() d = 88 Like "##" End Sub
Sub a5() e = "a" Like "[a-z]" f = 8 Like "[!1-7]" g = 8 Like "[1-4,6-9]" End Sub
Sub aa()
For j = 2 To 6
For i = 2 To 14
If Cells(i, "a") Like Cells(j, "e") Then n = n + 1
Next
Range("f" & j) = n
n = 0
Next
End Sub