ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [VBA/Set 키워드] 개체 참조 Set 키워드
    코딩/vba 2023. 6. 6. 17:28
    728x90

    아마 VBA 초보프로그래머에게 가장 헷갈리는 것 중 하나가 set일 것이다.

    어떤 변수는 그냥 정의하고 어떤 것은 set을 붙여야 한다.

    그 기준에 대해 설명한다.

    변수가 객체의 참조를 세팅하면 set, 객체 자체가 아닌 객체의 값만 가져올 때는 set을 사용하지 않는다. set을 사용하면 객체의 내용을 조작할 수 있다. set을 사용하지 않으면 객체에 저장된 값만을 불러온다. 객체에는 아무런 영향을 주지 않는다. 다시 말하면 객체를 직접 조작하기 위해서는 set을 사용하고 값만 필요한 객체는 set이 필요없다.

     

    VBA에서 Set 키워드를 사용하여 개체를 정의할 때와 그렇지 않을 때의 차이점은 다음과 같다.

    • 참조 유형: Set 키워드를 사용하여 개체를 정의할 때, 변수는 해당 개체에 대한 참조를 보유한다. 이는 개체를 직접 참조하고 조작할 수 있는 방법을 제공한다. 예를 들어, Set obj = Worksheets("Sheet1")와 같이 정의한 경우 obj는 "Sheet1" 워크시트에 대한 참조를 보유한다.
    • 값 유형: Set 키워드를 사용하지 않고 개체를 정의하면, 변수는 개체의 값을 보유한다. 값으로 개체를 저장할 경우, 해당 개체의 속성에 접근하거나 해당 개체의 메서드를 호출할 수 없다. 변수는 개체의 값을 복사하기 때문이다.
    • 개체 변경: Set 키워드를 사용하여 개체를 정의한 경우, 해당 개체가 변경되면 변수에 저장된 참조도 변경된다. 따라서 변수를 통해 업데이트된 개체에 액세스할 수 있다. Set 키워드를 사용하지 않은 경우, 변수는 처음에 할당된 개체의 값을 보유하므로 개체가 변경되더라도 변수는 변경되지 않는다.

    간단한 예:

    Sub SetVsNoSet()
        Dim obj1 As Worksheet
        Dim obj2 As Worksheet
    
        ' Set 키워드 사용하여 개체 정의
        Set obj1 = Worksheets("Sheet1")
    
        ' Set 키워드를 사용하지 않고 개체 정의
        obj2 = Worksheets("Sheet2") ' 실제 작동하지 않는 코드
    
        ' 개체 변경 시 동작 비교
        obj1.Name = "NewName1"  ' obj1 참조의 개체 변경
        obj2.Name = "NewName2"  ' obj2의 값만 변경, 개체 변경 없음
    
        MsgBox obj1.Name  ' "NewName1" 출력
        MsgBox obj2.Name  ' 원래 시트 이름 출력
    End Sub

    위의 예제에서 obj1은 Set 키워드를 사용하여 Sheet1에 대한 참조를 보유하고 있으므로 obj1.Name을 통해 개체 이름을 변경한 후 변경된 값을 가져올 수 있다.

    obj2는 실제로는 작동하지 않는다. 작동을 한다고 가정하고 설명만 한다면, Set 키워드를 사용하지 않았으므로 개체의 값을 보유하고 있으며, 개체의 속성에 직접 액세스할 수 없으므로 obj2.Name은 원래 시트 이름을 출력한다.

    728x90

    댓글

Designed by Tistory.