簡體   English   中英

將用戶定義的函數(UDF)添加到Excel中的內置類別

[英]Add user-defined function (UDF) to built-in category in Excel

當我向Excel中的標准代碼模塊添加公共函數時,它將顯示在“全部”類別“用戶定義”的“插入函數”向導中。

有沒有辦法:

  1. 保持函數公共(因此可以從其他模塊調用)但是將其從Excel函數向導中隱藏?
  2. 使功能顯示在內置類別中(例如,“財務”,“統計”,“邏輯”)?
  3. 創建我自己的類別(例如,“荒謬”)並讓我的功能出現在那里?

我只需要能夠使上述案例中的一個起作用,但我很想知道每個案例是否可行。

注意:如果社區認為更合適,我很樂意將此分為三個單獨的問題。 我想可能只有一個答案,三個問題之間只有輕微的變化。

有沒有辦法[...]保持函數公開(所以它可以從其他模塊調用)但是從Excel函數向導中隱藏它?

Option Private Module放在Option Private Module的頂部。 完成。

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

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

我在文章中回答了關於VBA日期函數的問題 :這里是我在那里寫的內容的直接復制和粘貼,使用VB'Attribute'語句來創建函數描述和函數向導類別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語句; 你可以通過一些文本文件操作將它分類到你的代碼中。

公共函數僅對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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM