2

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

有没有办法:

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

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

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

4

4 回答 4

4

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

放在Option Private Module模块的顶部。完毕。

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

于 2014-11-22T05:35:15.867 回答
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
于 2012-06-21T19:42:04.260 回答
2

我在一个关于 VBA 日期函数的问题的脚注中回答了这个问题:这是我在那里写的关于使用 VB '属性' 语句创建函数描述和函数向导类别 ID的直接复制和粘贴:

给仍在使用 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 语句;您可以通过一些文本文件操作将其滑入您的代码中。

于 2012-07-06T16:58:05.407 回答
2

公共函数仅对 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

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

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

Sub Test()
    Debug.Print Math.Add(1,2)
End Test
于 2014-11-20T21:56:14.353 回答