宏笔记
——VBA语言
【若对该知识点有更多想了解的,欢迎私信博主~~】
VBA
一:介绍
Visual Basic for Applications(VBA)是一种针对Microsoft Office应用程序的编程语言。它允许用户通过编写代码来自动化和自定义Office应用程序,如Excel、Word、PowerPoint等。VBA使用户能够创建自定义的宏和脚本,以执行重复性任务、处理数据、生成报告,或者与应用程序进行交互,从而提高工作效率。
二:特点和用途
-
自动化任务
可以自动执行重复任务,如生成报表
-
用户界面
可以自定义用户的操作界面,方便交互
-
数据处理
允许在Excel里处理和分析大量数据
-
自定义函数
允许自定义函数
-
事件处理
可以捕获Office应用程序中的各种事件,如打开,保存
-
错误处理
支持处理运行时的错误
-
访问其他应用程序
可以与其他Windows应用程序交互
三:语法
-
变量
-
声明: Dim [变量名称 As 类型]
类型:
-
基本数据类型
Integer(整数值)、Long(长整数值)、Single(单精度浮点数)、Double(双精度浮点数)、String(字符串)、Boolean(布尔值)、Date(日期和时间)、Variant(任意数据类型)
-
对象引用
Workbook(工作簿)、Worksheet(工作表)、Range(单元格范围)、CharObject(图表对象)、Shape(形状对象)、
FileSystemObject(操作系统的文件和文件夹)、ADODB.Connection(数据库连接)、Outlook.Application(Outlook应用程序)、
Word.Document(Word文档)等
Dim row As Long, count As Long '声明基本数据类型 Dim wb As Workbook '声明对象引用 Dim values As Object '声明对象引用Object
-
-
赋值:
-
-
运算符
-
算术运算符
+(加)、-(减)、*(乘)、/(除)、\(取整)、^(指数)
-
逻辑运算符
And(逻辑与)、Or(逻辑或)、Not(逻辑非)、Xor(逻辑异或)
-
比较运算符
=(等于)、<>|!=(不等于)、<(小于)、>(大于)、<=(小于等于)、>=(大于等于)
-
字符串运算符
&(连接两个字符串)
-
赋值运算符
=(将右边的值赋给左边的变量)
-
其他运算符
Is(比较对象引用)、Like(模式匹配)
-
-
判断
-
if-else
Dim value As Long value = 2 If value < 0 Then MsgBox "value < 0" ElseIf value = 0 Then MsgBox "value = 0" Else MsgBox "value > 0" End If
-
select-case
Dim value As Long value = 2 Select Case value Case 1 MsgBox "value = 1" Case 2 MsgBox "value = 2" Case 3 MsgBox "value = 3" End Select
-
-
循环
-
For
Dim i As Long For i = 1 To 4 If i >= 0 Then Exit For '跳出当前循环 End If i = i + 1 Next i '可以修改i来控制循环节奏
-
For Each
Dim cell As Range For Each cell In ws.Range("A2:A10") MsgBox cell.value Set cell = ws.Cells(cell.Row + 1, "A") Next cell '可以修改cell来控制循环节奏
-
-
函数和过程
Public Function Add(a As Double, b As Double) As Double Add = a + b End Function Sub TestAdd() Dim result As Double result = Add(5, 3) ' 结果为 8 End Sub
区别:
- Sub没有返回值,Function可以有返回值,也可以没有(此时等同于过程)
注意事项:
- Sub和Function不能互相嵌套
- 模块从上到下解析,调用前要确保已存在,或者分开存放
-
类
类只能在类模板里定义,Public为所有项目可访问,Friend为当前项目可访问
Public Class Person '有Public、Private、Friend Public Name As String Public Age As Integer Public Sub Introduce() MsgBox "My name is " & Name & " and I am " & Age & " years old." End Sub End Class ' 在标准模块中使用Person类 Sub TestPersonClass() Dim myPerson As New Person myPerson.Name = "John" myPerson.Age = 30 myPerson.Introduce End Sub
-
系统函数
-
数字
Abs(绝对值)、Sqr(平方根)
-
字符串
Len(长度)、Left(左侧字符)、Right(右侧字符)、Replace(替换)、Trim(去除空格)、UCase(全大写)、Lcase(全小写)
-
日期和时间
Date(日期)、Time(时间)、Now(当前日期和时间)、DateAdd(增加时间)、DateDiff(间隔)
-
类型转换
CInt(转换成整数)、CDbl(转换成浮点数)、CStr(转换成字符串)、CDate(转换成日期)
-
-
数组
Dim myArray(3) As Integer ' 声明一个包含 3 个整数的数组(索引从 0 到 2) myArray(0) = 10 myArray(1) = 20 myArray(2) = 30 Dim myArray As Variant myArray = Array(10, 20, 30) Dim value As Integer value = myArray(1) ' 获取数组中索引为 1 的元素(值为 20) Dim matrix(3, 2) As Integer ' 一个 4x3 的二维数组 matrix(0, 0) = 1 matrix(1, 1) = 5
-
列表
Dim myCollection As Collection Set myCollection = New Collection myCollection.Add "Item 1" myCollection.Add "Item 2" MsgBox myCollection.Item(1) '显示 "Item 1"
-
字典
Dim myDictionary As Object Set myDictionary = CreateObject("Scripting.Dictionary") myDictionary.Add "Key1", "Value1" myDictionary.Add "Key2", "Value2" MsgBox myDictionary("Key1") ' 显示 "Value1"
-
系统对象
-
Application
-
警告对话框展示
Application.DisplayAlerts = True | False '开启|关闭 对话框展示
-
-
Debug
-
打印日志
Debug.Print "Hello World"
-
-
Error
-
属性
- Number 错误代码
- Description 错误描述
-
函数
- Clear 清除错误状态
On Error Resume Next ' 忽略错误 Dim result As Double result = 1 / 0 ' 这会导致除以零的运行时错误 If Err.Number <> 0 Then MsgBox "Error: " & Err.Description Err.Clear ' 清除错误状态 End If On Error GoTo 0 ' 恢复默认错误处理行为
-
-
-
Excel
-
对象
-
工作簿 Workbooks.Open()
Dim wb As Workbook Set wb = Workbooks.Open("C:\Users\win10\Desktop\工作簿1.xlsx")
注:当前工作簿 Set wb = ThisWorkbook
-
工作表 工作簿.Sheets()
Dim ws As WorkSheet Set ws = wb.Sheets("表1")
-
行 工作表.Rows()
Dim firstRowRange As Range ' 直接获取行 Set firstRowRange = ws.Rows(1) ' 根据单元格获取行 Set firstRowRange = firstCell.EntireRow
-
行号 行.Row
Dim firstRowNumber As Long ' 获取行的行号 firstRowNumber = firstRowRange.Row ' 获取单元格所在行行号 firstRowNumber = firstCell.Row
-
列 工作表.Columns()
Dim firstColumnRange As Range ' 直接获取列 Set firstColumnRange = ws.Columns("A") ' 根据单元格获取列 Set firstColumnRange = firstCell.EntireColumn
-
列号
Dim firstColumnNumber As Long ' 获取列的列号 firstColumnNumber = firstRowRange.Column ' 获取单元格所在列列号 firstColumnNumber = firstCell.Column
-
单元格 工作表.Cells()
Dim firstCell As Range Set firstCell = ws.Cells(1, "A")
-
范围 工作表.Range()
Dim searchRange As Range Set searchRange = ws.Range("A1:C3")
-
-
属性
- Workbook
- name 工作簿的名称
- FullName 工作簿的完整路径和文件名
- WorkSheet
- name 工作表的名称
- Range
- value 值
- HorizontalAlignment 水平对齐方式 有xlLeft、xlCenter、xlRight
- VerticalAlignment 垂直对齐方式 有xlTop、xlCenter、xlBottom
- ColumnWidth 宽度
- RowHeight 高度
- NumberFormat 数值格式
- Workbook
-
函数
-
.End():找到最后一个非空单元格
-
.End(xlUp) 向上搜索
-
.End(xlDown) 向下搜索
-
.End(xlToLeft) 向左搜索
-
.End(xlToRight) 向右搜索
firstRowNumber = ws.Cells(1, "A").End(xlDown).Row '查找最后一行行号
-
-
.Find():查找特定的值或条件
-
.Find() 查找第一个匹配项
-
.FindLast() 查找最后一个匹配项
-
.FindNext() 在Find()的基础上查找下一个
-
.FindPrevious() 在Find()的基础上查找上一个
Dim searchString As String searchString = "Apple" '要查找的值 Dim searchRange As Range Set searchRange = ws.Range("A1:A10") '查找范围 Dim firstCell As Range Set firstCell = searchRange.Find(What:=searchString) Dim lastCell As Range Set lastCell = searchRange.FindLast(What:=searchString) Dim nextCell As Range Set nextCell = searchRange.FindNext(firstCell) Dim previousCell As Range Set previousCell = searchRange.FindPrevious(firstCell)
-
-
.Offset():范围偏移、.Resize():范围调整
-
-
过程
-
清除内容 范围.Clear
searchRange.Clear '全部清除 searchRange.ClearContents '清除内容 searchRange.ClearFormulas '清除公式 searchRange.ClearFormats '清除格式
注:Range类型都行
-
删除 对象.Delete
wb.Delete '删除工作簿 ws.Delete '删除工作表 firstRowRange.Delete '删除行 firstColumnRange '删除列
注:单元格不能用Delete,只能用Clear
-
排序 行|列.Sort
ws.Range("A2:H10").Sort key1:=ws.Range("A2"),Order1:=xlAscending,Key2:=ws.Range("B2"),Order2:=xlDescending,Header:=xlNo
注:
1.会先根据主关键字排序,再根据次关键字排序,以此类推
2.xlAscending为升序,xlDescending为降序
3.xlNo排序时会忽略首行,xlYes排序时会包括首行,xlGuess排序时Excel会自动判断
4.只会排序选中范围之内,之外不会跟着排序,会导致数据不匹配
-
自适应宽度 行|列.AutoFit
ws.Columns("A:A").AutoFit
-
关闭工作簿
'SaveChanges用于指定是否保存对工作簿的更改,Filename用于指定保存的名字,不填则用当前 wb.Close SaveChanges:=False,Filename:="NewFileName.xlsx"
-
-