수색…


비고

이 기사에서는 VBA에서 완전한 사용자 지정 클래스를 만드는 방법을 보여줍니다. 시작 및 종료 날짜는 종종 함수에 함께 전달되기 때문에이 함수는 DateRange 객체의 예제를 사용합니다.

클래스에 속성 추가하기

Property 프로시 저는 모듈의 사용자 지정 속성을 검색하거나 수정하는 일련의 문입니다.

속성 접근 자에는 세 가지 유형이 있습니다.

  1. 속성의 값을 반환하는 Get 프로 시저입니다.
  2. Let A (비 할당 절차 Object 개체에) 값입니다.
  3. Object 참조를 할당하는 Set 프로 시저입니다.

속성 접근자는 종종 각 속성에 대해 GetLet / Set 를 사용하여 쌍으로 정의됩니다. Get 프로 시저 만있는 속성은 읽기 전용이며 Let / Set 프로 시저 만 사용하는 속성은 쓰기 전용입니다.

다음 예제에서는 4 개의 속성 접근자가 DateRange 클래스에 대해 정의됩니다.

  1. StartDate ( 읽기 / 쓰기 ). 특정 날짜의 이전 날짜를 나타내는 날짜 값입니다. 각 프로시 저는 모듈 변수 mStartDate 의 값을 사용합니다.
  2. EndDate ( 읽기 / 쓰기 ). 특정 날짜의 이후 날짜를 나타내는 날짜 값입니다. 각 프로시 저는 모듈 변수 mEndDate 의 값을 사용합니다.
  3. DaysBetween ( 읽기 전용 ). 두 날짜 간의 일 수를 나타내는 계산 된 정수 값입니다. 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

클래스에 기능 추가

클래스 모듈 내부의 모든 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 에서 해당 클래스를 사용하려면 다음 네 가지 작업을 수행해야합니다.

  1. 속성 창에서 ProjectAList 클래스의 인스턴스 속성을 Private 에서 PublicNotCreatable

  2. 에서 공개 "공장"기능 만들기 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
    
  3. ProjectB 에서 Tools..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