수색…


비고

운영자는 다음 순서로 평가됩니다.

  • 수학 연산자
  • 비트 연산자
  • 연결 연산자
  • 비교 연산자
  • 논리 연산자

우선 순위가 일치하는 연산자는 왼쪽에서 오른쪽으로 평가됩니다. 괄호 () 를 사용하여 식을 그룹화하면 기본 순서를 재정의 할 수 있습니다.

수학 연산자

우선 순위 순서대로 나열 :

토큰 이름 기술
^ 지수 계산 왼쪽 피연산자를 오른쪽 피연산자의 값으로 올린 결과를 반환합니다. 멱지수가 반환하는 값은 나눌 값 유형에 관계없이 항상 Double 입니다. 계산을 수행 한 후에 결과를 가변 유형으로 강제 변환합니다.
/ 구분 1 왼쪽 피연산자를 오른쪽 피연산자로 나눈 결과를 반환합니다. 나누기로 반환되는 값은 나누어지는 값 형식에 관계없이 항상 Double 입니다. 계산을 수행 한 후에 결과를 가변 유형으로 강제 변환합니다.
* 곱셈 1 2 개의 피연산자의 곱을 구합니다.
\ 정수 부 반올림하여 양측을 반올림 한 후 왼쪽 피연산자를 오른쪽 피연산자로 나눈 정수 결과를 반환합니다. 부서의 나머지는 무시됩니다. 오른쪽 피연산자 (제수)가 0 이면 런타임 오류 11 : 0으로 나누기가 발생합니다. 이것은 모든 반올림이 수행 된 후에 발생합니다. 3 \ 0.4 와 같은 표현식도 0으로 나누기 오류가됩니다.
Mod 모듈러스 왼쪽 피연산자를 오른쪽 피연산자로 나눈 나머지 정수를 반환합니다. 각 측면의 피연산자는 나누기 전에 정수로 반올림되며 .5는 반올림됩니다. 예를 들어, 8.6 Mod 312 Mod 2.6 모두 0 됩니다. 오른쪽 피연산자 (제수)가 0 이면 런타임 오류 11 : 0으로 나누기가 발생합니다. 이것은 모든 반올림이 수행 된 후에 발생합니다. 3 Mod 0.4 와 같은 표현식도 0으로 나누기 오류가됩니다.
- 뺄셈 2 왼쪽 피연산자에서 오른쪽 피연산자를 뺀 결과를 반환합니다.
+ 추가 2 2 개의 피연산자의 합을 구합니다. 이 토큰은 String 적용될 때 연결 연산자로 취급됩니다. 병합 연산자를 참조하십시오.

1 곱셈과 나눗셈은 같은 우선 순위를 갖는 것으로 취급됩니다.

2 더하기와 빼기는 같은 우선 순위로 취급됩니다.

연결 연산자

VBA는 2 개의 다른 연결 연산자 인 +& 지원하며 String 유형과 함께 사용하면 똑같은 기능을 수행합니다. 오른쪽 String 은 왼쪽 String 끝에 추가됩니다.

& 연산자가 String 아닌 변수 유형과 함께 사용되면 연결되기 전에 String 암시 적으로 형변환됩니다.

+ 연결 연산자는 + 더하기 연산자의 오버로드입니다. + 의 동작은 피연산자의 변수 유형 과 연산자 유형의 우선 순위에 따라 결정됩니다. 두 피연산자 모두 String 의 하위 유형 인 String 또는 Variant 로 입력하면 연결됩니다.

Public Sub Example()
    Dim left As String
    Dim right As String
    
    left = "5"
    right = "5"
    
    Debug.Print left + right    'Prints "55"
End Sub

양쪽는 숫자 형이고 다른 쪽이 경우 String 의 숫자를 강요 할 수 있고, 수학 연산자의 형태 우선 운영자가 부가 연산자로 처리하고, 수치가 추가 발생 :

Public Sub Example()
    Dim left As Variant
    Dim right As String
    
    left = 5
    right = "5"
    
    Debug.Print left + right    'Prints 10
End Sub

이 동작은 특히 Variant 형식이 사용되는 경우 오류를 디버그하기가 어렵 기 때문에 일반적으로 & 연산자 만 병합에 사용해야합니다.

비교 연산자

토큰 이름 기술
= 동일 왼손 및 오른손 피연산자가 동일하면 True 반환합니다. 이것은 대입 연산자의 오버로드임을 참고하십시오.
<> 같지 않음 왼손 및 오른손 피연산자가 같지 않으면 True 반환합니다.
> 보다 큰 왼쪽 피연산자가 오른쪽 피연산자보다 큰 경우 True 반환합니다.
< 미만 왼쪽 피연산자가 오른쪽 피연산자보다 작은 경우 True 반환합니다.
>= 크거나 같음 왼쪽 피연산자가 오른쪽 피연산자보다 크거나 같으면 True 반환합니다.
<= 작거나 같음 왼쪽 피연산자가 오른쪽 피연산자보다 작거나 같으면 True 반환합니다.
Is 기준 자본 왼쪽 객체 참조가 오른쪽 객체 참조와 동일한 인스턴스 인 경우 True 반환합니다. Nothing (null 개체 참조)과 함께 사용할 수도 있습니다. 참고 : Is 연산자는 비교를 수행하기 전에 두 피연산자를 Object 로 강제 변환합니다. 한 쪽이 원시 형식 이거나 개체 (비 개체 하위 형식 또는 vtEmpty )를 포함하지 않는 Variant 인 경우 비교는 런타임 오류 424 - "필요한 개체"가됩니다. 두 피연산자가 동일한 객체의 다른 인터페이스 에 속하면 비교 결과가 True 를 반환합니다. 인스턴스 인터페이스의 형평성을 테스트해야한다면 ObjPtr(left) = ObjPtr(right) 대신 사용하십시오.

노트

VBA 구문은 비교 연산자의 "체인"을 허용하지만 이러한 구조는 일반적으로 피해야합니다. 비교는 항상 한 번에 2 개의 피연산자에서만 왼쪽에서 오른쪽으로 수행되며 각 비교 결과는 Boolean 됩니다. 예를 들어, 표현식은 ...

a = 2: b = 1: c = 0
expr = a > b > c

... 어떤 문맥에서 bac 사이에 있는지 여부를 테스트하는 것으로 읽을 수 있습니다. VBA에서는 다음과 같이 평가됩니다.

a = 2: b = 1: c = 0
expr = a > b > c
expr = (2 > 1) > 0
expr = True > 0
expr = -1 > 0 'CInt(True) = -1
expr = False

Is 와는 다른 비교 연산자는 피연산자로 Object 와 함께 사용되며 Object기본 멤버 의 반환 값에 대해 수행됩니다. 개체에 기본 멤버가 없으면 비교에서 런타임 오류 438 - "개체가 해당 속성 또는 메서드를 지원하지 않습니다"가 발생합니다.

Object 가 초기화되지 않은 경우, 런타임 오류 91 - "Object variable 또는 With 블록 변수가 설정되지 않음"이 비교됩니다.

리터럴 NothingIs 아닌 다른 비교 연산자와 함께 사용되면 컴파일 오류가 발생합니다. "잘못된 객체 사용".

Object 의 기본 멤버가 다른 Object 경우 VBA는 기본 유형이 반환되거나 오류가 발생할 때까지 각 연속 반환 값의 기본 멤버를 계속 호출합니다. 예를 들어, SomeClassChildValue 의 기본 멤버가있는 ChildClass 의 인스턴스 인 Value 의 기본 멤버가 있다고 가정 ChildClass . 비교 ...

Set x = New SomeClass
Debug.Print x > 42

...로 평가됩니다 :

Set x = New SomeClass
Debug.Print x.Value.ChildValue > 42

피연산자 중 하나가 숫자 형이고 다른 피연산자가 하위 유형 StringString 또는 Variant 이면 숫자 비교가 수행됩니다. 이 경우 String 을 숫자로 변환 할 수없는 경우 런타임 오류 13 - "형식이 일치하지 않습니다"가 비교 결과로 나타납니다.

피연산자가 모두 하위 유형 StringString 또는 Variant 인 경우 코드 모듈의 Option Compare 설정에 따라 문자열 비교가 수행됩니다. 이러한 비교는 문자 단위로 수행됩니다. 수치를 포함한 String문자 표현 은 수치의 비교와 같지 않습니다 .

Public Sub Example()
    Dim left As Variant
    Dim right As Variant
    
    left = "42"
    right = "5"
    Debug.Print left > right              'Prints False
    Debug.Print Val(left) > Val(right)    'Prints True
End Sub

이러한 이유로 String 또는 Variant 변수가 숫자 불일치 비교를 수행하기 전에 숫자로 변환되었는지 확인하십시오.

한 피연산자가 Date 인 경우 다른 피연산자가 숫자이거나 숫자 유형으로 변환 될 수있는 경우 기본 Double 값의 숫자 비교가 수행됩니다.

다른 피연산자가 현재 로캘을 사용하여 Date 로 캐스팅 될 수있는 String 또는 하위 유형 String Variant 인 경우 StringDate 로 캐스팅됩니다. 현재 로캘의 Date 로 캐스팅 할 수없는 경우 런타임 오류 13 - "형식 불일치"비교에서 발생합니다.


Double 값 또는 Single 값과 부울 값을 비교할 때는주의해야합니다. 다른 숫자 형식과 달리 부동 소수점 숫자가 포함 된 비교의 데이터 형식을 Double 로 승격시키는 VBA의 동작으로 인해 0이 아닌 값은 True 로 가정 할 수 없습니다.

Public Sub Example()
    Dim Test As Double
    
    Test = 42        Debug.Print CBool(Test)             'Prints True.
    'True is promoted to Double - Test is not cast to Boolean
    Debug.Print Test = True             'Prints False
    
    'With explicit casts:
    Debug.Print CBool(Test) = True      'Prints True
    Debug.Print CDbl(-1) = CDbl(True)   'Prints True
End Sub

비트 단위 \ 논리 연산자

VBA의 모든 논리 연산자는 같은 이름의 비트 연산자의 "재정의"라고 생각할 수 있습니다. 기술적으로 항상 비트 연산자로 취급됩니다. VBA의 모든 비교 연산자는 부울을 반환합니다. 부울 은 항상 비트 세트 ( False ) 또는 모든 비트 세트 ( True )를 갖지 않습니다. 그러나 모든 비트가 True 설정된 값을 처리합니다. 즉, 표현식의 비트 결과를 Boolean 캐스팅 한 결과 (비교 연산자 참조)는 항상이를 논리 표현식으로 처리하는 것과 같습니다.

이 연산자 중 하나를 사용하여 표현식의 결과를 할당하면 비트 결과가 나타납니다. 아래 진리표에서 0False 와 같고 1True 와 같습니다.


And

반환 True 양쪽에있는 표현식로 평가되는 경우 True .

왼쪽 피연산자 오른손 피연산자 결과
0 0 0
0 1 0
1 0 0
1 1 1

Or

반환 True 표현의 양쪽이로 평가되면 True .

왼쪽 피연산자 오른손 피연산자 결과
0 0 0
0 1 1
1 0 1
1 1 1

Not

반환 True 식이로 평가되면 FalseFalse 식 평가의 경우에 True .

오른손 피연산자 결과
0 1
1 0

Not 좌측 피연산자가없는 유일한 연산이다. Visual Basic 편집기는 왼쪽 된 인수를 사용하여 식을 자동으로 단순화합니다. 입력하는 경우 ...

Debug.Print x Not y

... VBE는 줄을 다음과 같이 변경합니다.

Debug.Print Not x

유사한 단순화는 Not 대한 왼쪽 피연산자 (표현식 포함)를 포함하는 모든 표현식에 적용됩니다.


Xor

"독점 또는"이라고도합니다. True 이 모두 서로 다른 결과를 얻으면 True 반환합니다.

왼쪽 피연산자 오른손 피연산자 결과
0 0 0
0 1 1
1 0 1
1 1 0

Xor 연산자는 논리 연산자처럼 사용할 수 있지만 비교 연산자 <> 와 동일한 결과를 제공하므로 절대 수행 할 이유가 없습니다.


Eqv

"동등성"이라고도합니다. True 이 모두 같은 결과로 평가되면 True 반환합니다.

왼쪽 피연산자 오른손 피연산자 결과
0 0 1
0 1 0
1 0 0
1 1 1

점을 유의 Eqv 함수로서 매우 드물게 사용하지 않는 x Eqv y 훨씬 더 판독 동등 Not (x Xor y) .


Imp

"암시"라고도합니다. 반환 True 두 피연산자가 동일 또는 두 번째 피연산자 인 경우 True .

왼쪽 피연산자 오른손 피연산자 결과
0 0 1
0 1 1
1 0 0
1 1 1

Imp 함수는 거의 사용되지 않습니다. 엄지 손가락의 좋은 규칙은 그것이 의미하는 바를 설명 할 수 없다면 다른 구조를 사용해야한다는 것입니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow