【问题标题】:Add user-defined function (UDF) to built-in category in Excel将用户定义函数 (UDF) 添加到 Excel 中的内置类别
【发布时间】:2014-11-22 13:35:15
【问题描述】:

当我将公共函数添加到 Excel 中的标准代码模块时,它会显示在“用户定义”类别中的“插入函数”向导中。

有什么办法:

  1. 保持函数公开(以便可以从其他模块调用)但在 Excel 函数向导中隐藏它?
  2. 让函数显示在内置类别中(例如,“财务”、“统计”、“逻辑”)?
  3. 创建我自己的类别(例如,“无意义”)并让我的函数出现在那里?

我只需要能够使上述情况之一工作,但我很想知道是否每一个都可行。

注意:如果社区认为这更合适,我很乐意将其分成三个单独的问题。我想可能只有一个答案,三个问题之间只有细微的差别。

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    有什么方法可以 [...] 保持函数公开(以便可以从其他模块调用)但在 Excel 函数向导中隐藏它?

    Option Private Module 放在模块顶部。完成。

    http://msdn.microsoft.com/en-us/library/aa266185(v=vs.60).aspx

    【讨论】:

      【解决方案2】:

      Application.MacroOptions 是您要执行的命令

      此示例将名为 TestMacro 的用户定义宏添加到名为 My Custom Category 的自定义类别中。

      Function TestMacro()
          MsgBox ActiveWorkbook.Name
      End Function
      
      Sub AddUDFToCustomCategory()
          Application.MacroOptions Macro:="TestMacro", Category:="My Custom Category"
      End Sub
      

      【讨论】:

      • 这在您编写时不起作用。类别正在寻找一个整数。从帮助文件中:Category 可选Variant。一个整数,用于指定宏函数类别(例如,财务、日期和时间或用户定义)。
      • Category 也可以带一个字符串,如果它不匹配一个内置的定义,它会创建一个新的category
      • 那我一定是做错了什么,因为当我尝试使用字符串运行它时,我得到一个“运行时错误'1004':对象'_Application'的方法'MacroOptions'失败”。如果我传递一个整数(例如 1),它将成功运行。
      • 可能与版本有关。我正在使用 Excel 2007
      • @mwolfe02:对于整数值,请参阅此链接msdn.microsoft.com/en-us/library/bb209988%28v=office.12%29.aspx
      【解决方案3】:

      我在a question about VBA Date functions 的脚注中回答了这个问题:这是我在那里写的内容的直接复制和粘贴,关于使用 VB 'Attribute' 语句创建函数描述和函数向导类别 ID em>:

      给仍在使用 Excel 2003 的人的提示:

      如果您(或您的用户)要从工作表中调用 IsDateEx(), 将这两行放在函数头的正下方,使用 导出的 .bas 文件中的文本编辑器并重新导入文件,因为 VB 属性很有用,但代码无法访问它们 Excel 的 VBA IDE 中的编辑器:

      Attribute IsDateEx.VB_Description = "Returns TRUE if TestDate is a date, and is within ± 20 years of the system date.\r\nChange the defaulte default ± 20 years boundaries by setting values for LimitPastDays and LimitFutureDays\r\nIf you are checking an array of dates, ALL the values will be tested: set FirstColumnOnly TRUE to check the leftmost column only."

      只有一行:看 退出浏览器插入的换行符! ...而这条线, 将 isDateEX 放入“信息”类别中的函数向导中, 与 ISNUMBER()、ISERR()、ISTEXT() 等一起:

      Attribute IsDateEx.VB_ProcData.VB_Invoke_Func = "w\n9"

      如果您希望在日期和时间功能下看到它,请使用“w\n2”: 在“使用定义的”函数的泥沼中击败地狱失去它 来自您自己的代码,以及由您开发的所有第三方加载项 那些在帮助临时用户方面做得不够的人。

      我不知道这在 Office 2010 中是否仍然有效。

      ...这就是我能建议的全部。 VBA 开发人员无法真正访问函数向导类别和相关的函数(和参数!)描述符。其中一些适用于老式 VB 编码人员,他们可以在 IDE 中访问 VB.Attribute 语句;并且您可以通过一些文本文件操作将其放入您的代码中。

      【讨论】:

      • +1 这是 2007 年前 Excel 的绝佳信息。我将另一个答案标记为已接受,因为它应该适用于更多人。不过,我感谢您抽出时间发布此信息,因为很难获得信息。
      【解决方案4】:

      公共函数仅对 Excel 的公式栏可见,它们位于“常规”*.bas 模块中。属于类的公共函数对编辑栏不可见。如果再加上我们可以模拟静态类的事实,就可以有效地隐藏函数。

      如果你创建一个类模块然后导出它,你会在标题中找到Attribute VB_PredeclaredId = False。将此设置为 true 会创建该类的默认全局实例,该实例可以像更现代语言中的静态类一样使用。

      例如,创建一个名为Math 的新类模块并将此函数添加到其中。

      Public Function Add(a As Integer, b As Integer) As Long
          Add = a + b
      End Function
      

      导出并删除文件,然后在记事本中打开它。将预先声明的 Id 更改为 true。

      VERSION 1.0 CLASS
      BEGIN
        MultiUse = -1  'True
      END
      Attribute VB_Name = "Math"
      Attribute VB_GlobalNameSpace = False
      Attribute VB_Creatable = False
      Attribute VB_PredeclaredId = True
      Attribute VB_Exposed = False
      

      保存并将文件导入回您的项目中。

      现在,在常规模块中,您可以使用限定调用来调用函数。就像任何其他类方法一样。只是现在,我们有一个可以使用的类的默认实例。与NewSet 无关,它可以正常工作。

      Sub Test()
          Debug.Print Math.Add(1,2)
      End Test
      

      【讨论】:

        猜你喜欢
        • 2012-12-07
        • 2020-06-21
        • 2019-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多