2010-10-20 66 views
4

跨越VBA模塊管理常用用戶定義類型的最佳方式是什麼?跨各種模塊管理用戶定義類型

我在不同的模塊使用相同的用戶定義的類型。例如,我經常需要表示(X,Y)點,所以我最終具有該Type在不同的模塊:

Type XYpointType 
    x As Double 
    y As Double 
End Type 

我通過XYpointType類型的參數,並從在不同的模塊潛艇和功能。

不過,我懷疑這是管理用戶定義類型的不良方式。完全相同的Type定義代碼在許多不同的模塊中結束。

或者,我可以在一個單一的中央「類型」模塊中聲明這個Type,所有其他需要此特定類型的模塊都應該引用類型模塊。缺點是每個模塊都會失去「模塊化」,因爲它必須伴隨着「模塊」模塊,無論它走到哪裏。

有什麼建議嗎?

+0

@anonymous downvoter:照顧解釋?同時downvotes我的兩個[老問題](http://stackoverflow.com/questions/8848027/one-instance-of-report-per-instance-of-simulation-use-a-singleton)...聞起來像狙擊。 – 2012-07-19 20:41:19

回答

3

這很有趣,因爲我從來不知道,你可以有兩個模塊都宣稱具有相同名稱的公共類型。現在我知道,我很震驚。

因此,首先,埃裏克·塔是正確的,你想要把你的類型聲明只有一個模塊中。其他使用此類型的模塊將取決於可用的模塊,但這只是模塊化的一部分。所有軟件開發都需要管理模塊之間的依賴關係。不幸的是,在單個VBA項目中(例如您在單個Excel工作簿中找到的那種項目),管理模塊依賴關係的唯一選擇是手動。 (在VBA,「模塊」是真正的「源代碼文件。」其他語言/環境有不同的更高級別的包裝系統。)

現在到了令人咋舌的一部分。如果您在不同的模塊中聲明瞭具有相同名稱的類型,那麼您正在設置自己的問題。考慮兩個VBA模塊:

'Module1 

Public Type typ 
    x As String 
End Type 

Public Sub useTyp() 
    Dim t As typ 
    t.x = 42 

    Debug.Print t.x + t.x 
End Sub 

'Module2 

Public Type typ 
    x As Long 
End Type 

Public Sub useTyp() 
    Dim t As typ 
    t.x = 42 

    Debug.Print t.x + t.x 
End Sub 

在同一個項目,你的代碼將 「編譯」(至少在Excel VBA)。但是這兩個'useTyp'的潛艇給出了不同的輸出。更糟糕的是,如果您從其中一個模塊中刪除某個Type聲明,您突然改變了同一個模塊中「useTyp」例程的行爲!這種含糊不清是不可取的。

這是怎麼回事是VBA真的創造了兩種不同類型,「Module1.typ」和「Module2.typ」。當你在同一個模塊中並且沒有限定類型名稱時,VBA默默地找到「正確」類型並使用它。

我有些驚訝地聽說你正在將一個'XYpointType'的實例傳遞給具有不同'XYpointType'聲明的模塊。這並不重要,但你可以發佈代碼嗎?我有興趣在nitpicky這樣的事情...

3

使用你的第二種方法。重點是創建一個可重用的類型blob。要可重用,它必須分開。那麼,是的,每個使用這些類型的模塊都必須引用該blob。但是對於模塊互相調用,需要調用模塊的表單等也可以這樣說。

1

您也可以爲您的XYPoints一類。這將允許你有自定義功能,並且你需要沿着這條路走下去。與類相比,類型非常有限。

這裏是一個很好的資源,讓你開始:http://www.cpearson.com/excel/Classes.aspx

+0

是的,但在VBA中,每個模塊只能有一個類(對吧?)。我有很多用戶定義的類型,我討厭在我的項目中使用gazillion模塊,感覺很不整潔。這就是說,我應該在某個時候開始使用類... – 2010-10-21 12:30:50

+0

@JF:嗯...我已經把多個類放在一個VBA模塊中。 (幾年前,時代變了,但我預計這會起作用) – 2010-10-21 15:52:35

+0

@Eric,@JF是正確的,它需要一個模塊來定義一個類。這給了我一個重複我最喜歡的系列的藉口:VBA中的OOP是PITA(TM)!但是,當然,如果你有可以從封裝獲益的類型,它通常還是值得的。 – jtolle 2010-10-21 17:51:46