programing

VBA 클래스 모듈의 속성을 허용합니다. 여러 개의 인수를 가질 수 있습니까?

newstyles 2023. 8. 17. 21:00

VBA 클래스 모듈의 속성을 허용합니다. 여러 개의 인수를 가질 수 있습니까?

지금까지 클래스 모듈에서 Let 속성을 사용한 제가 이해한 바로는 클래스 모듈에서 다음과 같이 설정한 것입니다.

Dim pName as String
Public Property Let Name(Value As String)
    pName = Value
End Property

이 클래스의 개체를 만든 후 다음과 같이 속성을 설정할 수 있습니다.

MyObject.Name = "Larry"



:. 클래스 개의 할 수 ?클래스 속성에 여러 인수를 입력할 수 있습니까?예를 들어:

Dim pFirstName as String, pLastName as String
Public Property Let Name(FirstName As String, LastName As String)
    pFirstName = FirstName
    pLastName = LastName
End Property

그러면 클래스 밖에서 이 속성을 설정하려면 어떻게 해야 합니까?

MyObject.Name = ??

아니면 이것이 단지 불가능하다는 것이 명백한가요?

이미 두 가지 해결 방법이 있다는 것은 알고 있지만, 이 질문이 받는 조회수 때문에 원래 질문에 대답하는 것이 시도해 볼 가치가 있다고 생각했습니다.

에 대한 답

Let Property in VBA에서 여러 개의 인수를 가질 수 있습니까?

이라

네! 가능합니다.

먼저 GET 속성에 대해 이야기해 보겠습니다.이것을 다음과 같이 생각합니다.Class1

Private firstName as String
Private lastName as String

Public Property Get Name() As String
    Name = firstName & " " & lastName
End Property

Name속성은 전체 이름을 반환합니다. 좋습니다. 속성을 사용하여 할당하는 방법.firstName&lastName 번에 에번한?

참고 사항: 특수 문자로 구분된 단일 문자열을 전달하고 본문 안에서 분할하여 및 이름할당할 수 있지만, 이는 잊어버리고 제대로 수행합니다...

VBA에서 현재 설정의 기본 속성은 1개의 매개 변수를 사용하여 이름 또는 성에 할당합니다.

다음과 같은 것:

Public Property Let Name(value As String)
    firstName = value
End Property

칙규:Get 변수를 매변수 지않으며사하용를을 사용합니다.Let하나 가져가세요.그것은 매우 논리적입니다 왜냐하면Get하지만 기본값 반지만하환을,,Let표현하는 데이터에 값을 할당하려면 어딘가에서 값을 가져와야 합니다.이 시점에서 기억할 가치가 있습니다.Let은 속은를할다니를 됩니다.= 서명한한.myObject.Name = "IdOnKnuu"

의 규칙과 일관성을 유지할 경우 이론적으로 에 하나의 매개 변수추가하고 에 하나의 매개 변수를 추가할 수 있어야 한다는 것을 알고 있습니다.

그 일은 잊어버리자꾸나Let일단 코멘트 아웃 - 그리고 파라미터를 추가합니다.Get소유물.

Private firstName As String
Private lastName As String

Public Property Get Name(first As String) As String
    Name = firstName & " " & lastName
End Property

'Public Property Let Name(value As String)
'    firstName = value
'End Property

으로돌기아가로 Module1의 .Class1 및형을 합니다.c.Name(

enter image description here

오, 지성이 뭔가를 기대하고 있다고요?아주 좋아요!

이 시점에서 이해할 가치가 있습니다.Get 반환 산재고first + last 현재 비어 있으므로 무엇을 전달할지는 중요하지 않습니다.c.Name()빈 문자열을 반환합니다.

좋아요, 댓글을 달아서 조정해 봅시다.Let지금 속성...

사드노드로 : 다이하는경우동시이.Module1 및형을 합니다.c.그리고 지능적인 감각을 갖지 마세요. 그것은 무언가가 있다는 것을 의미합니다.Class1부서졌어요...우리는 이미 알고 있습니다 - 그것은.Let ㅠㅠㅠㅠㅠㅠㅠㅠㅠ

는 매에개변추습니다했가에 했습니다.Get재산, 같은 일을 합시다.Let속성...

Public Property Let Name(first As String, value As String)
    firstName = value
End Property

다시 시작해 보겠습니다.Module1그리고 그것을 사용해 보세요.Let속성:

기억하세요, 당신이 어떻게 그것을 사용했는지.Let전에 부동산?가 있었습니다.

c.Name = "John"

하지만 지금, 당신의Let에 추가 변수가 합니다.first as String.

이것을 시도해 보는 것은 어떨까요?

c.Name("John") = "Smith"

이봐! 컴파일하고 실행하는 것 (빠른)

좋습니다. 결과를 확인해 보겠습니다!

Debug.print c.Name("John")

... 그것은 단지 보여줄 뿐입니다.Smith바로 가기 창(+)...CtrlG정확히 우리가 찾던 것이 아닙니다.

으로돌기아가로 Let속성 우리는 논쟁을 통해 2개의 가치를 파악하고 있지만 우리는 그 중 하나만 사용하고 있습니까?함수에는 두 가지 다른 값이 들어옵니다. 그렇죠?첫 번째 것은 다음과 같이 처리합니다.firstName 두 는 그고두번는째리는번.lastName

Public Property Let Name(first As String, last As String)
    firstName = first
    lastName = last
End Property

로 돌아가기Module1

Sub Main()

    Dim c As New Class1
    
    c.Name("John") = "Smith"

    Debug.Print c.Name("John")
    
End Sub

현재 코드를 다시 실행하면 필요한 것을 얻을 수 있습니다.그것은 존 스미스를 인쇄하지만 기다려요!!! 왜 우리는 전체 이름을 검색하기 위해 이름을 전달해야 합니까?

하! 두 속성의 첫 번째 매개 변수를 만드는 것이 요령입니다.

코드를 요약하면 다음과 같습니다.

클래스 1.cls

Private firstName As String
Private lastName As String

Public Property Get Name(Optional first As String) As String
    Name = firstName & " " & lastName
End Property

Public Property Let Name(Optional first As String, last As String)
    firstName = first
    lastName = last
End Property

모듈 1.bas

Sub Main()

    Dim c As New Class1
    
    c.Name("John") = "Smith"

    Debug.Print c.Name ' prints John Smith
    
End Sub

따라서 기본적으로 속성을 통해 두 개 이상의 값을 할당할 수 있습니다.여러분을 다소 당황하게 할 수 있는 것은 구문입니다. 하지만 이 답변에서 제 설명이 여러분이 무엇이 무엇에서 왔는지, 왜 그런지 이해하는 데 도움이 되었기를 바랍니다.

Get속성은 선택적 매개 변수를 사용합니다. 실제로는 더미 매개 변수입니다.그것은 어디에서도 사용되지 않습니다.Get 속성을 수 Let두 가지 매개 변수를 전달할 수 있습니다.은 또한 것을 줍니다.c.Name파일

Debug.Print c.Name("first")

여전히 가능하지만, 그러나."first"매개 변수는 더미처럼 작동하며 실제 기본 데이터에 영향을 주지 않습니다.더미이며 실제 데이터에는 영향을 미치지 않습니다. 덤프하고 다음을 사용합니다.

Debug.print c.Name

확실히 더 편리합니다 :)

당신의 의견에 따르면 이 논리를 캡슐화하고 싶다면 아래와 유사한 것을 사용할 수 있습니다.

아래에는 하위 및 함수가 포함되어 있습니다.함수는 사용자 개체를 반환합니다.

Public Sub testing()

    Dim t As Person

    Set t = PersonData("John", "Smith")

End Sub


Public Function PersonData(firstName As String, lastName As String) As Person

    Dim p As New Person

    p.firstName = firstName
    p.lastName = lastName

    Set PersonData = p

End Function

사용자 클래스:

Dim pFirstName As String, pLastName As String

Public Property Let FirstName(FirstName As String)
    pFirstName = FirstName
End Property

Public Property Get FirstName() As String
    FirstName = pFirstName
End Property

Public Property Let LastName(LastName As String)
    pLastName = LastName
End Property

Public Property Get LastName() As String
    LastName = pLastName
End Property

클래스 내에서 공용 하위 프로시저로 사용하여 다음 작업을 수행합니다.

Public Sub testing()
Dim myPerson As New Person
myPerson.SetName "KaciRee", "Software"

End Sub

사용자 클래스:

Dim pFirstName As String, pLastName As String

Public Property Let FirstName(FirstName As String)
    pFirstName = FirstName
End Property

Public Property Get FirstName() As String
    FirstName = pFirstName
End Property

Public Property Let LastName(LastName As String)
    pLastName = LastName
End Property

Public Property Get LastName() As String
    LastName = pLastName
End Property

Public Sub SetName(FirstName As String, LastName As String)
pFirstName = FirstName
pLastName = LastName
End Sub

언급URL : https://stackoverflow.com/questions/13823367/let-property-of-vba-class-modules-is-it-possible-to-have-multiple-arguments