サーチ…
備考
この記事では、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 FunctionProjectB、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