Skip Navigation Links.
Expand VBAVBA
엑셀프로그래밍이 필요한 이유
Expand ExcelExcel
Expand External LibraryExternal Library
Expand SolutionSolution
Expand EssayEssay

Variables|Optional|ByRef|ByVal|ParamArray|

프로시져의 선언구문에 선언된 특별한 변수

이 변수는 프로시져내부에 선언되거나 외부에
선언되는것이 아니고
프로시져가 선언되는 선언구문에 선언되는 변수이다
이것을 매개변수(Parameter)라고 한다
말 그대로 두개의 프로시져간에 매개적 역할을 하므로
매개변수인것이다
물론 이것도 변수의 타입과 사이즈를 앞에서 설명한것과 똑같지만
선언된 위치가 틀린것 뿐이다

아래의 콤보상자에서 숫자를 선택후 버튼을 크릭해보시기 바란다




매개변수같은 이상한 이름의 변수가 왜 필요할까??
그림을 나타내라는 프로시져를 만들고
가로로 몇개 세로로 몇개를 만들것인지 두개의 정보를 프로시져로
전달하게 된다
그러면 프로시져는 전달받은 갯수를 기준으로 일을 하게 되는것이다



버튼을 크릭하면서 호출되는 프로시져에서는
기본적인 정보수집작업(콤보상자에서 값읽기)를 하였다
물론 한프로시져내에서 처리하여도 좋겠지만
정보수집을 하는 정보담당자와 작전지시를 하는 작전담당자가
첫번째프로시져(callDrawPicture)에 있고
실제로 포를 날리는 전투병과는 별도의 프로시져(drawPicture)로 한다..
라는 기능별 구분을 습관화시키는것이 좋다
그래서 매크로대화상자에서 매개변수를 갖고 있는 프로시져는
매크로목록에 나타나지 않는다

그래서 엑셀프로그래밍을 잘하려면 일머리를 잘 아는 사람이
월등 속도감이 붙고..
그래서 일을 규모있게 효율적으로 잘하는 훈련용툴이 되기도 한다

아래의 화일은 아직은 초보님들에게 난해하겠지만..
엑셀의 오브젝트부분을 보시고 나면 별 문제가 되지 않을것이다
매개변수가 왜 전달되어야 하는지의 관점에서만 우선 보시고
나중에 반복하여 보시면 도움이 될것이다


Passing Argument To Parameter Of Procedure

Optional Parameter/ 선택적 매개변수

같은 프로시져를 필요한 여러곳에서 사용하게 된다
예를 들어서 어떤 프로시져에는 열방향으로 한줄만 그림을 그리고
싶을 경우가 있을것이다

예를 들어보기 위하여 아래의 버튼을 크릭해 보시기 바란다




위에서 매개변수를 두개(행,열갯수)를 받는 프로시져를
그대로 반복하여 사용하면 더 좋지 않겠는가??
프로시져를 만들때 융통성있게 만드는것이 좋은것이다
매개변수가 하나만 들어 와도 처리할수있게 하고
두개가 들어와도 처리할수있도록 하자는 것이다
그런데 두개의 매개변수를 기다리는 프로시져에
하나의 매개변수를 전달하면 에러가 난다..!#@##$
이것을 방지하기 위하여 생긴것이 선택적 매개변수인것이다



Sub drawPicture(가로갯수,Optional 세로갯수=1)
Optional 세로갯수에 =1 을 준것은 만약 아무값도 들어오지
않는다면 기본값을 1을 정한다!!
라는 약속을 한것이다
경우에 따라서 더욱 융통성있게 해주기 위한것이다,그냥 아래와 같이
Sub drawPicture(가로갯수,Optional 세로갯수)
로 하여도 된다

또한 주의할점은 아래와 같이 하면 에러난다
Sub drawPicture(Optional 세로갯수,가로갯수)
선택적매개변수(Optional)의 뒤에 오는 매개변수는 반드시 같은
Optional이어야 한다
다시 말해서 Optional은 매개변수의 순서의 맨뒤에 위치해야 하는것이다

아래 화일도 역시 엑셀의 오브젝트를 이해하고 보셔야 전체가 보이나
선택적 매개변수의 활용부분만 눈여겨 보시기 바란다

Optional Parameter

ByRef/ByVal..배열을 주소(Reference)로 전달하기와 값(Value)으로 전달하기

매개변수는 2가지 형식으로 전달된다
어떤 형식인지 지정을 하지 않는 다면

Sub callMe(intX As Integer,intY As Integer)
     ....
     ....
End Sub

위와 같이 특별한 형식의 지정없이 매개변수를 선언하면

Sub callMe(ByRef intX As Integer,ByRef intY As Integer)
     ....
     ....
End Sub

와 같이 기본적(Default)으로 ByRef(by reference)로 지정이 된것이다
이것이 무슨 의미일까??
두개의 값을 난수를 발생하여 각각 5로 나누어지는 값이 되도록 하고
싶다.
첫번째 프로시져에서 난수를 intX와 intY에 받아서
다른 프로시져에 일을 시켜서 intX와 intY두개의 값을 5로 나누어지는 값으로
하고 싶다(물론 하나의 프로시져에서 할수도 있겠지만..간단한 쌤플을 위한것이다)
그런데 함수에 전달하여 값을 받는것은 Return값이 하나만 전달받는다
두개의 값을 정리하여 같이 받고 싶다

아래의 변수에 마우스를 움직여 보시면 같은 메모리를 참조하고 있는
변수라는 표현을 볼수있을것이다
다른 프로시져에서 자신의 프로시져의 변수를 통째로 같이 사용하는것이다

Sub mainProce()
Dim intX As Integer,intY As Integer
intX=Int(Rnd()*10000)+1000
intY=Int(Rnd()*10000)+1000
trimValue intX,intY
MsgBox "intX의 값은 " &  intX & "|intY의 값은 " & intY
End Sub

Sub trimValue(ByRef intX As Integer,ByRef intY As Integer)
'Sub trimValue(intX As Integer,intY As Integer)와 같이 지정을 해주지
'않아도 기본적으로 ByRef로 처리된다

intX=Application.Ceiling(intX,5)
intY=Application.Ceiling(intY,5)
End Sub

아래와 같이 ByVal로 지정하였을때는 trimValue프로시져에서 intX와 intY에
전달한 값은 mainProcedure의 intX과 intY값에는 전혀 영향을 주지
않는것이다
의도한 결과를 전혀 얻을수 없게 되는것이다

Sub mainProce()
Dim intX As Integer,intY As Integer
intX=Int(Rnd()*10000)+1000
intY=Int(Rnd()*10000)+1000
trimValue intX,intY
MsgBox "intX의 값은 " &  intX & "|intY의 값은 " & intY
End Sub

Sub trimValue(ByVal intX As Integer,ByVal intY As Integer)
intX=Application.Ceiling(intX,5)
intY=Application.Ceiling(intY,5)
End Sub

초보님들은 처음에 예상치도 않은 이상한 결과값을 얻고
한참을 헤맨다..재수없으면 밤을 샌다
위의 경우가 그런 경우중의 하나이다
생각지도 않았는데 다른 프로시져에서 남의 밥통(메모리)의 내용물을
망가뜨린것이다..
그러니 결과값이 예상한대로 나올수가 없다


Pass Parameter ByRef Or ByVal

ParamArray/매개변수의 갯수가 불특정할때 Parameter Arrays를 사용한다

예를 들어서..
"꺼꾸리", "장다리", "길동이", "꺽정이", "돌쇠"
와 같이 몇개의 정보를 다른 프로시져에 전달하여 이름을 오름차순으로
정렬을 해서 받아 보고 싶다,
아래 상자에 이름을 몇개 더 직접입력(콤마로 구분)하시고 버튼 크릭

꺼구리,장다리,길동이,꺽정이,돌쇠    

그런데 사람의 이름이 5명일지..10명일지 상황에 따라서 틀리다
그런 상황의 값을 받아주게 할수 있다면 좋지 않을까??
그래서 필요한것이 ParamArray라는 매개변수인것이다



초보님들이 보기에 좀 어렵다고 하실지 모르겠다
왜냐하면 아직 중요한 배열과 순환문,조건문,그리고
엑셀의 오브젝트들을 다루지 않았기 때문이다
언어는 한번에 순서대로 얻어지지 않는다
몇번을 앞뒤로 보고
또 나중에 미심쩍으면 보고 하는 참고서같은것이 언어의 문법이다
아무쪼록 ..뭐가 뭔지 점점 어려워진다고 생각하지 마시고
고비를 잘 넘기시기 바란다


Pass Parameter As Parameter Arrays