如何爲 Excel 工作表函數創建 Visual Basic 自動化加載項

如何爲 Excel 工作表函數創建 Visual Basic 自動化加載項

<script type="text/javascript">loadTOCNode(1, 'summary');</script>
在 Microsoft Excel 2000 中,不能直接從工作表單元格公式中調用組件對象模型 (COM) 加載項中的函數,而是必須爲該 COM 加載項函數創建一個 Visual Basic for Applications (VBA) 包裝,以此來間接調用該函數。

在 Excel 2002 和更高版本中,COM 加載項(稱爲自動化加載項)的集成度已得到增強,現在可以直接從工作表公式中調用 COM 加載項函數而不需要 VBA 包裝。本文說明了如何使用 Visual Basic 創建一個自動化加載項,通過該加載項揭示那些能夠從 Excel 2002 或更高版本工作表公式中調用的函數。

更多信息

<script type="text/javascript">loadTOCNode(1, 'moreinformation');</script>

創建自動化加載項示例

<script type="text/javascript">loadTOCNode(3, 'moreinformation');</script>
1. 在 Visual Basic 中,開始一個新的 AddIn 項目。
2. 默認情況下,該項目中會添加一個名爲 frmAddIn 的窗體。爲了演示方便,可以從項目中刪除該窗體。在項目資源管理器中,右鍵單擊該窗體,然後單擊快捷菜單上的“刪除 frmAddIn”。
3. 在“項目”菜單上,單擊“MyAddin 屬性”。將“項目名稱”更改爲“AutomationAddin”,然後單擊“確定”。
4. 在項目資源管理器中,選擇“連接設計器”。將其“名稱”屬性更改爲“XLFunctions”。
5. 在項目資源管理器中,雙擊“XLFunctions”設計器。在“常規”選項卡上,對設計器設置進行如下更改:
從“應用程序”列表中,選擇“Microsoft Excel”。
從“應用程序版本”列表中,選擇“Microsoft Excel 10.0”。
注意:如果您使用的是 Microsoft Office Excel 2003,請從“應用程序版本”列表中選擇“Microsoft Excel 11.0”。
將“初始加載行爲”設置更改爲“按需加載”。
6. 在 XLFunctions 設計器仍然打開的情況下,從“視圖”菜單中選擇“代碼”。用以下代碼替代模塊中的代碼:
Option Explicit
Private Declare Function GetTickCount Lib "kernel32" () As Long

Dim oApp As Object  'The Excel Application object

Private Sub AddinInstance_OnAddInsUpdate(custom() As Variant)
   Exit Sub
End Sub

Private Sub AddinInstance_OnConnection(ByVal Application As Object, ByVal ConnectMode As AddInDesignerObjects.ext_ConnectMode, ByVal AddInInst As Object, custom() As Variant)
   Set oApp = Application
End Sub

Private Sub AddinInstance_OnDisconnection(ByVal RemoveMode As AddInDesignerObjects.ext_DisconnectMode, custom() As Variant)
   Set oApp = Nothing
End Sub

Private Sub AddinInstance_OnStartupComplete(custom() As Variant)
   Exit Sub
End Sub

Public Function TickCount() As Long
   '----------------------------------------------------------------------
   '** A volatile function that is called each time the sheet is calculated.
   '   Call with =TICKCOUNT().
   '----------------------------------------------------------------------
   oApp.Volatile
   TickCount = GetTickCount
End Function

Public Function Add1(Num1 As Variant, Num2 As Variant) As Variant
   '----------------------------------------------------------------------
    '** A function with two required arguments.
    '   Can be called with formulas such as =Add1(1,3) or =Add1(A1,A2).
   '----------------------------------------------------------------------
    On Error Resume Next
    Add1 = "The sum of " & Num1 & " and " & Num2 & " is " & _
        CDbl(Num1) + CDbl(Num2)
    If Err <> 0 Then Add1 = CVErr(2036)  'xlErrNum = 2036
End Function

Public Function Add2(Num1 As Variant, Num2 As Variant, Optional Num3 As Variant) As Variant
   '----------------------------------------------------------------------
   '** A function with two required arguments and a third optional argument.
   '   Can be called with formulas such as =Add2(1,2), =Add2(A1,A2,A3).
   '----------------------------------------------------------------------
    Dim Sum As Double, sMsg As String
    On Error GoTo Handler
    Sum = CDbl(Num1) + CDbl(Num2)
    If IsMissing(Num3) Then
        sMsg = "The sum of " & Num1 & " and " & Num2 & " is "
    Else
        Sum = Sum + CDbl(Num3)
        sMsg = "The sum of " & Num1 & ", " & Num2 & " and " & Num3 & " is "
    End If
    Add2 = sMsg & Sum
    Exit Function
Handler:
    Add2 = CVErr(2036)  'xlErrNum = 2036
End Function

Public Function Add3(ParamArray Nums()) As Variant
   '----------------------------------------------------------------------
   '** Demonstrates a function with a variable number of arguments.
   '   Can be called with formulas like =Add3(1), =Add3(1,2,3,4),
   '   or =Add3(A1,A2).
   '----------------------------------------------------------------------
    Dim Sum As Double, i As Integer
    On Error GoTo Handler
    For i = 0 To UBound(Nums)
        Sum = Sum + CDbl(Nums(i))
    Next
    Add3 = "The sum is " & Sum
    Exit Function
Handler:
    Add3 = CVErr(2036)  'xlErrNum = 2036
End Function

Public Function ReturnArray(nRows As Long, nCols As Long) As Variant
   '----------------------------------------------------------------------
   '** Demonstrates how to return an array of values (for use in Excel
   '   "array formulas").
   '   Can be called with a formula such as =ReturnArray(1,3).
   '----------------------------------------------------------------------
    On Error GoTo Handler
    ReDim a(0 To nRows, 0 To nCols) As Variant
    Dim r As Long, c As Long
    For r = 0 To nRows - 1
        For c = 0 To nCols - 1
            a(r, c) = "r" & r + 1 & "c" & c + 1
        Next c
    Next r
    ReturnArray = a
    Exit Function
Handler:
    ReturnArray = CVErr(2015)  'xlErrValue = 2015
End Function

Public Function GetArray(Nums As Variant) As Variant
   '----------------------------------------------------------------------
   '** Demonstrates how to use an array(or range of multiple cells) as
   '   a function argument.
   '   Can be called with formulas such as =GetArray(A1:B5), GetArray(A1),
   '   or GetArray({1,2,3;4,5,6}).
   '----------------------------------------------------------------------
    Dim Sum As Double, v As Variant
    On Error GoTo Handler
    If IsArray(Nums) Then
        For Each v In Nums
            Sum = Sum + CDbl(v)
        Next
    Else
        Sum = CDbl(Nums)
    End If
    GetArray = "The sum is " & Sum
    Exit Function
Handler:
    GetArray = CVErr(2036)  'xlErrNum = 2036
End Function

					
7. 將該加載項構建爲 AutomationAddin.dll。

在 Microsoft Excel 2002 或 Microsoft Office Excel 2003 中使用該自動化加載項示例

<script type="text/javascript">loadTOCNode(3, 'moreinformation');</script>
1. 如果在該 Visual Basic 加載項項目的“應用程序版本”列表中選擇的是“Microsoft Excel 10.0”,請啓動 Microsoft Excel 2002。
注意:如果在該 Visual Basic 加載項項目的“應用程序版本”列表中選擇的是“Microsoft Excel 11.0”,請啓動 Microsoft Office Excel 2003。
2. 在“工具”菜單上單擊“加載項”,以顯示“加載項管理器”對話框。單擊“自動化”,在列表中選擇“AutomationAddin.XLFunctions”,然後單擊“確定”。選擇“AutomationAddin.XLFunctions”,然後單擊“確定”以關閉“加載項管理器”對話框。
3. 在 A1 單元格中,鍵入以下公式:
=TickCount()
該公式返回一個大數,該數值代表自系統啓動以來所經過的毫秒數。
4. 在新工作簿的單元格 B1 和 B2 中,分別鍵入數值 2 和 5。
5. 在單元格 B3 中,鍵入下面的公式:
=Add1(B1, B2)
然後按 Enter。該公式返回“The sum of 2 and 5 is 7”。
6. 在單元格 B4 中,鍵入下面的公式:
=Add2(B1, B2)
然後按 Enter。該公式返回“The sum of 2 and 5 is 7”。修改公式以使用第三個可選參數:
=Add2(B1, B2, 10)
公式返回“The sum of 2, 5, and 10 is 17”。
7. 在單元格 B5 中,鍵入下面的公式:
=Add3(1,2,3,4,5,6)
然後按 Enter。公式返回“The sum is 21”。由於 Add3 函數的參數聲明爲 ParamArray,因此您可以對該函數使用可變數量的參數。

注意:Excel 限定單個工作表函數的參數不得超過 29 個。
8. 在單元格 B6 中,鍵入下面的公式:
=Add1("x","y")
然後按 Enter。公式返回 #NUM!(xlErrNum),這是因爲 CDbl 函數的類型轉換無法將字符串“x”和“y”轉換爲 double 類型。函數遇到運行時錯誤時的默認返回值爲 #VALUE!。如果希望返回不同的錯誤,請使用錯誤處理,這樣就可以返回任何 Excel 內置錯誤值(xlErrDiv0xlErrNAxlErrNamexlErrNullxlErrNumxlErrRefxlErrValue)。
9. 選擇單元格 E1:G5。鍵入以下公式:
=ReturnArray(5,3)
然後按 Ctrl+Shift+Enter 將公式輸入爲數組公式。函數返回唯一值的 5 x 3 數組。
10. 在 I1:J3 單元格輸入任意數。在單元格 I4 中,鍵入下面的公式:
=GetArray(I1:J3)
公式將返回與“The sum is n”類似的結果(此處的 n 是 I1:J3 中的數之和)。在 I5 中,鍵入下面的公式:
=GetArray({1,2,3,4})
然後按 Enter。公式返回“The sum is 10”。

函數綁定

<script type="text/javascript">loadTOCNode(3, 'moreinformation');</script> 自動化加載項中的函數綁定位於函數綁定優先級的末尾。如果自動化加載項中的某個函數與 Excel 內置函數同名,則 Excel 內置函數優先。工作簿和常規加載項 (.xla) 中的 VBA 函數也優先於自動化加載項函數。當您自己創建要在 Excel 中使用的函數時,建議函數名稱不要與 Excel 內置函數已使用的名稱相同。

要明確調用自動化加載項中的函數,可以使用諸如 ServerName.ClassName.FunctionName(...) 的語法在公式中明確指定函數。例如,要調用示例中的 Add1 函數,可以使用下面的語法:
=AutomationAddin.XLFunctions.Add1(1,2)
您只能調用自動化加載項的頂級方法和屬性;而不能深入該加載項的對象模型來調用非頂級的函數。

可變函數

<script type="text/javascript">loadTOCNode(3, 'moreinformation');</script> 可變函數是一種只要工作表上的任意單元格發生更改就重新計算的函數,而不考慮更改的單元格是否與函數有關。Excel 內部的可變函數的一個示例是 RAND() 函數。按 F9 時,可變函數也會重新計算。

要使自動化加載項中的函數可變,請調用 Excel Application 對象的 Volatile 方法。正如以上示例代碼所演示的那樣,在加載項的 OnConnection 事件期間,可能會檢索對 Excel Application 對象的引用。該自動化加載項示例中的 TickCount 函數就是可變函數。請注意,如果對工作表上的任意單元格進行了更改或按了 F9,包含以下公式的單元格:
=TickCount()
將重新計算。

自動化加載項和加載項管理器

<script type="text/javascript">loadTOCNode(3, 'moreinformation');</script> 在加載項管理器中,自動化加載項的 HKEY_CLASSES_ROOT/<ProgID> 註冊表項的默認值用於加載項的名稱。請注意,在 Visual Basic 用戶界面 (UI) 中沒有屬性能夠設置此項的默認值;然而,可以在註冊表編輯器中或在安裝加載項期間手動修改此項。

加載項管理器中的自動化加載項的說明始終作爲加載項的 ProgID;這一點無法更改。

自動化加載項和函數嚮導

<script type="text/javascript">loadTOCNode(3, 'moreinformation');</script> 在 Excel 函數嚮導中,每個自動化加載項都有它自己的類別。類別名稱是加載項的 ProgID;不能爲自動化加載項函數指定其他類別名稱。此外,在函數嚮導中無法指定函數說明、參數說明或自動化加載項函數幫助。

參考

<script type="text/javascript">loadTOCNode(1, 'references');</script>
有關其他信息,請單擊下面的文章編號,查看 Microsoft 知識庫中相應的文章:
256624 (http://support.microsoft.com/kb/256624/) 如何將 COM 加載項函數用作 Excel 工作表函數
有關更多信息,請訪問下面的 Microsoft 網站:
http://support.microsoft.com/ofd (http://support.microsoft.com/ofd)
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章