Excel VBA宏的使用

Excel VBA宏的使用

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

一个工作簿(Workbook)一张工作表(Worksheet)某个单元格区域(Range)图表、按钮、形状等控件每个对象都有自己的属性(它的状态)和方法(它能做的动作)。理解对象、掌握它的属性和方法,就是写好 VBA 宏的第一步。

二、VBA编辑器文件→选项,即可打开“Excel选项”对话框。

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

在工具栏「开发工具」→「Visual Basic」→双击 6处的“ThisWorkbook”,即可弹出编程区域。

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

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

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

代码语言:javascript代码运行次数:0运行复制Range("A1").Font.Bold = True '设置字体加粗

Range("A1").Interior.Color = vbYellow '设置背景色为黄色属性通常可以被读取(看一下状态),也可以被设置(改变状态),只要它是可读写的。

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

代码语言:javascript代码运行次数:0运行复制With Range("A1")

.Font.Bold = True

.Font.Color = RGB(255, 0, 0)

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

代码语言:javascript代码运行次数:0运行复制Range("A1").Select '选中A1单元格

Range("A1").Copy '复制A1单元格

ActiveWorkbook.Save '保存当前工作簿大多数方法支持传入参数,用来控制行为的细节。这些参数有的必须提供,有的则是可选的。有些方法还支持命名参数语法,让代码更清晰:

代码语言:javascript代码运行次数:0运行复制Range("A1:A10").Sort _

Key1:=Range("A1"), _

Order1:=xlAscending, _

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

3、属性与方法的区分下面这张对比表可以帮你理清两者的区别:

比较项

属性/Property

方法/Method

本质

描述对象的状态或特征

执行对象的动作或操作

使用格式

对象.属性名

对象.方法名(参数)

是否有返回值

通常有

不一定全有

是否会改变对象状态

一般不会直接改变

通常会改变

代码语言:javascript代码运行次数:0运行复制'获取当前工作表名称(属性)

MsgBox ActiveSheet.Name

'删除名为 Sheet2 的工作表(方法)

ThisWorkbook.Sheets("Sheet2").Delete4、查找对象的属性与方法1)代码自动提示

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

灰色小手图标代表属性绿色小闪电图标代表方法在编辑环境中,按下键盘上的 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、什么是变量所谓变量,就是可变的量。就好象在内存中临时存放的一个小盒子,这个小盒子放的什么物体不固定。

代码语言:javascript代码运行次数:0运行复制'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 Sub2、类型和声明一般情况下,过程级变量在过程运行结束后就会自动从内存中释放,而只有一些从外部借用的对象变量才需要使用set 变量=nothing进行释放。

五、VBA语句1、VBA语句概述1)宏语句

代码语言:javascript代码运行次数:0运行复制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 Sub2)函数语句

代码语言:javascript代码运行次数:0运行复制Function SheetCount()

SheetCount = Sheets.Count

End Function3)程序中应用语句

代码语言:javascript代码运行次数:0运行复制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 Sub2、判断语句代码语言:javascript代码运行次数:0运行复制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代码语言:javascript代码运行次数:0运行复制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 Sub3、循环语句代码语言:javascript代码运行次数:0运行复制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 Sub4、分支与END语句END语句作用:强制退出所有正在运行的程序

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

示例代码:

代码语言:javascript代码运行次数:0运行复制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 Subgoto语句作用:跳转到指定的地方

示例代码:

代码语言:javascript代码运行次数:0运行复制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动图所示。

示例文件移步:ExcelVBA宏的使用示例资源-CSDN下载。

1)创建按钮

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

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

2)编写VBA宏

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

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

​完整代码:

代码语言:javascript代码运行次数:0运行复制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连续多行显隐与背景颜色的处理代码:

代码语言:javascript代码运行次数:0运行复制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.Caption = "隐藏" Then

btn.Caption = "显示"

Else

btn.Caption = "隐藏"

End If

If Rows("7:11").Hidden Or Rows("17:21").Hidden Or Rows("27:32").Hidden Or Rows("36:40").Hidden _

Or Rows("44:48").Hidden Or Rows("52:56").Hidden Or Rows("60:64").Hidden Then

Rows("7:11").Hidden = False '显示行

Rows("17:21").Hidden = False '显示行

Rows("27:32").Hidden = False '显示行

Rows("36:40").Hidden = False '显示行

Rows("44:48").Hidden = False '显示行

Rows("52:56").Hidden = False '显示行

Rows("60:64").Hidden = False '显示行

Range("A12:L16").Interior.Color = vbYellow

Range("A33:L43").Interior.Color = vbYellow

Range("A57:L59").Interior.Color = vbYellow

Else

Rows("7:11").Hidden = True '隐藏行

Rows("17:21").Hidden = True '隐藏行

Rows("27:32").Hidden = True '隐藏行

Rows("36:40").Hidden = True '显示行

Rows("44:48").Hidden = True '显示行

Rows("52:56").Hidden = True '显示行

Rows("60:64").Hidden = True '显示行

Range("A12:L16").Interior.Color = vbRed

Range("A33:L43").Interior.Color = vbRed

Range("A57:L59").Interior.Color = vbRed

End If

End Sub3)注意事项

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

(2)安全设置:首次运行宏时需在 文件→选项→信任中心→启用所有宏

(3)修改按钮:右键按钮可调整大小/文字/位置

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

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

1)使用说明

按 Alt+F11 打开VBA编辑器 在左侧项目窗口中双击对应的工作表(如 Sheet1) 将上述代码粘贴到代码窗口中2)完整代码

代码语言:javascript代码运行次数:0运行复制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已阻止宏运行

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

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

黄金推荐

属鼠的人的性格和脾气 生肖属鼠的人一生命运
足球365官网是哪个

属鼠的人的性格和脾气 生肖属鼠的人一生命运

🕒 08-18 💰 5938
在没有全屏的情况下,edge地址栏自动隐藏,我想知道关闭此功能的方法
gta5恐霸在哪改装
365bet足球正网平台

gta5恐霸在哪改装

🕒 08-17 💰 846