수색…
비고
이 기사에서는 VBA에서 완전한 사용자 지정 클래스를 만드는 방법을 보여줍니다. 시작 및 종료 날짜는 종종 함수에 함께 전달되기 때문에이 함수는 DateRange 객체의 예제를 사용합니다.
클래스에 속성 추가하기
Property 프로시 저는 모듈의 사용자 지정 속성을 검색하거나 수정하는 일련의 문입니다.
속성 접근 자에는 세 가지 유형이 있습니다.
- 속성의 값을 반환하는
Get프로 시저입니다. -
LetA (비 할당 절차Object개체에) 값입니다. -
Object참조를 할당하는Set프로 시저입니다.
속성 접근자는 종종 각 속성에 대해 Get 및 Let / Set 를 사용하여 쌍으로 정의됩니다. Get 프로 시저 만있는 속성은 읽기 전용이며 Let / Set 프로 시저 만 사용하는 속성은 쓰기 전용입니다.
다음 예제에서는 4 개의 속성 접근자가 DateRange 클래스에 대해 정의됩니다.
-
StartDate( 읽기 / 쓰기 ). 특정 날짜의 이전 날짜를 나타내는 날짜 값입니다. 각 프로시 저는 모듈 변수mStartDate의 값을 사용합니다. -
EndDate( 읽기 / 쓰기 ). 특정 날짜의 이후 날짜를 나타내는 날짜 값입니다. 각 프로시 저는 모듈 변수mEndDate의 값을 사용합니다. -
DaysBetween( 읽기 전용 ). 두 날짜 간의 일 수를 나타내는 계산 된 정수 값입니다.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
클래스에 기능 추가
클래스 모듈 내부의 모든 public Sub , Function 또는 Property 는 객체 참조로 호출하기 전에 호출 할 수 있습니다.
Object.Procedure
DateRange 클래스에서 Sub 사용하여 종료 날짜에 일 수를 추가 할 수 있습니다.
Public Sub AddDays(ByVal NoDays As Integer)
mEndDate = mEndDate + NoDays
End Sub
Function 는 다음 달 마지막 날을 반환 할 수 있습니다 ( GetFirstDayOfMonth 는 private이기 때문에 클래스 외부에 표시되지 않습니다).
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 표기법을 사용합니다.
클래스 모듈 범위, 인스턴스화 및 재사용
기본적으로 새 클래스 모듈은 Private 클래스이므로 인스턴스가 정의 된 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 에서 해당 클래스를 사용하려면 다음 네 가지 작업을 수행해야합니다.
속성 창에서
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