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"

의 예는 objectRange하는 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하기 때문 입니다. 그러면 위의 코드 작동합니다.

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

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.