Excel VBA宏的使用

目录:

一、什么是VBA

二、VBA编辑器

三、属性与方法

1、属性Property:对象的状态

2、方法Method:对象能做的事

3、属性与方法的区分

4、查找对象的属性与方法

5、常用对象的表示方法

四、变量

1、什么是变量

2、类型和声明

五、VBA语句

1、VBA语句概述

2、判断语句

3、循环语句

4、分支与END语句

十、示例代码

1、隐藏/显示单元格

2、实现智能数据验证

附录

1、学习资源

2、问题总结


软件版本:Microsoft Excel 16


一、什么是VBA

VBA(Visual Basic for Applications)是一种面向对象的语言,也就是说,在 VBA 的世界里,几乎所有可以被操作的东西,都是“对象”。你可以把“对象”理解为 Excel 中具体的实体,比如:

  • 一个工作簿(Workbook)
  • 一张工作表(Worksheet)
  • 某个单元格区域(Range)
  • 图表、按钮、形状等控件

每个对象都有自己的属性(它的状态)和方法(它能做的动作)。理解对象、掌握它的属性和方法,就是写好 VBA宏的第一步。

Microsoft Excel 16下载地址:

链接:https://pan.baidu.com/s/1kTDzWbVua6IsqsAc-FREbQ

提取码:nrhb

二、VBA编辑器

文件→选项,即可打开“Excel选项”对话框。

自定义功能区→勾选开发工具」,如下图所示。

在工具栏「开发工具」「Visual Basic」→双击下图第6处的“ThisWorkbook”,即可弹出编程区域。在“ThisWorkbook”内的代码作用于整个工作簿,若选择“Sheet8(MIDI 150A_2000A)”,此时代码将仅作用于 Sheet8。

Alt+F11 可快速打开 VBA编辑器,可见其就是一个类 VB 的编程环境,学过 VB语言的很好上手。

三、属性与方法

属性 = 对象的状态,方法 = 对象的动作

1、属性Property:对象的状态

属性用于描述对象的状态或特征,可以看作是对象的“形容词”。比如,字体是否加粗、背景色是什么、单元格的值是多少,都是属性。

Range("A1").Font.Bold = True  '设置字体加粗
Range("A1").Interior.Color = vbYellow  '设置背景色为黄色

属性通常可以被读取(看一下状态),也可以被设置(改变状态),只要它是可读写的。

当你要连续修改同一个对象的多个属性时,建议使用 With 语句,写法更简洁,逻辑也更清晰:

With Range("A1")
    .Font.Bold = True
    .Font.Color = RGB(255, 0, 0)
End With

2、方法Method:对象能做的事

方法代表对象可以执行的操作,类似于对象的“动词”。比如“选择”、“复制”、“保存”这些行为,都是方法。

Range("A1").Select   '选中A1单元格
Range("A1").Copy     '复制A1单元格
ActiveWorkbook.Save  '保存当前工作簿

大多数方法支持传入参数,用来控制行为的细节。这些参数有的必须提供,有的则是可选的。有些方法还支持命名参数语法,让代码更清晰:

Range("A1:A10").Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlYes

这个例子就是使用 Sort 方法对 A1:A10 区域进行升序排序,并指定首行为标题。

3、属性与方法的区分

下面这张对比表可以帮你理清两者的区别:

比较项

属性

Property

方法

Method

本质描述对象的状态或特征执行对象的动作或操作
使用格式对象.属性名对象.方法名(参数)
是否有返回值通常有不一定全有
是否会改变对象状态一般不会直接改变通常会改变
'获取当前工作表名称(属性)
MsgBox ActiveSheet.Name

'删除名为 Sheet2 的工作表(方法)
ThisWorkbook.Sheets("Sheet2").Delete

4、查找对象的属性与方法

1)代码自动提示

在 VBA 编辑器中,输入对象名称后加上 .(点号),就会自动弹出该对象所有可用的属性和方法。你会看到:

  • 灰色小手图标代表属性
  • 绿色小闪电图标代表方法

2)按F1查看帮助文档

在编辑环境中,按下键盘上的 F1,即可跳转到该对象的详细帮助文档。

文档中通常包含:

  • 对象的层级结构(所属对象是谁)
  • 所有可用属性和方法
  • 每个属性/方法的用法、参数说明、代码示例

搜索相应的对象,比如Range,如下图所示。

5、常用对象的表示方法

1)工作簿

Workbooks 代表工作集合,所有的工作簿;Workbooks(n),表示已打开的第n个工作簿

Workbooks(“工作簿名称”)

ActiveWorkbook 正在操作的工作簿

ThisWorlBook 代码所在的工作薄

2)工作表

Sheets(“工作表名称”)

Sheet1 表示第一个插入的工作表,Sheet2 表示第二个插入的工作表

Sheets(n) 表示按排列顺序,第n个工作表

Activesheet 表示活动工作表,光标所在工作表

Worksheet 也表示工作表,但不包括图表工作表、宏工作表等。

3)单元格

Cells 所有单元格

Range(“单元格地址”),比如Range(“A1,C8,D0:D10”)

Cells(行数,列数)

ActiveCell 正在选中或编辑的单元格

Selection 正被选中或选取的单元格或单元格区域

四、什么是变量

1、什么是变量

所谓变量,就是可变的量。就好象在内存中临时存放的一个小盒子,这个小盒子放的什么物体不固定。

'1 放数字与文本
Sub test2()
    Dim st As String
    Dim X As Integer

    For X = 1 To 10
      st = st & "爱上电路设计"
    Next X

End Sub
    
'2 放对象
Sub test3()

    Dim rg As Range
    Set rg = Range("a1")
    rg = 100

End Sub
      
'3 放数组
Sub test4()
       
    Dim arr(1 To 10) As Integer, X As Integer

    For X = 1 To 10
        arr(X) = X
    Next X

End Sub

2、类型和声明

一般情况下,过程级变量在过程运行结束后就会自动从内存中释放,而只有一些从外部借用的对象变量才需要使用set 变量=nothing进行释放。

五、VBA语句

1、VBA语句概述

1)宏语句

Sub 按钮1_Click()

    ' 给名为 "Sheet2" 的工作表 A1 单元格赋值
    ' ThisWorkbook.Worksheets("Sheet2").Range("A1").Value = 10'
    ' 若工作表名称被修改会报“下标越界”,可采用“索引号”写法
    ThisWorkbook.Worksheets(2).Range("A1").Value = 10
    
    ' 如果要在活动工作表操作(当前显示的工作表)
    ' ActiveSheet.Range("A1").Value = 10

End Sub

2)函数语句

Function SheetCount()
    SheetCount = Sheets.Count
End Function

3)程序中应用语句

Sub 按钮1_Click()
    Range("A1") = 10  ' 给A1单元格赋值10
End Sub

Function SheetCount()
    SheetCount = Sheets.Count
End Function

Sub InputNumber()
    Call 按钮1_Click  ' 调用“按钮1_Click”子函数
    
    For x = 1 To 100  ' 循环语句
        Cells(x, 1) = x
    Next x
End Sub

2、判断语句

Sub 判断2() '多条件判断

  Select Case Range("a1").Value
  Case Is > 0
     Range("b1") = "正数"
  Case Is = 0
     Range("b1") = "0"
  Case Else
     Range("b1") = "负数"
  End Select

End Sub
Sub select区间判断()

 Select Case Range("a2").Value
 Case 0 To 1000
   Range("b2") = 0.01
 Case 1001 To 3000
   Range("b2") = 0.03
 Case Is > 3000
   Range("b2") = 0.05
 End Select

End Sub

3、循环语句

Sub test1()
  Range("d2") = Range("b2") * Range("c2")
  Range("d3") = Range("b3") * Range("c3")
  Range("d4") = Range("b4") * Range("c4")
  Range("d5") = Range("b5") * Range("c5")
  Range("d6") = Range("b6") * Range("c6")
End Sub

Sub test2()
Dim x As Integer
 For x = 10000 To 2 Step -3
  Range("d" & x) = Range("b" & x) * Range("c" & x)
 Next x
End Sub


Sub test3()
Dim rg As Range
 For Each rg In Range("d2:d18")
  rg = rg.Offset(0, -1) * rg.Offset(0, -2)
 Next rg
End Sub


Sub test4()
Dim x As Integer
 x = 1
 Do
   x = x + 1
   Cells(x, 4) = Cells(x, 2) * Cells(x, 3)
 Loop Until x = 18
End Sub

Sub t5()
 x = 1
 Do While x < 18
   x = x + 1
   Cells(x, 4) = Cells(x, 2) * Cells(x, 3)
 Loop
End Sub

4、分支与END语句

END语句作用:强制退出所有正在运行的程序

Exit语句作用:退出指定的语句

示例代码:

Option Explicit

'1、Exit Sub
Sub exitsub()

   Dim x As Integer
   For x = 1 To 100
      Cells(1, 1) = x
      If x = 5 Then
         Exit Sub
      End If
   Next x
   Range("b1") = 100

End Sub

'2、Exit function
Function exitfun()

   Dim x As Integer
   For x = 1 To 100
      If x = 5 Then
         Exit Function
      End If
   Next x
   ff = 100

End Function

'3、Exit for
Sub exitfor()

   Dim x As Integer
   For x = 1 To 100
      Cells(1, 1) = x
      If x = 5 Then
         Exit For
      End If
   Next x
   Range("b1") = 100

End Sub

'4、Exit do
Sub exitdo()
    Dim x As Integer
    Do
        x = x + 1
        Cells(1, 1) = x
        If x = 5 Then
            Exit Do
        End If
     Loop Until x = 100
     Range("b1") = 100

End Sub

goto语句作用:跳转到指定的地方

示例代码:

Option Explicit

'Goto语句,跳转到指定的地方
Sub t1()

    Dim x As Integer
    Dim sr
    100:
        sr = Application.InputBox("请输入数字", "输入提示")
    If Len(sr) = 0 Or Len(sr) = 5 Then GoTo 100

End Sub

'gosub..return ,跳过去,再跳回来
Sub t2()
    Dim x As Integer
    For x = 1 To 10
        If Cells(x, 1) Mod 2 = 0 Then GoSub 100
    Next x
Exit Sub
100:
    Cells(x, 1) = "偶数"
    Return          '跳到gosub 100 这一句
End Sub

'on error resume next '遇到错误,跳过继续执行下一句
Sub t3()
    On Error Resume Next
    Dim x As Integer
    For x = 1 To 10
        Cells(x, 3) = Cells(x, 2) * Cells(x, 1)
    Next x
End Sub

'on error goto  '出错时跳到指定的行数
Sub t4()
    On Error GoTo 100
    Dim x As Integer
    For x = 1 To 10
        Cells(x, 3) = Cells(x, 2) * Cells(x, 1)
    Next x
Exit Sub
100:
    MsgBox "在第" & x & "行出错了"
End Sub

'on error goto 0 '取消错误跳转
Sub t5()
    On Error Resume Next
    Dim x As Integer
    For x = 1 To 10
        If x > 5 Then On Error GoTo 0
        Cells(x, 3) = Cells(x, 2) * Cells(x, 1)
    Next x
    Exit Sub

End Sub

十、示例代码

1、隐藏/显示单元格

本示例用来实现点击按钮隐藏/显示特定单元格区域,如下面的 gif动图所示。

示例文件移步:https://download.csdn.net/download/liht_1634/91526188

1)创建按钮

打开Excel → 顶部菜单栏选择 「开发工具」 选项卡,点击「插入」→ 在「表单控件」中选择「按钮」,在工作表空白处拖动鼠标绘制按钮。

松开鼠标自动弹出「指定宏」窗口,如下图所示。

2)编写VBA宏

在 「指定宏」 窗口点击 「新建」

打开 VBA编辑器,如下图所示。

完整代码:

Sub 按钮1_Click()

    On Error Resume Next  '开始错误处理
    
    Dim btnName As String
    btnName = Application.Caller  '获取触发宏的按钮名称
    
    Dim btn As Button
    Set btn = ActiveSheet.Buttons(btnName)
    
    '改变按钮上的文字
    If btn.Text = "隐藏" Then
        btn.Text = "显示"
    Else
        btn.Text = "隐藏"
    End If
    
    If Rows("3").Hidden Or Rows("6").Hidden Or Rows("8").Hidden Then
        Rows("3").Hidden = False '显示行
        Rows("6").Hidden = False '显示行
        Rows("8").Hidden = False '显示行
    Else
        Rows("3").Hidden = True  '隐藏行
        Rows("6").Hidden = True  '隐藏行
        Rows("8").Hidden = True  '隐藏行
    End If

End Sub

3)注意事项

(1)保存文件:需保存为 .xlsm 格式(启用宏的工作簿)

(2)安全设置:首次运行宏时需在 文件→选项→信任中心→启用所有宏(3)修改按钮:右键按钮可调整大小/文字/位置

右键 → 「指定宏」 可更换宏

2、实现智能数据验证

本示例用以确保A列只接受数字输入(包括整数、小数、负数和科学计数法),并在输入非数字内容时给出提示并清空单元格。

1)使用说明

  • 按 Alt+F11 打开VBA编辑器

  • 在左侧项目窗口中双击对应的工作表(如 Sheet1

  • 将上述代码粘贴到代码窗口中

2)完整代码

Private Sub Worksheet_Change(ByVal Target As Range)

    On Error GoTo CleanExit  ' 错误处理
    
    ' 只处理A列的更改
    Dim changedCells As Range
    Set changedCells = Intersect(Target, Me.Columns("A"))
    If changedCells Is Nothing Then Exit Sub
    
    Application.EnableEvents = False  ' 禁用事件防止循环触发
    Application.ScreenUpdating = False  ' 禁用屏幕更新
    
    Dim cell As Range
    For Each cell In changedCells
        ' 跳过空单元格
        If Not IsEmpty(cell) And cell.Value <> "" Then
            ' 检查是否为有效数字
            If Not IsNumeric(cell.Value) Then
                ' 非数字处理
                MsgBox "A列只接受数字输入!" & vbCrLf & _
                       "单元格 " & cell.Address & " 输入了无效内容: " & cell.Value, _
                       vbExclamation, "输入错误"
                cell.ClearContents
            ' 检查文本型数字(如'123)
            ElseIf VarType(cell.Value) = vbString Then
                MsgBox "请勿输入文本格式的数字!" & vbCrLf & _
                       "单元格 " & cell.Address & " 的内容将被转换为数字", _
                       vbInformation, "格式修正"
                cell.Value = Val(cell.Value)  ' 转换为数值
            End If
        End If
    Next cell

CleanExit:
    Application.EnableEvents = True  ' 确保事件重新启用
    Application.ScreenUpdating = True

End Sub

附录

1、学习资源

VBA常用技巧资源:非常详实的VBA常用技巧,本内容来自于:ExcelHome

2、问题总结

1)Microsoft已阻止宏运行

右键 → 「属性」 → 「解除锁定」即可


路,还得一个人走,任谁也帮不了谁。远方再远,慢慢走,总会到…… 觉得不错,动动发财的小手点个赞哦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱上电路设计

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值