수색…
비고
이 기사에서는 VBA에서 완전한 사용자 지정 클래스를 만드는 방법을 보여줍니다. 시작 및 종료 날짜는 종종 함수에 함께 전달되기 때문에이 함수는 DateRange
객체의 예제를 사용합니다.
클래스에 속성 추가하기
Property
프로시 저는 모듈의 사용자 지정 속성을 검색하거나 수정하는 일련의 문입니다.
속성 접근 자에는 세 가지 유형이 있습니다.
- 속성의 값을 반환하는
Get
프로 시저입니다. -
Let
A (비 할당 절차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 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