지식은 공유되었을 때 그 힘을 발휘한다.



AutoCAD ActiveX 맛보기 강좌(14)

range를 인자로 받는 함수만들기
어제 만든 함수는 2차방정식의 해를 돌려주는 함수였습니다. 그럼 이것을 어떻게 사용하면 될까요? VBA에서는 module에서 만든 함수는 일반 엑셀함수와 같이 셀에서 사용할 수 있습니다. 예를 들어 아래와 같이 a,b,c값을 셀에다 입력한 후에 다른셀에 =sol(B1,B2,B3)이라면 됩니다.



이번에는 range를 인자로 받는 함수를 만들어보겠습니다. 사실 굳이 레인지로 받는 것이 아니라 위의 함수를 그대로 이용해도 됩니다.

Function sol(rng)
  a = rng.cells(1)
  b = rng.cells(2)
  c = rng.cells(b)
  sol = (-b - (b ^ 2 - 4 * a * c) ^ 0.5) / (2 * a)
End Function

위와 같이 함수를 고쳐볼까요? 그리고 엑셀에서 호출을 =sol(b1:b3)와 같이 범위를 잡아서 호출을 합니다.



어떻가요 결과는 같지요? rng란 인자를 통해서 range개체로 넘어오고 sol함수내에서 cells()속성을 이용해서 첫번째것을 a로 두번째것을 b로 세번재것을 c로 대입해서 sol을 풀어냈습니다. 하지만 이렇게 하지 않고 아래와 같이 하는 방법도 있습니다.


Function sol(rng)
  a = rng(1)
  b = rng(2)
  c = rng(3)
  sol = (-b - (b ^ 2 - 4 * a * c) ^ 0.5) / (2 * a)
End Function

rng는 결국 배열로 들어온다는 것을 알수 있습니다.

이번에는 지난번에 만든 여러셀을 더하는 프로그램을 좀 수정해서 함수로 만들어보도록 하겠습니다. 기억나시죠? 선택된 셀들에 대해서 for문을 이용해서 더한 다음에 결과를 msg문으로 보여주었던 프로그램. 그것을 엑셀함수로 만들어서 셀에서 직접 입력할 수 있도록 해서 더해진 셀들의 결과를 돌려주도록 만들면 될것입니다.

Function sumcells(arange As Range)
  icount = arange.Count
  For i = 1 To icount
    Sum = Sum + arange.Cells(i)
  Next i
  sumcells = Sum
End Function

위와 같이 코딩을 한다음에 엑셀의 셀에서 sumcells(b1:b3)하면 모두 더한 결과를 돌려줄것입니다. 위의 코드는 이해가 가시죠? 지난번 sub로 만들었던 것과 다른것은 sub가 function으로 바뀌었고 sumcells에 인자로 넘어오도록 ()안에 arange as range를 추가 하고, 마지막에 sumcells=sum으로 결과값을 함수명에 대입시킨 것 뿐입니다. 인자의 형을 range로 정의해도 되지만 아래와 같이 정의 하지 않고 사용해도 됩니다. 이렇게 형을 지정하지 않는 경우에는 자동으로 Variant형으로 선언됩니다. Variant형은 주어진 값에 따라서 형이 정해집니다.

Function sumcells(arange)
  icount = arange.Count
  For i = 1 To icount
    Sum = Sum + arange.Cells(i)
  Next i
  sumcells = Sum
End Function


dolljong@dreamwiz.com