2012-02-29 11 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

+0

http://www.cpearson.com/excel/classes.aspx – JMax

+0

あなたは何かに対して良い練習を意味するかどうかを知っていいでしょう..これはあなた自身のためだけであり、あなたはそれを理解することができます、それは良い練習です... – gbianchi

答えて

5

私は決してクラスモジュールにパブリック定数を入れません。私のすべての公開変数と定数のすべては、標準モジュールの中にあり、MGlobalsと呼ばれています。それには2つの利点があります。まず、あなたと私は両方とも彼らを見つける場所を知っていることを知っています - 彼らは幾分危険であり、見つけることが必要です。第二に、もしそのモジュールが数行以上のものを取得すれば、私は怠け者であり、リファクタリングする必要があることを知っています。

クラスモジュールをモジュール化しておくことをお勧めします。しかし、それでナッツをしないでください。良いプログラミングは、モジュールをプロジェクトに落としたり、それらをただ働かせたりすることはありません。重要なプロジェクトには、統合があり、そうするべきです。

+0

ありがとうございました。それは役に立ちます。私は実際に定数と型、ユーティリティ用のモジュールを持っています(私は今ここで私をここに連れて行きました。 – bigeyes

1

これは間違っています。 Opは自分自身の質問に完全に尋ねました。答えはちょうどフラットです。

IMEは、OPが探していた答えです(2012年に戻って!)、必要な値をClassName.Module(オプションのものはvar)に転送する必要がありました。次に、要求のおそらく反復可能なバリアントの特定の値を送信し、他のマシン上の他の要求に一致する要求に対して新しい回答を受け取り、クラスを変更せずに別のプロジェクトで使用することができます。統合には変更が必要なのは事実ですが、決してクラス側ではありません。クラスの完全性を破壊すると、モジュールになります。

一方、INIファイルの外側...

関連する問題