이것은 VBA 인터뷰에서 가장 많이 묻는 질문 중 하나입니다. 이 기사에서는 Excel VBA에서 ByVal과 ByRef 인수의 차이점에 대해 알아 봅니다.

정의 :

ByRef 인수 : 참조에 의한 리터럴 짧은 형식입니다. 인수가 ByRef 인수로 다른 하위 또는 함수에 전달되면 실제 변수의 참조가 전송됩니다. 변수 사본에 대한 변경 사항은 원래 인수에 반영됩니다.

값 대신 함수에 ByRef를 사용하여 값의 위치를 ​​함수로 보낸다고 말할 수 있습니다.

이것은 VBA의 기본 인수입니다. 인수 전에 ByRef를 작성할 필요가 없습니다.

구문 :

Sub x (a as Variant)

‘또는 Sub x (ByRef a as Variant)

ByVal 인수 : 값에 의한 리터럴 짧은 형식입니다. 인수가 ByVal 인수로 다른 하위 또는 함수에 전달되면 인수 값만 전송됩니다. 원래 인수는 그대로 유지됩니다. 외부 함수 또는 하위에서 변경된 사항은 원래 인수에 반영되지 않습니다.

인수를 ByVal로 선언하려면 인수 앞에 ByVal 키워드를 사용해야합니다.

구문 :

Sub x (ByVal a as Variant)

이제 우리는 정의를 알고 있습니다. 예를보고 넘어 갑시다.

ByRef 예제 여기에 간단한 프로그램이 있습니다.

Sub X(ByRef a As Variant)

a = 20

Debug.Print "in sub X value of a = " & a

End Sub

Sub Y()

a = 10

Call X(a)

Debug.Print "in sub Y value of a = " & a

End Sub

여기에 두 개의 서브 루틴이 있습니다. 첫 번째 하위는 변형 인수를 ByRef로 취하는 X입니다. (ByRef 키워드를 생략 할 수 있습니다. 기본값입니다.)

다음으로 a = 20 end 값을 설정하고 a 값을 인쇄합니다.

Sub Y는 서브 루틴 X를 호출하는 메인 서브 루틴입니다. a = 10의 값을 설정 한 다음 서브 루틴 X를 호출하고 a를 인수로 전달합니다.

그런 다음 Y에서 a의 값을 인쇄합니다.

이제 Sub Y를 실행하면 이것이 출력됩니다.

a = 20의 하위 X 값에서 a = 20의 하위 Y 값에서

0046

결론 : 원본 a의 값은 서브 X에 의해 변경되고 두 서브 모두에 ​​대해 20으로 설정됩니다. Sub Y가 실행될 때 a의 초기 값이 10임을 알 수 있습니다. Y는 X (a)를 호출합니다. X는 a = 20의 값을 설정합니다. “a = 20의 sub X 값에서”를 인쇄합니다.

제어는 y로 돌아가서 a = 20의 하위 Y 값으로 인쇄합니다.

이것이 ByRef 인수의 효과입니다.

ByVal 예 :

이것은 ByVal 예제입니다

Sub X(ByVal a As Variant)

a = 20

Debug.Print "in sub X value of a = " & a

End Sub

Sub Y()

a = 10

Call X(a)

Debug.Print "in sub Y value of a = " & a

End Sub

두 예제는 인수 전달의 유일한 차이점을 제외하고 동일합니다.

여기 X에서 인수는 ByVal로 선언됩니다. 이번에 Y 서브 루틴을 실행하면 출력은 다음과 같습니다.

a = 20의 하위 X 값에서 a = 10의 하위 Y 값에서

0047

결론 : 원본 a의 값은 sub X에 의해 변경되지 않습니다. X의 경우 20이고 Y의 경우 10입니다. Y가 a로 X를 호출하면 a의 주소가 아닌 a의 값만 보냅니다.

따라서 a에서 변경 한 사항은 원래 변수에 반영되지 않습니다.

테스트를 위해 20으로 설정하기 전에 X의 a 값을 인쇄하면 10이 인쇄됩니다. 10은 byVal을 사용하여 X에서 a로 전달되기 때문입니다. ByRef를 사용하여 Y의 a를 X의 a로 보냈습니다.

0048

쉬운 질문이지만 우리 중 많은 사람들이 vba 인터뷰 질문에서 이것을 혼동합니다. 그 이유는 우리가 그것을 많이 사용하지 않기 때문입니다. 대부분의 경우 다른 변수에 값을 복사합니다. * 예 여러분, 이것은 Excel VBA의 ByRef 및 ByVal 인수의 차이입니다. 이 항목이나 다른 VBA 또는 Excel 항목과 관련하여 의심스러운 점이 있으면 알려주세요. 댓글 섹션은 모두 귀하의 것입니다.

관련 기사 :

link : / files-workbook-and-worksheets-in-vba-delete-sheets-without-confirmation-prompts-using-vba-in-microsoft-excel [Microsoft Excel에서 VBA를 사용하여 확인 메시지없이 시트 삭제]

link : / files-workbook-and-worksheets-in-vba-add-and-save-new-workbook-using-vba-in-microsoft-excel [Microsoft Excel 2016에서 VBA를 사용하여 새 통합 문서 추가 및 저장]

link : / menus-toolbars-status-bar-in-vba-display-a-message-on-the-statusbar-using-vba-in-microsoft-excel [Excel VBA 상태 표시 줄에 메시지 표시]

link : / general-topics-in-vba-turn-off-warning-messages-using-vba-in-microsoft-excel [Microsoft Excel 2016에서 VBA를 사용하여 경고 메시지 끄기]

인기 기사 :

link : / formulas-and-functions-introduction-of-vlookup-function [Excel의 VLOOKUP 함수]

link : / tips-countif-in-microsoft-excel [Excel 2016의 COUNTIF]

link : / excel-formula-and-function-excel-sumif-function [Excel에서 SUMIF 함수 사용 방법]