2012-02-29 42 views
5

我已經開始使用VBA類,並且一直試圖編寫我的代碼,以便每個類都是「獨立的」,即它具有它所需的一切 - 常量,函數等等。最近,這種方法導致了代碼重複,因爲我不是在不同的模塊中調用公共函數,而是將一些來自「外部世界」(在同一個項目中)的代碼複製到一個類中,以維持其「自給自足」 。在VBA類中使用全局常量,類型和函數是否是一種好習慣?

我正在考慮改變一些類,以便像其他模塊一樣可以從其他模塊訪問函數,常量,類型等,但是我的某些東西告訴我這可能不是一個好東西實踐。有人可以告訴我,這個小小的聲音說的是錯的嗎?有更好的方法嗎?

謝謝。

更新:

我不較早提供細節道歉。下面是一個示例代碼:

'------------------------------------- 
'Module 1 
'------------------------------------- 

Public Const INITIAL_VALUE As String = "Start" 
Public Const FINAL_VALUE As String = "End" 

'more constants ... 

Public Type SheetLoc 
    SheetName As String 
    SheetRow As Long 
    SheetColumn As Long 
End Type 

'more types ... 

'------------------------------------- 
'Module 2 
'------------------------------------- 

Public Function GetLocation(key As String) As SheetLoc 

    Dim myLoc As SheetLoc 

    'some codes here... 
    ' 
    With myLoc 
     .SheetName = someValue 
     .SheetColumn = anotherValue 
     .SheetRow = stillAnotherValue 
    End With 

    GetLocation = myLoc 

End Function 

'more module functions 

'------------------------------------- 
'Class Module 
'------------------------------------- 

'some codes... 

Public Sub SaveResults() 

    Dim currLoc As SheetLoc  '<==== using a type defined outside of the class 

    'more declarations .... 
    'some codes here .... 

    If currentValue = INITIAL_VALUE Then  '<=== referring to external constant 
     currLoc = GetLocation(someKey)   '<=== calling an external function 
    ElseIf currentValue = FINAL_VALUE Then '<=== referring to an external constant 
     currLoc = GetLocation(anotherKey) 
    Else 
     currLoc = GetLocation(defaultKey) 
    End If 

    'populate data ... 
    'save results ... 

End Sub 

注意與評論「< ====」的代碼;該類使用類之外定義的類型,函數和常量,這就是我想知道這是一種好的做法還是有更好的選擇。我想我只是沒有完全得到封裝的概念。

+1

請提供一些代碼示例,讓人們瞭解「告訴我這可能不是一個好習慣」。 – shahkalpesh 2012-02-29 07:17:12

+0

http://www.cpearson.com/excel/classes.aspx – JMax 2012-02-29 07:39:30

+0

很高興知道您的意思是否是針對某些事情的良好實踐..通常這只是爲了您自己,您可以理解,然後纔是好的做法... – gbianchi 2012-02-29 17:55:44

回答

5

我從來沒有把公共常量放在類模塊中。所有的,我的意思是我所有的公共變​​量和常量都在一個名爲MGlobals的標準模塊中。這有兩個好處。首先,你和我都知道在哪裏可以找到它們 - 它們有點危險,需要找到。其次,如果這個模塊得到的不僅僅是幾行,我知道我很懶,需要重構。

這是一個很好的做法,試圖保持你的課堂模塊模塊化。但不要對它堅持下去。良好的編程決不會將選擇的模塊放入項目中並使其正常工作。在任何重要項目上都應該進行整合。

+0

謝謝。這有幫助。實際上,我有一個常量和類型模塊,這些模塊(我現在可以在我的課程中使用,而沒有將這個問題放在第一位的問題)。 – bigeyes 2012-03-01 05:49:36

1

這是錯的。歐普完全問我自己的問題,答案是如此平坦。

IME是OP尋找的答案(早在2012年!),他們應該通過ClassName.Module(可選的事情,如var,)轉發所需的值。然後,他們可以發送請求的可能重複變體的特定值,並接收與其他機器上的其他請求相匹配的請求的新答案,並且可以在不更改類的情況下用於另一個項目雖然整合需要改變,但它永遠不應該在課堂上。如果你破壞了課程的完整性,它就成爲一個模塊。

另一方面的外部INI文件...

相關問題