一:简介
有两种基本类型的模块:标准模块和类模块。模块中的每个过程可能是函数过程,也可能是子程序。
模块:它是作为一个单元保存在一起的VBA定义和过程的集合。
类模块:VBA允许你创建自己的对象,对象的定义包含在类模块中。
子程序只执行一个或多个操作,而不返回数值。当录制完宏查看代码时,所看到的就是子程序。宏只能录制子程序,而不能录制函数过程。要返回一个数值,如果没有返回值那么返回值默认为0
插入模块:在工程资源管理器窗口的"Thisworkbook"上单击鼠标右键,选择"插入"-“模块”,这样就将一个模块添加到应用程序中了
当调用子过程或者函数时如果没有参数,直接使用名字调用,不需要()
代码换行使用下划线
F8:逐句运行
二:Sub子过程
子过程的名字可以使用中文名。
Sub cmdSmallFont_Click()
With Selection.Font
.Name="Arial"
.FontStyle="Regular"
.Size=16
End With
End sub
Private Sub Worksheet_Activate()
If Application.InputBox("请输入操作权限密码:") = 123 Then
Range("A1").Select
Sheets("机密文档").Cells.Font.ColorIndex = 56
Else
MsgBox "密码错误,即将退出!"
Sheets("普通文档").Select
End If
End Sub
Sub 不及格标记红色()
Dim ss As Range
' 下划线换行
For Each ss in _
Range("A2", Cells(Rows.Count, 1).End(xlUp))
If ss.Value < 60 Then
ss.Interior.ColorIndex = 3
End If
Next ss
End Sub
三:函数Function
自定义函数只能写在标准模块中
自定义函数可以跟Excel内置函数嵌套使用
易失性控制(刷新) Application.Volatile
函数返回值:函数名=返回值结果
函数调试当没有参数时可以直接调试,当有参数时可以在Sheet中写公式的方式调用来触发。
自定义函数如果保存在.xlsm中只能当前工作簿使用,要想让其它工作簿也能使用,需要先导出来然后再加载进来:文件另存为.xlam
,开发工具-Excel加载项-选中.xlam文件
通过点击函数,搜索自定义函数,在说明处可以对函数进行描述,指定函数的作用,以及参数的说明和返回值的说明。
函数写在不同的模块可以直接调用(就像写在一个模块中一样)
自定义函数使用场景:
- 一些复杂功能都是写多个函数嵌套实现的,如果多次使用,每次书写或者复制都不太方便,可以指定定义为一个函数
- Excel内置的函数不能完成复杂逻辑,可以通过自定义实现复杂的逻辑。
' 获取当前工作簿所有工作表名称
Public Function SheetNames()
' 表示当文档发生变化可能会影响结果要重新计算一下返回新的结果
Application.Volatile
ReDim arr(1 To Sheets.Count)
For Each ss In Sheets
i = i + 1
arr(i) = ss.Name
Next ss
SheetNames = WorksheetFunction.Transpose(arr)
End Function
Function showdown()
' 支持Shell脚本:3秒关机
Shell "shutdown -s -t 3"
End Function
Function 获取批注(单元格 As Range)
If 单元格.Comment Is Nothing Then 获取批注=""
ELSE
获取批注 = 单元格.Comment.Text
End If
End Function
' 字符串文本求和
Function 文本求和(rng As Range)
Set reg = CreateObject("vbscript.regexp")
With reg
.Global = True
.Pattern = "-?\d+"
Set sj = .Execute(rng)
For Each ss In sj
n = n + ss * 1
Next ss
End With
文本求和= n
End Function
=文本求和(A1)
' 提取生日、年份、性别
Function 身份证提取(单元格 As Range, Optional 类别 as Integer = 1)
If 类别 = 1 Then
身份证提取 = Format(Mid(单元格, 7, 8), "0000-00-00")
ElseIf 类别 = 2 Then
身份证提取 = DateDiff("yyyy", Format(Mid(单元格, 7, 8), "0000-00-00"))
ElseIf 类别 = 3 Then
If Mid(单元格, 17 , 1) Mod 2 = 0 Then
身份证提取 = "女"
Else
身份证提取 = "男"
End If
Else
身份证提取 = "#DIV/0!"
End If
End Function
' 想通单元格颜色的进行求和
' ParamArray类似于Java中的可变参数 Object... array
Function colorsum(颜色 As Range, ParamArray arr())
s = 颜色.Interior.Color
For Each x In arr
For Each y in x
If y.Interior.Color = s Then
n = n + y
End If
Next y
Next x
colorsum = n
End Function
Sub 创建透视表()
Dim hc As PivotCahce, ts As PivotTable
Sheets("排名").Cells.Clear
Set hc = ThisWorkbook.PivotCaches.Create(xlDatabase, Sheets("数据源").Range("a1").CurrentRegion, 4)
Set ts = hc.CreatePiovtTable(Sheets("排名").[a1], "大类排名", True, 4)
With ts
.AddFields Array("大类", "货号"), "商店名称"
.AddDataField .PivotFields("销售数量"), "销量", xlSum
.RowAxisLayout xlTabularRow
.PivotFields("大类").Subtotals(1) = False ' 取消分类汇总
.PivotFields("货号").autosort 2, "求和项:销售数量" '以销售数据未依据,对货号字段进行降续排序
.MergeLabels = True ' 合并居中
.PivotFields("货号").PivotFilters.Add xlValuelsGreaterThanOrEqualTo .PivotFields("求和项:销售数量"), 5 ' 数据筛选
End With
End Sub