一、自定义函数
(1)用“DEMO-1-打造新的函数” 演示自定义函数:例1,转美金函数,例2,根据性别生成称呼(function ch(st as string)),在工作表和vba中均能用;
(2)(可选)用“DEMO-2-日期转换”演示自定义日期转换函数,注意DateSerial(year, month, day)函数返回包含指定的年、月、日的 Variant (Date);
(3)用“DEMO-3-在工作表中调用VBA函数”演示,将vba函数用自定义函数方式转化到工作表使用;
(4)总结自定义函数的使用,是一组可重复使用的代码,可以在程序中的任何地方调用。Function   函数名(参数)   “函数体:函数名=······”    End Function   

二、带参数的sub过程

思考:Function和sub的定义非常类似,function定义时的()的作用是传递参数,定义sub过程时为什么也有()?原因在于sub也可带参数,使得sub代码可以重用
演示:用“DEMO-4-创建带参数的过程”演示生成新表的宏被设置参数后可调用,减少了代码量。

原方案代码:Sub cjb( )
Dim sht As Worksheet
For Each sht In Sheets
  If sht.Name = sheet1.range("a1") Then
    k = 1
  End If
Next
If k = 0 Then
Sheets.Add after:=Sheets(Sheets.Count)
Sheets(Sheets.Count).Name = range("a1")
End If

Sub cjb(str As String)
Dim sht As Worksheet
For Each sht In Sheets
  If sht.Name = str Then
    k = 1
  End If
Next
If k = 0 Then
Sheets.Add after:=Sheets(Sheets.Count)
Sheets(Sheets.Count).Name = str
End If

Sub abc2()
Call cjb(Sheet2.Range("a8"))
Sheet2.Select
End Sub

 

  但原解决方案仍有问题:要设置多个宏调用原宏,且调用所需参数传递较为麻烦。

    进一步解决方案如下代码所示,但注意此时调用宏不能加“call”,否则报错,研究后发现,若加了“call”,则运行该宏时则会在不运行前序代码的情况下直接运行call语句,
    造成程序无法识别其参数的问题,进而报错。具体原因尚待进一步分析。悬赏

Sub abc2()
    Dim k As String
    k = ActiveSheet.Name  '获取原表的表名
    mycell = Application.InputBox(prompt:="请选择单元格:", Type:=2)  '弹出选择单元格的输入框,返回字符串并传递给mycell
    cjb (mycell)       '该语句不能加“call”,否则会先运行call语句导致报错
Sheets(k).Select '返回原表c
End Sub

 三、使用加载宏工具
1、想将一个重复使用,怎么办?
(1)新建文件,将宏复制到该文件;
(2)另存该文件,选择“加载宏”的格式后,保存路径自动切换为“C:\Users\Administrator\AppData\Roaming\Microsoft\AddIns”,该路径不能更改,是excel默认的加载项路径;
(3)“开发工具”-->“加载项”-->确定后,excel主程序将一直嵌入该代码;
(4)关闭原文件后,新打开一个文件:“文件”-->“选项”-->“快速访问工具栏” -->选择“宏”-->添加“test”后确定
                        或-->“自定义功能区” -->选择“宏”-->按要求添加“test”、修改图标后确定(图标不能自定义,悬赏
(5)观察左上方的快速访问工具栏,多出来的按钮已可使用该宏。用“DEMO-6-无代码数据”和“DEMO-5-第四讲中的拆分文件”演示该按钮的作用。
(6)为避免以后打开vba后显示加载宏的代码,可“开发工具”-->“加载项”-->将该加载宏前的勾去掉并点确定。
2、可否用同样方式重复使用自定义函数
  重复上述步骤(1)--(3)即可。