Excel实例下载
  VBA  应用教程
    数据库SQL知识
设为首页
给自定义函数添加说明的几种方法
作者:李宏业 | 来源:开心网Excel VBA 深入探讨群 | 时间:2009-05-02 | 阅读权限:游客 | 会员币:0 | 【

环境:

Excel 2007

涉及的群附件:

FuncL.xla自定义函数加载宏

vba.RegisterUDF.xls注册自定义工作表函数

参考:

http://www.j-walk.com/ss/excel/eee/eee009.txt

ebook.Excel (4.0) 2000 Macro Function Help File(en).rar

目的:

1) 学会如何创建 Excel 加载宏

2) 学会如何增加本机可公用的自定义工作表函数

3) 掌握为自定义工作表函数添加说明的几种方法

背景:

源自 "Excel 技巧群" 的回复:

http://www.kaixin001.com/group/topic.php? gid=4254&tid=9194845

此问题主要是针对在 Excel 2007 环境下, 对于自己开发的并放在加载宏文件(.xlam)里的自定义函数, 在使用时(单元格中输入自定义的函数名时), Excel 并没有给予概要信 息的提示.

这个问题很好测试, 对于Excel 内置的工作表函数, 在输入函数名称时, Excel 会自动给出提示. 比如, 当输入 = S 后, 会有如下图提示:

也就是说 Excel 会将以 S 开关的工作表函数以列表的形式展示出来, 供使用者快速并友好的提示.

但是对于接下来的这种情况, Excel 却不再友好了. 假设我已经安装 Excel 加载宏文件 FuncL.xla , FuncL.xla 中有一个工作表函数 SplitText. 之后新建一个 Excel 工作薄, 在 Sheet1 中输入 = S, 结果 Excel 并没给出提示.

接下来将完整地演示如何制作一个可以让 Excel 出现提示的自定义工作表函数.

首先, 我们先创建一个 Excel 加载宏文件:

  1) 新建一个 Excel 工作薄, 按 Alt + F11 转至 VBE 窗口, 点击菜单 "插入/模块", 在打开的 "模块1" 代码窗口中我们将添加一个自定义工作表函数 SplitText. 把下面的代码复制过去:

   Public Const funlDirectionByRow = 1
   Public Const funlDirectionByColumn = 0

   Public Function SplitText( _
           ByVal Text As String, _
           Optional ByVal Delimiter As String = ",", _
           Optional ByVal Direction = funlDirectionByColumn) As Variant

       If Trim(Text) = "" Then
           vReturn = ""
       Else
           vReturn = Split(Text, Delimiter)
       End If
   
       If Direction = funlDirectionByRow Then
           SplitText = vReturn
       Else
           SplitText = Application.WorksheetFunction.Transpose(vReturn)
       End If
   
   End Function

   2) 关闭 VBE 窗口回到 Excel 界面, 按 Ctrl + S 保存工作薄, 在弹出的 "另存为" 对话框中选择 "Microsoft Office Excel 加载宏(*.xla)" 文件类型, 输 入文件名 "FuncL", 点击 "确定". 这时 Excel 会在默认的 AddIn 位置保存 FuncL.xla. 保存成功后关闭 Excel.

   3) 重新打开 Excel, 并安装 FuncL.xla. 对于 Excel 2007 请点击 "Excel 选项/加载项", 在 "管理" 中选择 "Excel 加载项" 并点击 "转到"; 对于 Excel 2003 及之前版本请点击 "工具/加载宏". 在弹出的窗口中勾选上 "FuncL". 至此, Funcl.xla 已经安装成功.

  

   至此, 学习目的 1 和学习目的 2 已经可以达成.

   如何使用 SplitText 呢? 很简单, 在任何一个打开的 Excel 文件中都已经可以使用 SplitText 工作表函数了.

接下来就介绍一下如何注册自定义工作表函数:

   对于上面定义的 SplitText 其实 Excel 会为它自动注册为 "自定义" 类别的工作表函数, 请看下图:

  

   但有点遗憾的是没有函数说明, 而且当点击 "确定" 按钮时, 也没有参数说明: 

  

   如果能像 Excel 内置函数那样给予准确的函数说明及参数说明就显示更加专业了.

   方法1: 添加函数说明, 不能设置函数分类, 不能添加参数说明

   当我们还没将 FuncL 工作薄保存为加载宏(xla)文件之前可以在 VBE 中为 SplitText 函数添加函数说明, 具体方法:

      1) 在 VBE 界面中按 F2 打开对象浏览器窗口

      2) 在 "工程/库" 下拉列表框中选择 VBAProject,

     

      3) 这时在 "类" 列表中就会显示出 VBAProject 库下的所有模块及类模块, 在列表中点击 "模块1", 就会在 "模块1" 的成员列表中显示出 "模块1" 的所有成员:

     

      4) 用鼠标右键点击 "SplitText", 并点击 "属性". 这时弹出 "成员选项" 对话框:

     

      在 "描述" 中可以输入函数的说明, 输入完成后, 点击 "确定".

      5) 关闭 VBE 窗口回到 Excel 界面, 这里点击公式编辑栏上的 fx 就会看到函数的说明信息了

     

      但此方法仍然没办法设置函数的参数说明信息.

   方法2: 添加函数说明, 可设置函数分类, 不能添加参数说明

   Excel 对象模型中的 Application 对象提供一个方法 MacroOptions, 利用此方法不仅可以设置函数说明, 同时可以设置函数分类. 格式如下:

   MacroOptions(Macro, De script ion, HasMenu, MenuText, HasShortcutKey, ShortcutKey, Category, StatusBar, HelpContextID, HelpFile)

   其中的部分参数:

      Macro: 函数名

      De script ion: 函数说明

      Category: 函数类别. 可以是自定义的类别名称, 也可以是数值, 其中值对应的类别:

          1 财务
          2 日期与时间
          3 数学与三角函数
          4 统计
          5 查找与引用
          6 数据库
          7 文本
          8 逻辑
          9 信息
         10 命令
         11 自定义
         12 宏控件
         13 DDE/ 外部
         14 用户定义
         15 第一个自定义类别
         16 第二个自定义类别
         17 第三个自定义类别
         18 第四个自定义类别
         19 第五个自定义类别
         20 第六个自定义类别
         21 第七个自定义类别
         22 第八个自定义类别
         23 第九个自定义类别
         24 第十个自定义类别
         25 第十一个自定义类别
         26 第十二个自定义类别
         27 第十三个自定义类别
         28 第十四个自定义类别
         29 第十五个自定义类别
         30 第十六个自定义类别
         31 第十七个自定义类别
         32 第十八个自定义类别
        

   对于本示例可以键入下面一行语句:

   application.MacroOptions(Macro:="SplitText", De script ion:="分隔字符串,并返回一个二维数组(只包含一行或一列)。",Category:=7)

   当此语句被运行后, 我们再看一下 "插入函数 fx" 对话框:

  

   这时已经发现 SplitText 有了自己的函数说明, 并且把它归为 "文本" 类型.

   方法3: 添加函数说明, 可设置函数分类, 可添加参数说明

   这里借用了一下 Excel Macro 4.0 的 Register 宏函数, 而通过 Application 的 ExecuteExcel4Macro 方法来调用 Excel 的宏函数命令. 请将下面代码粘贴 至任意工作薄的一个模块中:

   Public Sub gRegisterUDF( _
       ByVal FunctionName As String, _
       ByVal Category As String, _
       ByVal De script ion As String, _
       ByVal Args As String, _
       ByVal De script ionArgs As String)

       Application.ExecuteExcel4Macro _
           "REGISTER(""" & mGetSys32Path() & "\user32.dll"",""CharPrevA"",""PPP"",""" _
           & FunctionName & """,""" & Args & """,1" _
           & ",""" & Category & """,,,""" & De script ion & """," & De script ionArgs & ")"

   End Sub

   上面的方法可以自动注册一个 Excel 自定义工作表函数, 其中参数:

   FunctionName: 工作表函数名
   Category: 函数类别

   De script ion: 函数说明

   Args: 参数列表. 参数之间用 "," 分隔

   De script ionArgs: 参数说明.参数说明之间用 "," 分隔


   甚至我们可以利用 Unregister 宏函数注销一个工作表函数, 让函数仅在需要的时候出现在 "插入函数" 对话框中. 注销函数代码如下:

   Public Sub gUnregisterUDF( _
       ByVal FunctionName As String)

       With Application
           .ExecuteExcel4Macro "UNREGISTER(" & FunctionName & ")"
           .ExecuteExcel4Macro "REGISTER(""" & mGetSys32Path() & "\user32.dll""" & _
            ",""CharPrevA"",""P"",""" & FunctionName & """,,0)"
           .ExecuteExcel4Macro "UNREGISTER(" & FunctionName & ")"
       End With
   End Sub

   注册 SplitText 的示例:

   Call gRegisterUDF( _
        FunctionName:="SplitText", _
        Category:="文本", _
        De script ion:="分隔字符串,并返回一个二 维数组(只包含一行或一列)。", _
        Args:="Text, Delimiter, Direction", _
        De script ionArgs:="""字符串"",""分隔符(默认为半角的逗号) "",""返回数组的方向(0 - 列方向; 1 - 行方向) """)

   运行完上面一行代码后我们再来看一下 "插入函数" 的参数说明界面:

  

   发现参数的说明已经出现了.

   而且通过此方法可以在任意 Excel 文件中输入 = Sp 出现 SplitText 的函数提示:

  

   一切问题全部解决!

   完整的代码请参见: vba.RegisterUDF.xls

附: Register 和 Unregister 宏函数参考

REGISTER

Macro Sheets Only

Registers the specified dynamic link library (DLL) or code resource and returns the register ID. You can also specify a custom function name and argument names that will appear in the Paste Function dialog box. If you register a command (macro_type = 2), you can also specify a shortcut key. Because Microsoft Excel for Windows and Microsoft Excel for the Macintosh use different types of code resources, REGISTER has a slightly different syntax form when used in each operating environment.

Important   This function is provided for advanced users only. If you use the CALL function incorrectly, you could cause errors that will require you to restart your computer.

Syntax 1

For Microsoft Excel for Windows

REGISTER(module_text, procedure, type_text, function_text, argument_text, macro_type, category, shortcut_text, help_topic, function_help, argument_help1, argument_help2,...)

Syntax 2

For Microsoft Excel for the Macintosh

REGISTER(file_text, resource, type_text, function_text, argument_text, macro_type, category, shortcut_text, help_topic, function_help, argument_help1, argument_help2,...)

Module_text or file_text    is text specifying the name of the DLL that contains the function (in Microsoft Excel for Windows) or the name of the file that contains the code resource (in Microsoft Excel for the Macintosh).

Procedure or resource    is text specifying the name of the function in the DLL (in Microsoft Excel for Windows) or the name of the code resource (in Microsoft Excel for the Macintosh). In Microsoft Excel for Windows, you can also use the ordinal value of the function from the EXPORTS statement in the module-definition file (.DEF). In Microsoft Excel for the Macintosh, you can also use the resource ID number. The ordinal value or resource ID number should not be in text form.

This argument may be omitted for stand-alone DLLs or code resources. In this case, REGISTER will register all functions or code resources and then return module_text or file_text.

Type_text    is text specifying the data type of the return value and the data types of all arguments to the DLL or code resource. The first letter of type_text specifies the return value.

Function_text    is text specifying the name of the function as you want it to appear in the Paste Function dialog box. If you omit this argument, the function will not appear in the Paste Function dialog box.

Argument_text    is text specifying the names of the arguments you want to appear in the Paste Function dialog box. Argument names should be separated by commas.

Macro_type    specifies the macro type: 1 for a function or 2 for a command. If macro_type is omitted, it is assumed to be 1 (function).

Category    specifies the function category in the Paste Function dialog box in which you want the registered function to appear. You can use the category number or the category name for category. If you use the category name, be sure to enclose it in double quotation marks. If category is omitted, it is assumed to be 14 (User Defined).

文章录入:admin | 浏览次数:
相关评论(以下网友评论只代表其个人观点,不代表Excel吧的观点或立场)
相关信息

关于本站 | 留言本站 | 友情连接 | 后台管理
Copyright © 2005 - 2008 Excel吧 Inc. All Rights Reserved.
HxCms Ver9.0  闽ICP备06001689号
关闭此窗口