サーチ…
備考
この記事では、VBAで完全なカスタムクラスを作成する方法を説明します。開始日と終了日はしばしば関数に渡されるため、 DateRange
オブジェクトの例が使用されます。
クラスへのプロパティの追加
Property
プロシージャは、モジュールのカスタムプロパティを取得または変更する一連のステートメントです。
プロパティアクセサーには3つのタイプがあります。
- プロパティの値を返す
Get
プロシージャ。 -
Let
(非割り当て手順Object
オブジェクトへの)値。 -
Object
参照を割り当てるSet
プロシージャ。
プロパティアクセサは、プロパティごとにGet
とLet
/ Set
両方を使用してペアで定義されることがよくあります。 Get
プロシージャのみを持つプロパティは読み取り専用ですが、 Let
/ Set
プロシージャのみを持つプロパティは書き込み専用です。
次の例では、4つのプロパティアクセサがDateRange
クラスに対して定義されていDateRange
。
-
StartDate
( 読み込み/書き込み )。範囲内のより早い日付を表す日付値。各プロシージャは、モジュール変数mStartDate
値を使用します。 -
EndDate
( 読み込み/書き込み )。範囲内の後の日付を表す日付値。各プロシージャは、モジュール変数mEndDate
値を使用します。 -
DaysBetween
( 読み取り専用 )。 2つの日付の間の日数を表す計算された整数値。Get
プロシージャのみが存在するため、このプロパティは直接変更できません。 -
RangeToCopy
( 書き込み専用 )。既存のDateRange
オブジェクトの値をコピーするために使用されるSet
プロシージャ。
Private mStartDate As Date ' Module variable to hold the starting date
Private mEndDate As Date ' Module variable to hold the ending date
' Return the current value of the starting date
Public Property Get StartDate() As Date
StartDate = mStartDate
End Property
' Set the starting date value. Note that two methods have the name StartDate
Public Property Let StartDate(ByVal NewValue As Date)
mStartDate = NewValue
End Property
' Same thing, but for the ending date
Public Property Get EndDate() As Date
EndDate = mEndDate
End Property
Public Property Let EndDate(ByVal NewValue As Date)
mEndDate = NewValue
End Property
' Read-only property that returns the number of days between the two dates
Public Property Get DaysBetween() As Integer
DaysBetween = DateDiff("d", mStartDate, mEndDate)
End Function
' Write-only property that passes an object reference of a range to clone
Public Property Set RangeToCopy(ByRef ExistingRange As DateRange)
Me.StartDate = ExistingRange.StartDate
Me.EndDate = ExistingRange.EndDate
End Property
クラスに機能を追加する
クラスモジュール内の任意のパブリックSub
、 Function
、またはProperty
は、呼び出しの前にオブジェクト参照を付けて呼び出すことができます。
Object.Procedure
DateRange
クラスでは、 Sub
を使用して終了日に日数を追加できます。
Public Sub AddDays(ByVal NoDays As Integer)
mEndDate = mEndDate + NoDays
End Sub
Function
は次の月末の最終日を返すことができます( GetFirstDayOfMonth
はプライベートであるため、クラス外には表示されません)。
Public Function GetNextMonthEndDate() As Date
GetNextMonthEndDate = DateAdd("m", 1, GetFirstDayOfMonth())
End Function
Private Function GetFirstDayOfMonth() As Date
GetFirstDayOfMonth = DateAdd("d", -DatePart("d", mEndDate), mEndDate)
End Function
プロシージャは、定義されているクラスのオブジェクトへの参照を含む任意の型の引数を受け入れることができます。
次の例では、現在のDateRange
オブジェクトの開始日と終了日が、別のDateRange
オブジェクトの開始日と終了日を含むかどうかをテストします。
Public Function ContainsRange(ByRef TheRange As DateRange) As Boolean
ContainsRange = TheRange.StartDate >= Me.StartDate And TheRange.EndDate <= Me.EndDate
End Function
コードを実行しているオブジェクトの値にアクセスする方法として、 Me
表記を使用することに注意してください。
クラスモジュールスコープ、インスタンス化および再利用
既定では、新しいクラスモジュールはプライベートクラスなので、定義されているVBProject内でのインスタンス化と使用にのみ使用できます。 同じプロジェクト内の任意の場所にクラスを宣言し、インスタンス化して使用できます。
'Class List has Instancing set to Private
'In any other module in the SAME project, you can use:
Dim items As List
Set items = New List
しかし、多くの場合、プロジェクト間でモジュールをコピーせずに 、他のプロジェクトで使用したいクラスを作成します。 ProjectA
でList
という名前のクラスを定義し、そのクラスをProjectB
で使用する場合、4つのアクションを実行する必要があります。
プロパティウィンドウの
ProjectA
のList
クラスのインスタンスプロパティをPrivate
からPublicNotCreatable
公共「工場」機能を作成
ProjectA
のインスタンスを作成して返しList
クラスを。通常、ファクトリ関数には、クラスインスタンスの初期化のための引数が含まれます。ProjectB
ではクラスを使用できますが、ProjectB
はProjectA
のクラスのインスタンスを直接作成できないため、ファクトリ関数が必要です。Public Function CreateList(ParamArray values() As Variant) As List Dim tempList As List Dim itemCounter As Long Set tempList = New List For itemCounter = LBound(values) to UBound(values) tempList.Add values(itemCounter) Next itemCounter Set CreateList = tempList End Function
ProjectB
、Tools..References...
参照Tools..References...
メニューを使用してProjectA
への参照を追加します。ProjectB
で、変数を宣言し、ProjectA
ファクトリ関数を使用してList
インスタンスを割り当てますDim items As ProjectA.List Set items = ProjectA.CreateList("foo","bar") 'Use the items list methods and properties items.Add "fizz" Debug.Print items.ToString() 'Destroy the items object Set items = Nothing