サーチ…


備考

この記事では、VBAで完全なカスタムクラスを作成する方法を説明します。開始日と終了日はしばしば関数に渡されるため、 DateRangeオブジェクトの例が使用されます。

クラスへのプロパティの追加

Propertyプロシージャは、モジュールのカスタムプロパティを取得または変更する一連のステートメントです。

プロパティアクセサーには3つのタイプがあります。

  1. プロパティの値を返すGetプロシージャ。
  2. Let (非割り当て手順Objectオブジェクトへの)値。
  3. Object参照を割り当てるSetプロシージャ。

プロパティアクセサは、プロパティごとにGetLet / Set両方を使用してペアで定義されることがよくあります。 Getプロシージャのみを持つプロパティは読み取り専用ですが、 Let / Setプロシージャのみを持つプロパティは書き込み専用です。

次の例では、4つのプロパティアクセサがDateRangeクラスに対して定義されていDateRange

  1. StartDate読み込み/書き込み )。範囲内のより早い日付を表す日付値。各プロシージャは、モジュール変数mStartDate値を使用します。
  2. EndDate読み込み/書き込み )。範囲内の後の日付を表す日付値。各プロシージャは、モジュール変数mEndDate値を使用します。
  3. DaysBetween読み取り専用 )。 2つの日付の間の日数を表す計算された整数値。 Getプロシージャのみが存在するため、このプロパティは直接変更できません。
  4. 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

クラスに機能を追加する

クラスモジュール内の任意のパブリックSubFunction 、または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

しかし、多くの場合、プロジェクト間でモジュールコピーせずに 、他のプロジェクトで使用したいクラスを作成します。 ProjectAListという名前のクラスを定義し、そのクラスをProjectBで使用する場合、4つのアクションを実行する必要があります。

  1. プロパティウィンドウのProjectAListクラスのインスタンスプロパティをPrivateからPublicNotCreatable

  2. 公共「工場」機能を作成ProjectAのインスタンスを作成して返しListクラスを。通常、ファクトリ関数には、クラスインスタンスの初期化のための引数が含まれます。 ProjectBではクラスを使用できますが、 ProjectBProjectAのクラスのインスタンスを直接作成できないため、ファクトリ関数が必要です。

     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
    
  3. ProjectBTools..References...参照Tools..References...メニューを使用してProjectAへの参照を追加します。

  4. 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
    


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow