2013-03-21 19 views
0

我有一個Word VBA應用程序處理各種文檔以使它們具有一致的外觀(它們從另一個SW工具導出)。每種文檔類型都有一個「知道」如何進行轉換的類文件。如果添加了新的文檔類型,我會創建一個新的類文件,然後必須更新多個過程以添加對新類的引用。我想自動化發現和使用類文件的過程(它們都遵循命名約定)。下面是我收集的引用文件:在類文件中引用過程

Dim olVBCodeMod As VBComponents 
Dim olaClasses() As VBComponent 
Dim olVBCodeCmpt As VBComponent 

Const slCLASS_NAME_PREFIX = "clsXXXX" 

Set olVBCodeMod = Application.VBE.ActiveVBProject.Collection.Item("Normal").VBComponents 

ReDim olaClasses(0) 
For Each olVBCodeCmpt In olVBCodeMod 

    If olVBCodeCmpt.Type = vbext_ct_ClassModule Then 

     If InStr(olVBCodeCmpt.Name, slCLASS_NAME_PREFIX) = 1l Then 

      Set olaClasses(UBound(olaClasses)) = olVBCodeCmpt 
      ReDim Preserve olaClasses(UBound(otaClasses) + 1) 
     End If 
    End If 

Next 
ReDim Preserve olaClasses(UBound(otaClasses) - 1) 

不幸的是我沒有看到任何方式對類文件的引用要到能夠運行在類文件的程序,即olaClasses( 0).function1?

我的回退的方法,是要創造一個返回對象陣列(傳遞作爲參數)與每個類的引用的子:

Set olaClasses(0) = New clsXXXX 

這工作,例如olaClasses(0).function1給了我正確的反應,但它會整潔,能夠自動發現的類文件...

+0

我不清楚你的「自動發現」的情況是什麼樣子。你的「後備」句子在編程上沒有意義。像你一樣,如果你想調用一個類方法,New'關鍵字必須是解決方案的一部分。 – nunzabar 2013-03-21 21:42:18

+0

自動發現將從它運行的項目中收集相應的類文件(基於它們的名稱)。然後對於每個類文件,我將能夠調用對文檔進行操作的過程(其中之一是, 「這是我的文檔」)。這樣,如果我有一個新的文檔格式,我只需要添加一個新的類文件,其他的一切工作,沒有任何其他的變化。對於後備方案,使用New,將引用收集到一個數組中,該數組隨着添加新類而增長。然後我遍歷數組的內容。 – RunDeep 2013-03-21 23:05:35

回答

0

感謝您的評論,我覺得我現在和你在一起。所以你想要這樣的事情:

Public Sub FormatActiveDocument() 
    Dim className as String 
    className = "cls" & [ActiveDocumentDocType or whatever] 
    Dim docClass as Object 
    Set docClass = GetClass(className) 
    If (obj is Nothing) Then MsgBox("ERROR: Missing VBA class '" & className & "'.") 

    docClass.FormatDocument '<-- MAGIC HAPPENS HERE (via late binding) 
End Sub 

Private Function GetClass(className as String) as Object  
    Dim classes() as VBComponent 
    Set classes = ' [YOUR CODE]  
    For each obj as VBComponent In classes 
     If (obj.Name = className) Then 
      GetClass = obj 
      Exit Function 
     End If 
    Next 
    GetClass = Nothing 
End Function 
+0

不幸的是,這最終在我所做的地方,引用了類型爲vbext_ct_ClassModule,即docClass.Type = vbext_ct_ClassModule;它無法訪問文件中的過程。我必須對你的代碼做一些修改:If(obj is Nothing)'If(docClass is Nothing)'和'For each obj as VBComponent In classes' to'For Each obj In otaClasses'(obj has在VBA中處理數組時使用Variant)。我用集合替換了數組,因此obj可能是VBComponent,結果相同。 – RunDeep 2013-03-24 22:14:00

相關問題