Excel中VBA自定义函数 如何出现在函数向导中, 以及怎么自定义函数对话框中的参数说明

2021年7月5日15:47:59Excel中VBA自定义函数 如何出现在函数向导中, 以及怎么自定义函数对话框中的参数说明已关闭评论 1,930 views
微信公众号 【EXCEL880】 QQ群【341401932】
课程咨询 加我微信EXCEL880B 试学网址http://v.excel880.com

最好的udf函数参数提示说明清使用xll形式

https://www.bilibili.com/video/BV12Z4y1e7xk/

1、REGISTER函数:
语法:REGISTER(module_text,procedure,type_text,function_text,argument_text,macro_type,category,shortcut_text,help_topic, function_help,argument_help1,argument_help2,…)

Module_text 或 file_text 是一个文字,用于指定DLL中函数的名字。
Procedure 或 resource 是一个文字,用于指定DLL中函数的名字。在Microsoft Excel for Windows中,也可以在模块定义文件(.DEF)中从EXPORTS语句中使用函数的序号。此参数对于stand-alone的DLLS或代码源可以省略。这种情况下,RESGITER将注册所有的函数或代码源并返回Module_text或file_text。
Type_text 是一个文字,用于指定返回值的数据类型和DLL或代码源所有参数的数据类型。Type_text的第一个字母指定返回值。Type_text所使用的代码在工作表函数引用附录中的“使用CALL和REGISTER函数”或联机帮助中的使用 CALL 和 REGISTER 函数中加以描述。对于stand-alone的DLLS或代码源,可以省略此参数。
Function_text 是一个文字,用于指定要出现在函数指南中的函数的名字。如果缺省此参数,此函数将不出现在函数指南中。
Argument_text 是一个文字,用于指定要出现在函数指南中的函数的名字。参数名须用逗号隔开。
Macro_type 指定宏的类型:1指函数而2指命令。如果缺省,则默认值为1(函数)。
Category 指定能显示注册函数的函数指南中的函数分类。可以使用Category的分类号或分类名。如果使用分类号,移动要用双引号括起来。如果Category缺省,默认值为14 (用户自定义)。 Category对应的值分别如下:

Category ID 分类名
1 金融
2 日期和时间
3 算术和三角
4 文字
5 逻辑
6 查看和矩阵
7 数据库
8 统计
9 信息
10 命令(只用于宏表)
11 操作(只用于宏表)
12 自定义(只用于宏表)
13 宏控制项(只用于宏表)
14 用户自定义

Shortcut_text 是一个字符,用于指定注册命令的快捷键。快捷键区分大小写。此参数仅可用于macro_type=2(命令)。如果Shortcut_text缺省,命令就无快捷键。
Help_topic 指帮助文件的引用(包括路径),这在用户自定义函数显示时,选择[帮助]按钮时会出现。
Function_help 是一个文字串,描述从函数指南中选定的自定义函数。字符最多可以到255个。
Argument_help1, argument_help2 是从1到21的文字串,用于描述函数在中选定的自定义函数的参数。

2、UNREGISTER函数:
语法1:UNREGISTER(register_id)

Register_id 指由REGISTER或REGISTER.ID函数返回的注册号码,与要从内存中移去的函数和代码源相对应。
Microsoft Excel记录注册的函数和代码源的次数。这个数字被称为注册号码。每次取消一个函数或代码源的注册,其注册号码就减少一个。当注册号码等于0时,Microsoft Excel
释放分配的内存。所以,如果注册了一个函数或代码源超过一次时,就必须使用与UNREGISTER相应的号码来确保注册被完全取消。

语法2:UNREGISTER(module_text)

Module_text or file_text 是文字,指定动态链接库(DLL)的名字,它包含了一个函数。
如果使用这种形式的语法,所有在DLL(或文件中的所有代码源)中的函数立即取消注册,而不管其注册号码。

二、注册自定义函数说明:在了解了Register及Unregister的语法后,下面我将用实例说明如何注册自定义函数说明。
首先我们建立一个modUDFs.bas模块,定义一个自定义函数:SumVisibleCells:

Private Function SumVisibleCell(ByVal Rng1 As Range, Optional ByVal Rng2 As Range) As Double    Dim rng As Range    If TypeName(Rng1) <> "RangeThen SumVisibleCell = 0: Exit Function    If TypeName(Rng2) <> "RangeThen SumVisibleCell = 0: Exit Function    Application.Volatile    '标志为易失性函数    For Each rng In Rng1        If rng.EntireRow.Hidden = False And rng.EntireColumn.Hidden = False Then            SumVisibleCell = SumVisibleCell + rng.Value        End If    Next rng    If Not IsMissing(Rng2) Then '如果Rng2不为空,则求Rng2中的单元格之和        For Each rng In Rng2            If rng.EntireRow.Hidden = False And rng.EntireColumn.Hidden = False Then                SumVisibleCell = SumVisibleCell + rng.Value            End If        Next rng    End If    Set rng = NothingEnd Function

注册自定义函数说明的过程:

Sub RegisterFunc()    Dim iRow As Integer, DllName As String, DllProc As String, ArgDesc As String, Args As String    Dim FuncName As String, FDesc As String, Arg1 As String, Arg2 As String
On Error Resume Next    DllName = "C:\Windows\System32\user32.dll"  '引用user32.dll    DllProc = "ActivateKeyboardLayout"  '引用user32.dll的内部函数名    FuncName = "SumVisibleCells"    '要注册的函数名    FDesc = "返回可见单元格之和"    '函数说明    Args = "rng1,rng2"  '函数参数    Arg1 = "单元格区域'函数参数1说明    Arg2 = "单元格区域'函数参数2说明    ArgDesc = "" & Arg1 & """,""" & Arg2 & """" '联合两个参数说明作为Register函数的一个参数    '注册函数    Application.ExecuteExcel4Macro _                "REGISTER(""" & DllName & """,""" & DllProc & """,""P#"",""" & FuncName & """,""" _                & Args & """,1,14,,,""" & FDesc & """,""" & ArgDesc & """)"    Application.Volatile    '标志为易失性函数End Sub

取消自定义函数说明的过程:

Sub UnRegisterFunc()    Dim iRow As Integer, FuncName As String    Dim DllName As String, DllProc As String
On Error Resume Next    DllName = "C:\Windows\System32\user32.dll"   '引用user32.dll    DllProc = "ActivateKeyboardLayout"  '引用user32.dll的内部函数名    FuncName = "SumVisibleCells"   '已注册的函数名    '取消函数注册    Application.ExecuteExcel4Macro "UNREGISTER(" & FuncName & ")"    Application.ExecuteExcel4Macro _                     "REGISTER(""" & DllName & """,""" & DllProc & """,""P#"",""" & FuncName & """,,0)"    Application.ExecuteExcel4Macro "UNREGISTER(" & FuncName & ")"End Sub

好了,这时你返回到Excel中,试用下刚才自定义的函数,是不是有了跟Excel自带的函数一样都有了参数说明了呢?
如果在使用中,需要打开或关闭工作簿时就注册或反注册自定义函数,那么就在ThisWorkbook中加入如下代码:

Private Sub Workbook_BeforeClose(Cancel As Boolean)    Call UnRegisterFunc '反注册自定义函数说明End Sub
Private Sub Workbook_Open()    Call RegisterFunc   '注册自定义函数说明End Sub

表格 定制  数据 合并 处理 分析 VBA 编程 开发 网页