수색…


통사론

  • 식별자 이름 [ arguments ]
  • 호출 식별자 이름 [ (arguments) ]
  • [Let | Set] expression = 식별자 이름 [ (arguments) ]
  • [Let | Set] IdentifierName [ (arguments) ] = 표현식

매개 변수

매개 변수 정보
식별자 이름 호출 할 프로 시저의 이름.
인수들 프로 시저에 전달할 인수의 쉼표로 구분 된 목록입니다.

비고

처음 두 구문은 Sub 프로 시저를 호출하기위한 것입니다. 첫 번째 구문에는 괄호가 포함되지 않습니다.

이 부분은 혼란 스럽습니다.를 보십시오 . 왜 항상 괄호를 사용하지 않는가? 처음 두 문법 사이의 차이점에 대한 철저한 설명.

세 번째 구문은 FunctionProperty Get 프로 시저를 호출하는 구문입니다. 매개 변수가있는 경우 괄호는 항상 필수입니다. Let 키워드는 값을 지정할 때 선택적이지만 Set 키워드는 참조를 지정할 때 필요합니다 .

네 번째 구문은 Property LetProperty Set 프로 시저를 호출하기위한 구문입니다. 할당의 오른쪽에있는 expression 이 특성의 value 매개 변수로 전달됩니다.

암시 적 호출 구문

ProcedureName
ProcedureName argument1, argument2

프로 시저를 괄호없이 이름으로 호출하십시오.


엣지 케이스

Call 키워드는 한 가지 경우에만 필요합니다.

Call DoSomething : DoSomethingElse

DoSomethingDoSomethingElse 는 호출되는 프로 시저입니다. Call 키워드가 제거 된 경우 DoSomething 은 프로 시저 호출이 아닌 라인 레이블 로 구문 분석되므로 코드가 손상됩니다.

DoSomething: DoSomethingElse 'only DoSomethingElse will run

반환 값

프로 시저 호출 (예 : Function 또는 Property Get 프로 시저)의 결과를 가져 오려면 호출의 오른쪽에 전화를 겁니다.

result = ProcedureName
result = ProcedureName(argument1, argument2)

매개 변수가 있으면 괄호가 있어야합니다. 프로 시저에 매개 변수가없는 경우 괄호는 중복됩니다.

이것은 혼란 스럽다. 왜 항상 괄호를 사용하지 않는가?

괄호는 함수 호출 의 인수를 묶는 데 사용됩니다. 프로 시저 호출 에이 매개 변수 를 사용하면 예기치 않은 문제가 발생할 수 있습니다.

의도하지 않은 값을 프로 시저에 전달하여 런타임에 버그를 가져올 수 있기 때문에 컴파일 타임에 잘못된 구문 일 뿐이므로 버그가 발생할 수 있습니다.

실행 시간

중복 괄호로 인해 버그가 발생할 수 있습니다. 객체 참조를 매개 변수로 취하는 프로 시저가 주어진다면 ...

Sub DoSomething(ByRef target As Range)
End Sub

... 그리고 괄호로 호출 :

DoSomething (Application.ActiveCell) 'raises an error at runtime

이렇게하면 "Object Required"런타임 오류 # 424가 발생합니다. 다른 상황에서는 다른 오류가 발생할 수 있습니다. 여기서 Application.ActiveCell Range 객체 참조가 평가 되고 target ByRef 가 전달되도록 지정하는 프로 시저의 서명과 상관없이 값으로 전달됩니다. 위의 코드에서 ByValDoSomething 에 전달한 실제 값은 Application.ActiveCell.Value 입니다.

괄호는 VBA에서 대괄호로 묶은 식의 값을 평가하고 ByVal 결과를 호출 된 프로 시저에 전달합니다. 평가 된 결과의 유형이 프로 시저의 예상 유형과 일치하지 않고 암시 적으로 변환 될 수없는 경우 런타임 오류가 발생합니다.

컴파일 타임

이 코드는 컴파일에 실패합니다.

MsgBox ("Invalid Code!", vbCritical)

표현식 ("Invalid Code!", vbCritical) 은 값으로 평가 될 수 없기 때문에.

컴파일하고 작동합니다.

MsgBox ("Invalid Code!"), (vbCritical)

그러나 확실히 바보가 보일 것입니다. 여분의 괄호는 사용하지 마십시오.

명시 적 호출 구문

Call ProcedureName
Call ProcedureName(argument1, argument2)

명시 적 호출 구문에는 Call 키워드와 인수 목록 주위의 괄호가 필요합니다. 매개 변수가없는 경우 괄호는 중복됩니다. 이 구문은 더 현대적인 암시 적 호출 구문이 VB에 추가되면 더 이상 사용되지 않습니다.

선택적 인수

일부 프로 시저에는 선택적 인수가 있습니다. 선택적 인수는 항상 필수 인수 뒤에옵니다. 그러나 인수없이 인수를 호출 할 수 있습니다.

예를 들어, ProcedureName 함수가 두 개의 필수 인수 ( argument1 , argument2 )와 하나의 선택적 인수 optArgument3 적어도 네 가지 방법으로 호출 할 수 있습니다.

' Without optional argument
result = ProcedureName("A", "B")

' With optional argument
result = ProcedureName("A", "B", "C")

' Using named arguments (allows a different order)
result = ProcedureName(optArgument3:="C", argument1:="A", argument2:="B")

' Mixing named and unnamed arguments 
result = ProcedureName("A", "B", optArgument3:="C")

여기에서 호출되는 함수 헤더의 구조는 다음과 같습니다.

Function ProcedureName(argument1 As String, argument2 As String, Optional optArgument3 As String) As String

Optional 키워드는이 인수를 생략 할 수 있음을 나타냅니다. 앞서 언급했듯이 헤더에 도입 된 선택적 인수는 필요한 인수 뒤에 끝에 와야합니다 .

값이 함수에 전달되지 않는 경우 인수의 기본값 을 제공 할 수도 있습니다.

Function ProcedureName(argument1 As String, argument2 As String, Optional optArgument3 As String = "C") As String

이 함수에서 c 대한 인수가 제공되지 않으면 기본값은 "C" 입니다. 값 제공되면 기본값을 무시합니다.



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