在Excel中将用户定义的函数(UDF)添加到内置类别中

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

有什么办法可以:

  1. 保持公开的function(所以可以从其他模块调用),但将其隐藏Excelfunction向导?
  2. 使function出现在一个内置的类别(例如,“财务”,“统计”,“逻辑”)?
  3. 创build我自己的类别(例如,“无意义的”)并让我的function出现在那里?

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

注意:如果社区觉得这样更合适,我会很乐意把它分成三个单独的问题。 我想这三个问题可能只有一个单一的答案,只有轻微的变化。

Application.MacroOptions是您之后的命令

本示例将名为TestMacro的用户定义的macros添加到名为“ 我的自定义类别”的自定义类别

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

有没有办法保持公开的function(所以可以从其他模块调用),但将其从Excelfunction向导隐藏?

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

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

我在一个foonote中回答了关于VBAdate函数的问题 :这里直接复制粘贴了我写的东西,使用VB的'Attribute'语句创build函数描述和一个Function Wizard类别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"

如果您喜欢在date和时间function下看到它,请使用“w \ n2”:在您自己的代码中使用“已定义”function和所有由人开发的第三方加载项谁不足以帮助偶尔的用户。

我不知道这是否仍然在Office 2010中的作品。

…这就是我所能build议的。 VBA开发人员不能真正访问函数向导类别和关联的函数(和参数!)描述符。 其中一些可用于老派的VB编码器,他们可以在IDE中访问VB.Attribute语句; 并且可以通过一些文本文件操作将其分类到代码中。

公共函数只对Excel的公式栏可见,它们驻留在“常规”* .bas模块中。 属于类的公共函数对于编辑栏不可见。 如果将这一点与我们可以模拟静态类的事实一起添加,就可以有效地隐藏函数。

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

例如,创build一个名为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