엑셀, 매크로, 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.

네이버앱의

블로그 홈화면에 바로가기 추가

+ Recent posts