VBA에서 dim과 set의 차이점은 무엇입니까


82

VBA의 초보자로 용서하십시오.

가끔 사용

Dim r as Range
r = Range("A1")

내가 사용하는 다른 시간

Set r = Range("A1")

차이점은 무엇입니까? 그리고 언제 무엇을 사용해야합니까?

답변:


78

set객체 참조를 참조하지 않는 한 사용할 이유가 없습니다 . 해당 컨텍스트에서만 사용하는 것이 좋습니다. 다른 모든 단순 데이터 유형의 경우 할당 연산자를 사용하십시오. dim그러나 모든 변수 를 (차원) 하는 것이 좋습니다 .

단순 데이터 유형의 예로는 것 integer, long, boolean, string. 이들은 데이터 유형일 뿐이며 자체 메서드와 속성이 없습니다.

Dim i as Integer
i = 5

Dim myWord as String
myWord = "Whatever I want"

의 예는 object될 Range하는 Worksheet, 또는를 Workbook. 여기에는 자체 메서드와 속성이 있습니다.

Dim myRange as Range
Set myRange = Sheet1.Range("A1")

없이 마지막 줄을 사용하려고하면 SetVB에서 오류가 발생합니다. 이제 object선언되었으므로 속성 및 메서드에 액세스 할 수 있습니다.

myString = myRange.Value

3
이것을 이해하기 위해 어떤 튜토리얼이나 책을 참조했는지 알 수 있습니까?
— Ram

18
이 답변은 정말 "왜"설명하지 않습니다
— kizzx2

1
VBA는 매우 영리하며 많은 언어처럼 당신이하고있는 일을 말할 필요가 없습니다. 그러나 이것은 시간을 추가합니다. 모든 종류의 다양한 변형에 대해 서로 다른 차원의 전체 호스트를 사용하는 경우 시간이 더해집니다. VBA가 변수를 볼 때 무엇을 기대해야하는지 알려 주면 해결하지 않아도됩니다. 또한 변수가 문자열이 아닌 정수라고 VBA에 알려 주면 RAM을 많이 차지하지 않습니다. 후자의 요점이 일반적인 소규모 VBA 프로젝트에서는 유효하지 않지만 여전히 좋은 코딩 연습입니다.
— Rapid

변수를 먼저 사용 Set하지 않고 사용해도 괜찮 Dim습니까?
— solstice333

64

그러나 나는 이것이 당신이 정말로 요구하는 것이라고 생각하지 않습니다.

때때로 나는 다음을 사용합니다.

    Dim r as Range
    r = Range("A1")

이것은 작동하지 않습니다. Set그렇지 않으면 런타임 오류 # 91 개체 변수 또는 With 블록 변수가 설정되지 않았습니다 . 개체 참조에 변수 값을 할당 하려면을 사용해야 Set하기 때문 입니다. 그러면 위의 코드 가 작동합니다.

나는 아래 코드가 당신이 정말로 묻는 것을 설명한다고 생각합니다 . 의 우리가 유형을 선언하지 않는 가정하자 r수 Variant대신 유형입니다.

Public Sub test()
    Dim r
    debug.print TypeName(r)

    Set r = Range("A1")
    debug.print TypeName(r)

    r = Range("A1")
    debug.print TypeName(r)
End Sub

자, 여기서 일어나는 일을 분석해 봅시다.

  1. r Variant로 선언 됨

    `Dim r` ' TypeName(r) returns "Empty", which is the value for an uninitialized variant
    
  2. r받는 설정 Range함유 세포 "A1"

    Set r = Range("A1") ' TypeName(r) returns "Range"
    
  3. r받는 사람 설정 값 의 기본 속성 의 Range("A1").

    r = Range("A1") ' TypeName(r) returns "String"
    

이 경우 Range의 기본 속성은 .Value이므로 다음 두 줄의 코드는 동일합니다.

r = Range("A1")
r = Range("A1").Value

기본 객체 속성에 대한 자세한 내용은 Chip Pearson의 "클래스의 기본 멤버" 를 참조하십시오 .


예를 Set들어 :

내가 사용하는 다른 시간

Set r = Range("A1")

먼저 선언하지 않고이 것없는 작품 rA는 Range또는 Variant사용 ... 객체 Dim문을 - 당신이하지 않는 한 Option Explicit어떤 당신이해야 활성화. 항상. 그렇지 않으면 선언하지 않은 식별자를 사용하고 있으며 모두 암시 적으로 Variants로 선언됩니다 .


@PierreClaverie 예 : 그것은 원래 참조를 포함한 것 희미한 및 설정
— 늑대

1
@Wolf는 알고 있는지 확실하지 않지만 VBA 언어 참조는 이제 github에서 유지 관리됩니다. github.com/OfficeDev/VBA-content/blob/master/VBA/…
— RubberDuck

@RubberDuck이 메모를 추가해 주셔서 감사합니다 (vb *를 처음 사용했습니다).
— 늑대

@Wolf 환영합니다. 요즘 VBA 및 이전 VB6 문서를 찾기가 어려울 수 있음을 알고 있습니다.
— RubberDuck

8

Dim : 변수를 정의하고 있습니다 (여기서는 r은 Range 유형의 변수입니다).

설정 : 속성을 설정합니다 (여기서는 r 값을 Range ( "A1")로 설정합니다. 이것은 유형이 아니라 값입니다).

r이 단순한 유형 (예 : int, string)이면 set과 함께 객체를 사용해야합니다. 다음과 같이 작성하면됩니다.

Dim r As Integer
r=5


2

변수가 개체로 정의 된 경우 (예 : Dim myfldr As Folder) 키워드 "Set"을 사용하여 값이 할당됩니다.


1

Dim Dimension의 약자이며 VBA 및 VB6에서 지역 변수를 선언하는 데 사용됩니다.

반면에 설정은 변수 선언과 관련이 없습니다. Set키워드는 데 사용되는 할당 할 새 개체에 개체 변수를.

그것이 당신을 위해 차이점을 명확히하기를 바랍니다.


0

SET 문에 대한 VBA 도움말에 따르면 개체에 대한 참조를 설정하므로 속성을 변경하면 실제 개체도 변경됩니다.

Dim newObj as Object
Set var1=Object1(same type as Object)
Set var2=Object1(same type as Object)
Set var3=Object1(same type as Object)
Set var4=Object1(same type as Object)
Var1.property1=NewPropertyValue

다른 Vars 속성도 변경됩니다.

Var1.property1=Var2.property1=Var3.property1=Var4.property1=Object1.Property1=NewpropertyValue`

실제로 모든 변수는 동일합니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.