programing

VBA에서 클래스를 사용하면 어떤 이점이 있습니까?

sourcejob 2023. 4. 19. 22:58
반응형

VBA에서 클래스를 사용하면 어떤 이점이 있습니까?

저는 엑셀에서 VBA 프로그래밍을 하고 있는데, 워크북을 하나 가지고 있는데 모든 데이터 시트를 다른 시트로 복사해야 합니다.새로운 시트에는 여러 개의 헤더 행이 있기 때문에, 그 위치를 계속 추적하고 싶다고 생각하고 있기 때문에, 항상 단어를 찾을 필요는 없습니다.

Excel 워크북이 열려 있는 동안 클래스를 사용하여 계속 실행하는 것이 가장 간단한 방법입니까?아니면 무겁고 다루기 힘들고 서브루틴으로 계속 작업해야 하나요?수업 이용의 이점은 무엇입니까?여러 개의 객체가 있는 것이 아니라 시트 및 열에만 유효성이 있습니다.

서브루틴 대신 클래스를 사용하는 장점은 클래스가 더 깨끗한 코드를 쓸 수 있는 추상화 수준을 만든다는 것입니다.물론, VBA에서 수업을 사용해 본 적이 없다면, 학습 곡선이 있지만, 분명히 시간을 들여서 생각해 볼 가치가 있다고 생각합니다.

클래스로 전환해야 하는 중요한 지표 중 하나는 함수 및 서브루틴에 지속적으로 파라미터를 추가하는 경우입니다.이 경우, 거의 항상 클래스를 사용하는 것이 가장 좋습니다.

이전 Stack Overflow 답변 중 하나에서 클래스 설명을 복사했습니다.


여기 클래스를 사용하는 것이 어떻게 도움이 되는지에 대한 긴 예가 있습니다.이 예는 장황하지만 오브젝트 지향 프로그래밍의 몇 가지 원칙이 코드를 정리하는 데 얼마나 도움이 되는지 보여줍니다.

에서 VBA로 합니다.Insert > Class Module. [ ]에서 모듈 이름을 [Properties](프로퍼티)로 WorkLogItem 클래스에 다음 코드를 추가합니다.

Option Explicit

Private pTaskID As Long
Private pPersonName As String
Private pHoursWorked As Double

Public Property Get TaskID() As Long
    TaskID = pTaskID
End Property

Public Property Let TaskID(lTaskID As Long)
    pTaskID = lTaskID
End Property

Public Property Get PersonName() As String
    PersonName = pPersonName
End Property

Public Property Let PersonName(lPersonName As String)
    pPersonName = lPersonName
End Property

Public Property Get HoursWorked() As Double
    HoursWorked = pHoursWorked
End Property

Public Property Let HoursWorked(lHoursWorked As Double)
    pHoursWorked = lHoursWorked
End Property

위의 코드는 현재 작업 중인 데이터에 고유한 강력한 유형의 개체를 제공합니다.할 때 arr(1,1)arr(1,2)、 [ Person Name ] 、 [ Person Name ]이다.arr(1,3)근무시간그 구문으로는 뭐가 뭔지 알기 어렵다. ""를 합니다.WorkLogItem에에작작 작다다다다다 이름, 될 예요.arr(1).PersonName을 사용하다그러면 코드를 훨씬 쉽게 읽을 수 있습니다.

하다를 배열에 하는 것이 '배열'을 collection.

하여 '클래스 모듈'이라고 .ProcessWorkLog 에 다음 를 입력합니다. 여기에 다음 코드를 입력합니다.

Option Explicit

Private pWorkLogItems As Collection

Public Property Get WorkLogItems() As Collection
    Set WorkLogItems = pWorkLogItems
End Property

Public Property Set WorkLogItems(lWorkLogItem As Collection)
    Set pWorkLogItems = lWorkLogItem
End Property

Function GetHoursWorked(strPersonName As String) As Double
    On Error GoTo Handle_Errors
    Dim wli As WorkLogItem
    Dim doubleTotal As Double
    doubleTotal = 0
    For Each wli In WorkLogItems
        If strPersonName = wli.PersonName Then
            doubleTotal = doubleTotal + wli.HoursWorked
        End If
    Next wli

Exit_Here:
    GetHoursWorked = doubleTotal
        Exit Function

Handle_Errors:
        'You will probably want to catch the error that will '
        'occur if WorkLogItems has not been set '
        Resume Exit_Here


End Function

에서는 '무엇을 하다'라는와 함께 을 하다라는 표현을 합니다.WorkLogItem처음에는 총 작업 시간을 계산하도록 설정했습니다.우리가 작성한 코드를 테스트해 봅시다.새 모듈을 만듭니다(이번에는 클래스 모듈이 아니라 "일반" 모듈).모듈에 다음 코드를 붙여넣습니다.

Option Explicit

Function PopulateArray() As Collection
    Dim clnWlis As Collection
    Dim wli As WorkLogItem
    'Put some data in the collection'
    Set clnWlis = New Collection

    Set wli = New WorkLogItem
    wli.TaskID = 1
    wli.PersonName = "Fred"
    wli.HoursWorked = 4.5
    clnWlis.Add wli

    Set wli = New WorkLogItem
    wli.TaskID = 2
    wli.PersonName = "Sally"
    wli.HoursWorked = 3
    clnWlis.Add wli

    Set wli = New WorkLogItem
    wli.TaskID = 3
    wli.PersonName = "Fred"
    wli.HoursWorked = 2.5
    clnWlis.Add wli

    Set PopulateArray = clnWlis
End Function

Sub TestGetHoursWorked()
    Dim pwl As ProcessWorkLog
    Dim arrWli() As WorkLogItem
    Set pwl = New ProcessWorkLog
    Set pwl.WorkLogItems = PopulateArray()
    Debug.Print pwl.GetHoursWorked("Fred")

End Sub

코드에서는 " " " 입니다.PopulateArray() 하게 수집하다WorkLogItem실제 코드에서는 Excel 시트 또는 데이터 객체를 해석하여 컬렉션 또는 어레이를 채울 수 있는 클래스를 만들 수 있습니다.

TestGetHoursWorked() 클래스가 사용되었는지 .code는 클래스가 어떻게 사용되었는지 보여줍니다.요?ProcessWorkLog오브젝트로 인스턴스화 됩니다.후 " " " "WorkLogItempwl 에 이 점이 있습니다.Set pwl.WorkLogItems = PopulateArray() 다음,쓴WorkLogItems.

이게 왜 도움이 되죠?

데이터가 변경되어 새로운 방법을 추가하려고 합니다.예를 들어 다음과 같습니다.WorkLogItem now now에 for for for for for for for for for for for for for for for for for 의 필드를 포함했습니다.HoursOnBreak새로운 방법을 추가하여 계산하려고 합니다.

때 해야 할 .WorkLogItem다음과 같이 합니다.

Private pHoursOnBreak As Double

Public Property Get HoursOnBreak() As Double
    HoursOnBreak = pHoursOnBreak
End Property

Public Property Let HoursOnBreak(lHoursOnBreak As Double)
    pHoursOnBreak = lHoursOnBreak
End Property

물론 컬렉션을 채우는 방법을 변경해야 합니다(제가 사용한 샘플 방법은PopulateArray()(단, 이것만은 별도 클래스가 필요할지도 모릅니다.을 '다'에 방법을 더하면 됩니다.ProcessWorkLog 링크:

Function GetHoursOnBreak(strPersonName As String) As Double
     'Code to get hours on break
End Function

그럼 이제 우리가 싶은 것은,TestGetHoursWorked() GetHoursOnBreak 그럼 ', , 하다, 하다, 하다' 이렇게 한줄만 되겠네요.

    Debug.Print pwl.GetHoursOnBreak("Fred")

데이터를 나타내는 값의 배열을 전달한 경우 배열을 사용한 코드 내의 모든 위치를 찾은 후 그에 따라 업데이트해야 합니다.대신 클래스(및 인스턴스화된 개체)를 사용하면 훨씬 쉽게 코드를 업데이트하여 변경 작업을 수행할 수 있습니다.또한 클래스를 여러 방법으로 사용할 수 있도록 허용한 경우(아마도 한 함수는 오브젝트 속성 중 4개만 필요하고 다른 함수는 6개만 필요함)에도 동일한 오브젝트를 참조할 수 있습니다.이것에 의해, 다른 타입의 기능에 복수의 어레이를 사용할 수 없게 됩니다.

자세한 내용은 제2판 VBA Developer's Handbook을 입수하는 것을 강력히 추천합니다.이 책은 훌륭한 사례와 모범 사례, 그리고 수많은 샘플 코드들로 가득합니다.중요한 프로젝트를 위해 VBA에 많은 시간을 투자하고 있다면 이 책을 읽어볼 가치가 있습니다.

서브루틴이 많거나 서브루틴이 매우 길 경우 코드를 클래스로 구조화하는 것이 도움이 될 수 있습니다.예를 들어 서브루틴이 두 개만 있고 각각이 10줄의 코드일 경우 오버킬이 됩니다.코드를 클래스로 구성함으로써 얻을 수 있는 이점은 처음부터 다시 코드를 읽고 변경할 수 있다는 것입니다.따라서 코드를 클래스로 구성하는 또 다른 이유는 코드를 아래로 변경해야 하는 경우입니다.

다른 기고자들이 밝힌 장점에 더해서 말할 수 있는 것이 하나 더 있습니다(벤 맥코맥의 훌륭한 답변 어딘가에 있는데 제가 놓쳤다면 죄송합니다).VBA 스크립트가 어느 시점에서 재프로그래밍될 가능성이 있는 경우 클래스는 사용할 수 있습니다.

예를 들어, 저는 일종의 주문 관리 시스템을 설계하고 있습니다.당분간 여러 동료가 사용할 예정이지만, 주문 규칙이 변경되면 재프로그래밍이 필요할 수 있습니다.그래서 저는 재고품에 대한 모든 정보를 수집하는 기본 재고품 클래스를 설계했습니다.그러나 이 데이터가 어떤 순서로 분석되는지에 대한 규칙은 쉽게 접근할 수 있고 주석이 잘 달린 하위 루틴으로 작성됩니다.이것에 의해, 장래의 VBA 프로그래머가, 특정의 스톡 아이템에 관한 모든 데이터를 수집하는 방법(이것은 모두, 클래스내의 서브루틴이나 함수에 의해서 행해지는 것으로, 스톡 번호를 건네받았을 때에 액티브하게 됩니다)을 간단하게 변경할 수 있으면 좋겠다고 생각하고 있습니다.A클래스의 퍼블릭 속성도 인텔리센스에 의해 취득되므로 다음 프로그래머와 본인도 쉽게 즐길 수 있습니다.

요점은 클래스가 프로그램의 사용 상황에 항상 관련될 수 있는 기본적인 정보 세트나 개념적인 오브젝트를 부호화하면 나중에 사용하는 사용자의 삶을 이런 으로 쉽게 만들 수 있다는 것입니다.

언급URL : https://stackoverflow.com/questions/2161666/what-are-the-benefits-of-using-classes-in-vba

반응형