ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 5995|回复: 9

注册自定义函数 说明信息

[复制链接]

TA的精华主题

TA的得分主题

发表于 2013-8-3 00:57 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:自定义函数开发
Public Sub gRegisterUDF(ByVal FunctionName As String, _
                        ByVal Category As String, _
                        ByVal Description As String, _
                        ByVal Args As String, _
                        ByVal DescriptionArgs As String)

    Application.ExecuteExcel4Macro _
            "REGISTER(""" & mGetSys32Path() & "\user32.dll"",""CharPrevA"",""PPP"",""" _
                        & FunctionName & """,""" & Args & """,1" _
                        & ",""" & Category & """,,,""" & Description & """," & DescriptionArgs & ")"
End Sub

Private Function mGetSys32Path() As String
    Dim sReturn As String, lReturn As Long
    sReturn = Space(255)
    'Get the system directory,GetSystemDirectory这个函数能取得Windows系统目录(System目录)的完整路径名
    lReturn = GetSystemDirectory(sReturn, 255)
    'Remove all unnecessary chr$(0)'s
    sReturn = Left$(sReturn, lReturn)
    'Show the windows directory
    mGetSys32Path = sReturn
End Function

********************

Call gRegisterUDF(FunctionName:="UDFName", _
                      Category:=11, _
                      Description:="中文”", _
                      Args:="Target,Multi,Duality,Ignore,Separator", _
                      DescriptionArgs:="""字符串"",""选项"",""是否"",""是否忽略"",""自定义符 """)

    'Application.MacroOptions Macro:="UDFName", Description:="中文" + Chr(10) + "例如:”", Category:=11






评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2013-9-19 17:05 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-11-5 14:15 | 显示全部楼层
如何在Excel中使用VBA注册自定义函数说明?
http://www.excelpx.com/forum.php?mod=viewthread&tid=240488

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) <> "Range" Then SumVisibleCell = 0: Exit Function
    If TypeName(Rng2) <> "Range" Then 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 = Nothing
End 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

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-11-5 14:29 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
给自定义函数添加说明的几种方法.rar (179.73 KB, 下载次数: 317)

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-11-5 15:34 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2014-9-10 12:13 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2016-8-19 11:18 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
EXCEL 2013 + Win 8,运行后提示没有GetSystemDirectory这个函数

TA的精华主题

TA的得分主题

发表于 2023-5-25 11:37 | 显示全部楼层
您好,提问一下
Application.MacroOptions
请问这个方法有没反注册的方法,还没测试,怕注入之后不能删除
谢谢

TA的精华主题

TA的得分主题

发表于 2023-6-1 12:57 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2023-6-1 13:11 | 显示全部楼层
如果系统用得office 64位,Function mGetSys32Path() 这个函数取得的user32.dll还是是对的嘛?还是说64位mso和32位mso的注册dll都是user32.dll?希望得到回复指教
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-26 22:00 , Processed in 0.043299 second(s), 16 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表