一:简介

有两种基本类型的模块:标准模块和类模块。模块中的每个过程可能是函数过程,也可能是子程序。

模块:它是作为一个单元保存在一起的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

VBA Module模块(自定义函数)_自定义函数

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