VBA手把手教程

一、基础

使用VBA处理数据之前,首先配置好环境,这篇教程使用的是EXCEL2021版本
excel主选项卡有【开发工具】的可以跳过以下操作:
打开excel,点击“文件”,然后在更多中选中“选项”
在这里插入图片描述
在弹窗中寻找【自定义功能区】,在如图所在位置勾选【开发工具】
在这里插入图片描述
excel的主选项卡就会出现【开发工具】
在这里插入图片描述

1. 录制宏

打开【开发工具】,点击【录制宏】。根据右侧格式要求,录制一个宏:

录制宏教程

注意:一定要保存为.xlsm的后缀,才可以执行录制好的宏
在这里插入图片描述

在新的sheet页选择之前录制好的宏,点击【执行】,格式会自动设置完成
在这里插入图片描述

2. 绝对引用和相对引用

绝对引用和相对引用区别将体现在初始位置过程位置的记录方式上。
相同点:针对初始位置,两者的初始位置是相同的。Excel 只记录一个「选中的区域」的参数,不会记录选中的单元格地址信息。
不同点:两者对过程位置的记录方式不同。
绝对引用:录制宏过程中,记录选中的单元格的绝对地址信息。例如,从初始位置 A1,再选中 A4,绝对引用只记录 A4。
相对引用:录制宏过程中,记录初始位置单元格和最新选中单元格离初始位置的偏移量。例如,从初始位置 A1,再选中 A4,相对引用记录 A1 和偏移量 [3, 0]。
绝对引用:

VBA绝对引用和相对引用区别之绝对引用

相对引用:

VBA相对引用和绝对引用之相对引用

3. vba初识

事实上,我们录制宏实质上就是excel把人的每一个动作记录下来,翻译成VBA代码保存为一个宏供查看和多次执行

找到宏之后,点击【编辑】按钮找到VBA代码
在这里插入图片描述
在这里插入图shang片描述上图,红色部分代表工作簿中的sheet页,模块中的vba可以用在任意sheet页中;绿色部分就是vba代码,'sub指的是 宏的开始;绝对引用就是宏名,End Sub指的是宏结束,中间部分则是具体实现的代码*(后续再讲解)*

Sub 绝对引用() 'sub: 宏的开始;绝对引用就是宏名
'
' 绝对引用 宏
'

'
    Range("A1").Select
    With Selection.Interior
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .ThemeColor = xlThemeColorLight1
        .TintAndShade = 0
        .PatternTintAndShade = 0
    End With
    Range("A3").Select
    With Selection.Interior
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .ThemeColor = xlThemeColorDark2
        .TintAndShade = 0
        .PatternTintAndShade = 0
    End With
    Range("A3").Select
End Sub    '宏结束

4. 变量和常量

常量与变量的区别:
1)常量必须要有初始值,而且值不允许被修改
2)变量可以无初始值,且可以多次赋值。
注意:有变量时,最好强制声明Option Explicit,避免报错

变量的使用规则:
1)尽量使用有意义的名称
2)英文字母、中文(不推荐)、数字、下划线;但是不能以数字开头
3)不能与系统保留名重名(如:sub end for)
4)对大小写不敏感

附一段求圆面积的代码:

Sub 计算圆的面积()
'先选中半径对应的单元格
'行:2  ;列:从229
Dim x As Integer  '定义的变量
Const pi = 3.14159  '定义的常量
For x = 2 To 29
    Cells(x, 2) = Cells(x, 1) * Cells(x, 1) * pi
    Next
End Sub

点击【Visual Basic】写代码
在这里插入图片描述
在这里插入图片描述
运行结果如下:
在这里插入图片描述

5. 多列动态合并

循环结构:
for 变量 = 开始值 to 结束值 step 步长
循环体
next

//基础知识
Sub 预热()
    '选中某个单元格
    Range("c2").Select
    '将某个范围的数据清除掉
    Range("e2:e4").Clear
    '弹出e列最后一行有值的行数
    MsgBox Range("e2").End(xlDown).Row  '或
    MsgBox Range("e10000").End(xlUp).Row

//多列动态合并
Sub 多列动态合并()
    '有三列或者更多列,因此设置x代表第几列
    '设置y为j列的行号
    '设置j列合并
    Const j = 5
    Dim x, y As Integer
    y = 2
    For x = 1 To 3
        Cells(2, x).Select
        Range(Selection, Selection.End(xlDown)).Select
        Selection.Copy
        Cells(y, j).Select
        ActiveSheet.Paste
        y = Cells(y, j).End(xlDown).Row + 1
        Next
End Sub

实现效果如图:将A、B、C列合并到e列(目前j=5,也可以等于其他想填充数据的合并列)
在这里插入图片描述

6. IF判断

完成以下小练习,学会vba代码的if判断

![这里是引用](https://i-blog.csdnimg.cn/direct/e9ced258e71d447ca8f4d6df193281de.png

  • 单条件判断
    if 条件 then
    执行的语句
    end if
Sub 删除离职所在整行()
    '删除整行
    'Range("c2").EntireRow.Delete
    '设置变量,x:遍历数据的行数
    Dim x As Integer
    For x = 2 To 62
        If Range("D" & x) = "离职" Then
        Range("D" & x).EntireRow.Delete
        End If
    Next
End Sub
  • 双条件判断
    if 条件 then
    执行语句1
    else
    执行语句1
    end if
Sub 补贴()
    Dim x As Integer
    For x = 2 To 61
        If Range("c" & x) = "男" Then
        Range("f" & x) = 100
        Else
        Range("c" & x) = "女"
        Range("f" & x) = 120
        End If
    Next
End Sub
  • 多条件判断
    if 条件 then
    执行语句1
    elseif 条件 then
    执行语句2…
    else
    执行语句3
    end if
Sub 等级()
    Dim x As Integer
    For x = 2 To 61
        If Range("e" & x) > 4000 Then
            Range("g" & x) = "优秀"
        ElseIf Range("e" & x) > 3800 Then
            Range("g" & x) = "良好"
        ElseIf Range("e" & x) > 3600 Then
            Range("g" & x) = "及格"
        Else
        Range("g" & x) = "不达标"
        End If
    Next
    
End Sub

7. 工作表操作

题目:将超市销售记录表模板复制12份,分别对应12个月的销售情况

Sub 批量复制()
    Dim x As Integer
    For x = 1 To 12
        Sheets("超市销售记录表模板").Copy after:=ActiveSheet
        ActiveSheet.Name = x & "月"
    Next
        
End Sub

二、VBA办公自动化

1. 获取工作表数量

Sub 工作表数量()
    'MsgBox Sheets.Count '弹窗
    Range("a1") = Sheets.Count
End Sub

2. 选择工作表的三种方式

Sub 选择工作表()
    'Sheet3.Select '根据默认名称选择
    'Sheets("测试").Select  '根据工作表名称选中
    Sheets(3).Select  '根据工作表的位置索引选中
End Sub

3. 获取所有工作表名称

Sub 获取所有工作表名称()
    Range("a1") = "工作表名称"
    Dim x As Integer
    For x = 1 To Sheets.Count
        Range("a" & x + 1) = Sheets(x).Name
    Next
End Sub

4. 获取所有工作表名称

Sub 获取所有工作表名称()
    Range("a1") = "工作表名称"
    Dim x As Integer
    For x = 1 To Sheets.Count
        Range("a" & x + 1) = Sheets(x).Name
    Next
End Sub

5. 更改工作表名称

Sub 更改工作表名称()
    Sheet1.Name = "今天"
End Sub

6. 隐藏工作表

Sub 隐藏工作表()
    Dim x As Integer
    For x = 1 To Sheets.Count
        If Sheets(x).Name <> "今天" Then
            Sheets(x).Visible = False
        End If
    Next
End Sub

7. 显示所有隐藏的工作表

Sub 显示所有隐藏的工作表()
'    Dim x As Integer
'    For x = 1 To Sheets.Count
'        If Sheets(x).Name <> "今天" Then
'            Sheets(x).Visible = True
'        End If
'    Next
    
    Dim x As Integer
    For x = 1 To Sheets.Count
        If Sheets(x).Visible = False Then
            Sheets(x).Visible = True
        End If
    Next
End Sub

8. 批量生成空表

Sub 批量生成空表()
    Dim x As Integer
    For x = 1 To 3
        Sheets.Add after:=ActiveSheet
        ActiveSheet.Name = "猴子" & x
    Next
End Sub

9. 批量删除空表

Sub 批量删除空表()
    'Application.DisplayAlerts = False ' 关闭弹窗提示
    ' 选中并删除表
    'Sheets("猴子").Select
    'ActiveWindow.SelectedSheets.Delete
    Dim x As Integer
    For x = 1 To 3
        Sheets("猴子" & x).Select
    ActiveWindow.SelectedSheets.Delete
    Next
    'Application.DisplayAlerts = True  '代码执行完再打开
End Sub

删除表时,跟正常手动删除工作表一样,会弹窗提示,如下:
在这里插入图片描述
若不希望执行过程中弹出此弹窗,可在代码开头设置参数:Application.DisplayAlerts = False(关闭弹窗提示)
代码执行完之后再将此参数恢复正常:Application.DisplayAlerts = True

10. 批量删除空表

Sub 批量删除空表()
'    Application.DisplayAlerts = False ' 关闭弹窗提示
    ' 选中并删除表
    'Sheets("猴子").Select
    'ActiveWindow.SelectedSheets.Delete
'    Dim x As Integer
'    For x = 1 To 3
'        Sheets("猴子" & x).Select
'    ActiveWindow.SelectedSheets.Delete
'    Next
'    Application.DisplayAlerts = True  '代码执行完再打开

' 工作表不需要选中,然后删除
    Dim sht As Worksheet '定义sht为工作表对象
    '循环工作簿中的每张工作表
    For Each sht In Sheets
        If sht.Name <> "今天" And sht.Name <> "测试" Then
            sht.Delete
        End If
    Next
End Sub

11. 复制工作表

Sub 复制工作表()
   Dim x As Integer
   For x = 1 To 12
    Sheet3.Copy after:=ActiveSheet
    ActiveSheet.Name = x & "月"
   Next
End Sub

12. 批量标注

Sub 批量标注()
    Dim x As Integer
    For x = 1 To 12
        Sheets(x & "月").Select
        Range("a1") = "操作人:yifeng"
    Next
End Sub

13. 打开与关闭工作簿

Sub 打开与关闭工作簿()
    Workbooks.Open "E:\资料\EXCEL资料\VBA\批量操作.xlsx"
    Sheets.Add
    Sheet4.Name = "第4张表"
    ActiveWorkbook.Close savechanges:=True '关闭工作簿时不弹窗
End Sub

14. 新建与另存工作簿

Sub 新建与另存工作簿()
    Dim zx As Workbook
    Set zx = Workbooks.Add
    '新建工作簿赋给zx,因为工作簿是一个对象,给对象赋值
    '对象名称前要写set,用来区别于跟变量进行赋值
    Dim lj As String
    lj = ThisWorkbook.Path '用lj将本工作簿路径装起来
    zx.SaveAs lj & "\yifeng.xlsx"
    zx.Close
End Sub

15. 批量另存为工作簿

Sub 批量另存为工作簿()
Application.ScreenUpdating = False '闪屏关闭
Dim x As Integer
For x = 1 To 12
    Sheets(x & "月").Copy
    ActiveWorkbook.SaveAs "路径"
    ActiveWorkbook.Close
Application.ScreenUpdating = False '闪屏打开
End Sub

16. 批量修改工作簿名称

Sub 批量修改工作簿名称()
    'name 原工作簿名称 as 新文件名称
    Dim x As Integer
    For x = 1 To 12
        Name "原路径+名称" & Sheet3.Range("a" & x + 1) & ".xlsx" As "新..."
        
    Next
End Sub

17. 聚光灯

在代码编写展示的工作表列表这里,选中一个工作表,双击这个工作表
在这里插入图片描述
弹出如下弹窗:在这里写代码即可
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/458a7624fbcb400bb2fc63b3856bf7be.pn

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Cells.Interior.Pattern = xlNone '光标移开背景也要清除
    Target.EntireColumn.Interior.Color = vbCyan
    Target.EntireRow.Interior.Color = vbCyan
End Sub

18. 输入密码打开对应表格

Option Explicit

Private Sub workbook_open()
    Dim pw As String
    pw = InputBox("请输入密码")
    Dim sht As Worksheet
    For Each sht In Sheets
        If sht.Name <> "目录" Then
            sht.Visible = xlSheetVeryHidden
        End If
    Next
    If pw = "猴" Then
        Sheet4.Visible = xlSheetVisible
    ElseIf pw = "人" Then
        Sheet3.Visible = xlSheetVisible
    ElseIf pw = "熊" Then
        Sheet2.Visible = xlSheetVisible
    End If
End Sub
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值