엑셀, 매크로, VBA
홈으로 내블로그
포스트
안부글
이웃새글
대문사진으로 나만의 개성표현! 블로그앱 설치
닫기
니꾸 (rosa0189)
Cheers to Excel Users!
이웃추가
(1276) ByVal 와 ByRef 의 차이 (VBA 매크로) 1
VBA 용어|2012.07.25 15:43
앱으로 보기
작게 크게
이 형배님의 "엑셀 2000 VBA" 책에 나온 두 키워드의 정의를 살펴 보면 아래와 같다.
ByVal (인수의 값 건네기) : 인수 값의 복사를 건넵니다. 호출된 프로시저(subPro()) 측에서 값을 변경해도 메인 프로시저(mainPro()) 값은 변경되지 않음.
ByRef (인수의 참조 건네기) : 인수 값을 직접 건네는 것이 아니라, 인수가 저장된 메모리 어드레스를 나타내는 지표(포인터)를 건넵니다. 인수에 키워드를 지정하지 않는 경우도 이 방법으로 건네집니다. 호출된 프로시저측에서 인수의 값을 변경하면 메인 프로시저 값도 변경되어 버리므로 주의가 필요.
컴퓨터 프로그래밍 공부좀 한 사람은 위 내용만으로 무슨말인지 알아듣지만, 엑셀만을 사용하는 일반인에게는 수수께끼와 같다. 하지만 하나 확실한 것은, 위에서 보듯 두 키워드의 차이는 메인 프로시저의 값이 변경되느냐, 변경되지 않느냐의 차이이다. 책에 있는 예제 코드를 이용하여 비교해보자.
Sub mainPro()
Dim i As Integer
Dim j As Integer
i = 99
j = 99
Call subPro(i, j)
MsgBox "i : " & i & vbCr & _
"j : " & j
End Sub
Sub subPro(ByVal i As Integer, ByRef j As Integer)
i = 999
j = 999
End Sub
매크로 실행 후 출력되는 메시지 창의 결과
_________________________________________________________________________________________
여기 까지가 책의 설명이고 두 키워드의 대략적인 차이를 알 것 같다. 그런데, 도대체 이걸 어디에 써먹으라는 것일까? 어떤 코드이든 정의만 알고 있으면 소용없다. 엑셀에서 두 키워드를 직접 사용하고 그 결과 값을 셀에 입력하며 비교해보자.
Sub fill_ByVal() Sub fill_ByRef()
Dim i As Integer Dim i As Integer
Dim r As Integer Dim r As Integer
r = 1 r = 1
For i = 1 To 5 For i = 1 To 5
Cells(r, 1) = by_Val(r) Cells(r, 5) = by_Ref(r)
Next i Next i
End Sub End Sub
Function by_Val(ByVal r As Integer) Function by_Ref(ByRef r As Integer)
r = r + 1 r = r + 1
by_Val = r by_Ref = r
End Function End Function
매크로 실행 전
매크로 실행 후 결과
위에서 보는 바와 같이 ByVal를 사용하는 왼쪽코드의 경우 메인 프로시저인 fill_ByVal의 r 값이 by_Val 함수를 순환하고 오면 1만 더해지므로 A1셀에만 값 2가 5번 입력된다. 하지만, ByRef를 사용하는 오른쪽 코드의 경우 메인 프로시저인 fill_ByRef의 r 값이 by_Ref 함수를 순환하고 올 때마다 1씩 증가되므로 행이 1씩 증가하며 값이 입력된다.
물론 메모리 어드레스, 포인터 등의 용어의 의미를 알면 더 좋겠지만 잘 모를 경우 두 키워드의 구분은 간단히, 메인 프로시저와 하위 프로시저 양쪽에서 연계하여 사용하게 되면 ByRef를 사용하고, 특정 프로시저 내에서만 사용되고 사라질 내용이면 ByVal를 사용한다고 생각해도 무방하다.
라인 카카오톡 밴드 보내기 북마크
byVal_Or_ByRef.xlsm
덧글1
덧글쓰기
목록
VBA 용어 카테고리의 다른 글
(1329) 디버깅 시 사용되는 MsgBox, Stop, Debug.Assert, 조사식창, 중단점 (VBA 매크로) (5)
(1276) ByVal 와 ByRef 의 차이 (VBA 매크로) (1)
(1253) Range("셀범위").Dirty 의 뜻 (VBA 매크로) (1)
(1226) Backstage View - 사용자정의 파일메뉴 (VBA 매크로)
(1217) Range("A1").Value, Range("A1").Text, Range("A1").Formula 의 차이 (VBA 매크로) (1)
다음
블로그 앱 설치맨위로
로그아웃 전체 앱 PC버전 전체서비스
도움말 | 문의 및 신고
© NHN Corp.
네이버앱의
블로그 홈화면에 바로가기 추가