수색…
통사론
- 식별자 이름 [ arguments ]
- 호출 식별자 이름 [ (arguments) ]
- [Let | Set] expression = 식별자 이름 [ (arguments) ]
- [Let | Set] IdentifierName [ (arguments) ] = 표현식
매개 변수
매개 변수 | 정보 |
---|---|
식별자 이름 | 호출 할 프로 시저의 이름. |
인수들 | 프로 시저에 전달할 인수의 쉼표로 구분 된 목록입니다. |
비고
처음 두 구문은 Sub
프로 시저를 호출하기위한 것입니다. 첫 번째 구문에는 괄호가 포함되지 않습니다.
이 부분은 혼란 스럽습니다.를 보십시오 . 왜 항상 괄호를 사용하지 않는가? 처음 두 문법 사이의 차이점에 대한 철저한 설명.
세 번째 구문은 Function
및 Property Get
프로 시저를 호출하는 구문입니다. 매개 변수가있는 경우 괄호는 항상 필수입니다. Let
키워드는 값을 지정할 때 선택적이지만 Set
키워드는 참조를 지정할 때 필요합니다 .
네 번째 구문은 Property Let
및 Property Set
프로 시저를 호출하기위한 구문입니다. 할당의 오른쪽에있는 expression
이 특성의 value 매개 변수로 전달됩니다.
암시 적 호출 구문
ProcedureName
ProcedureName argument1, argument2
프로 시저를 괄호없이 이름으로 호출하십시오.
엣지 케이스
Call
키워드는 한 가지 경우에만 필요합니다.
Call DoSomething : DoSomethingElse
DoSomething
및 DoSomethingElse
는 호출되는 프로 시저입니다. 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
가 전달되도록 지정하는 프로 시저의 서명과 상관없이 값으로 전달됩니다. 위의 코드에서 ByVal
을 DoSomething
에 전달한 실제 값은 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"
입니다. 값 이 제공되면 기본값을 무시합니다.