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

Excel & VBA---Brain Training




처음 프로그래밍을 배울때
도형을 그려가면서 프로그래밍을 이해하려고 노력한다
그래서 이번 씨리즈는 도형을 중심으로 프로그래밍의 기본을 훈련하도록 하자





위의 작은 사각형은 엑셀에서 그리는 도형을 말한다
위와 같이 무언가를 구현하려고 할때
가장 먼저 생각하여야 할 것이 무엇인가??
무엇일 것 같은가??
어떻게 그릴 것인가..를 생각하면서 반드시 자동적으로
변수를 생각해야 한다
다시 말해서 어떤 정보를 주고 받을 것인지를 생각하여야 한다
사각형을 행방향과 열방향으로 몇개씩 반복해서 만들어야 한다면
어떤 변수가 필요할까??
우선
사각형의 사이즈가 필요하겠지
얼마나 크게 그릴것인가???

Dim iSize As Integer

정사각형이라면 하나의 싸이즈만 있으면 되겠고..
직사각형이라면 가로 세로를 각각 담아줄 변수가 필요할것이다
또 사각형과 사각형을 서로 얼마나 띄워줄것인가???

Dim iGap As Integer

라는 변수가 또 하나 필요하게 될 것이다
또 행방향으로 몇개 열방향으로 몇개가 필요할까?라는 정보를 담아줄 변수가
필요할 것이다

생각하시면서 시트에 구현해 보시기 바란다

Dim shtX As WorkSheet
Dim shpX As Shape
Set shtX =ActiveSheet
Set shpX=shtX.shapes.Add (......)
...

위에서 왜 구태여..ActiveSheet를 shtX 라는 변수에 담고 사용할까..
그냥 ActiveSheet를 계속 사용하면 될텐데..

Set shpX=ActiveSheet.Shapes.Add(...)

한번 직접 해보시기 바란다..
그리고 뭐가 다른지 찾아내면 성공!!..아하!!그렇구나..이것이 훨씬 편리하구나..
그래서 열심히 변수를 만드는 구나!!!
설명생략한다...왜냐면 지난씨리즈에서 어딘가에서 설명한 기억이 나니까..
그냥 이유를 알면 자~알 열심히 보신것이고..
그렇지 않으면 건성으로 보신것이고..

엑셀의 셀은 추가생성하는 것이 아니고 이미 만들어진 것에 접근하는것
이라고 지난 씨리즈에서 이야기했었다
그러나 도형은 계속 생성해나가는 재미가 있다..
여러분의 컴퓨터의 메모리자원(엑셀이 시스템에서 배정받은 자원)이
고갈 될때까지 생성해 나간다

위의 내용을 몇페이지로 확장이 될지 모른다..계획잡고 나가는 것이 아니고
다양한 도형을 구현해 보면서 프로그래밍이 자신의 것이 되어가도록 할것이다

도형을 표현하는 오브젝트는 엑셀이 버전업되면서 다양하게 변화되어
현재상태에서는(또 미래에 어떻게 변화발전될지 모를일..)
Worksheet오브젝트의 속성 Shapes라는 집합체오브젝트에서 관리하게 된다
집합체오브젝트에서 관리한다는 의미는
집합체에 새로운 도형을 만들어서 추가 시킬수 있다는 의미가 포함된다

Shapes.Add

Worksheets("어떤워크시트").Shapes라는 속성..
즉 집합체오브젝트를 만들어주는 속성
그런데 아주 좋은 이야기는 Shape오브젝트 Shapes집합체오브젝트는
엑셀에서만 활용하는 것이 아니라
파워포인트에서, 워드에서도 자동화할때 그대로 엑셀에서 배운대로 활용하면 된다
파워포인트에 도형을 추가시킨다면

ActivePresentation.Slides(1).Shapes.Add

와 같이 Worksheets("어떤시트")라는 Shapes집합체오브젝트의 부모대신에
파워포인트에서의 부모를 갖다 대면 되는 것이다
또한 워드에서도

ActiveDocument.Shapes.Add

와 같이 Worksheets("어떤시트")대신에 워드의 상위오브젝트를 앞에 붙이면
되는 것이라는 것이니..
여기에서 도형을 다루는 것을 익힌다면 워드나 파워포인트도 거져먹구
들어간다는 점이니..얼마나 좋은가??!!
나는 뭐..도형 쓸일이 별로 없어서..!@#@!라고 하시려나???
도형은 숫자로 표현하기 힘든 내용을 좀더 간략하고 강력하게 전달하는
효과가 크다는 점(Visual Power)을 아시면 도형을 무시하지 못하실것이다

그런데 다른 오브젝트들은 Add메소드를 사용하는데
도형은 쫌짜식이 별나게 구느라구 Add대신에 AddShape라는 메소드라는
이름으로 오브젝트를 추가시켜 나간다!!!
위에서 모두 Add를 일부러 붙여 놓고 나중에 AddShape를 사용하여야 한다고
하였으니 헷갈리지 마시고..헷갈릴 것도 없다.. 일반적인 오브젝트들은 대개가 Add라는 것을 강조..ASP.NET이라던가 다른
JavaScript라던가 오브젝트를 추가할때 Add가 일반적이다
아무튼..집합체오브젝트(Shapes)를 입력하고 쩜을 딱찍으면
AddShape 메소드가 리스트에
나타나니까...별 신경쓸것 없다

Worksheets("어떤시트").Shapes.AddShape(,,,,)

메소드는 매개변수를 일반적으로 5개를 갖고 있다
특수한 경우에는 몇개더 있기도 하지만
일반적으로 5개를 갖고 있다고 생각하시고
첫째매개변수는 어떤 도형을 그릴것이냐..
사각형이냐..별이냐..동르라미냐..등등
오피스가 제공하는 다양한 도형을
AddShape()메소드의 첫번째 인수로 전달하고
또 골치아플것이 없는 것이 AddShape( 라고
괄호을 탁치면 매개변수가
열거상수로 주욱 나타나니까..선택만 하면 자동입력된다



열거상수의 이름이 모두 앞에 mso가 붙어 있다
다른 엑셀열거상수는 xl이 붙어있었는데 mso가 붙어있다
microsoft office의 약자..다시 말하면 엑셀의 소유물이 아닌 오피스전체에
도형오브젝트를 공급하는 라이브러리라는 것이다
그러니 엑셀,워드,파워포인트등에서도 같은 상수이름으로 사용된다는 이야기..

아래 그림과 같은 도형의 일반적인 위치와 폭의 속성값의 원칙을
지키면 모든 도형을 자연스럽게 표현할 수 있게 된다



속성이라니요??
메소드의 Width,Height,Left,Top이 매개변수라면서 뭔 속성??

아래 프로시져를 붙여 넣고 실행하면서 잘 관찰하여 보시기를,..

Sub drawBoxToSeeProerty()
Dim shtX As Worksheet
Dim shpX As Shape
Set shtX = ActiveSheet
Set shpX = shtX.Shapes.AddShape(msoShapeRectangle, 50, 50, 100, 100)
DoEvents
MsgBox "도형이 그려졌다..속성을 적용해 보자..잘 관찰요!!"
With shpX
    .AutoShapeType = msoShape24pointStar
    .Left = .Left + 100
    .Top = .Top + 100
    .Left = .Left + 100
    .Width = .Width * 2
    .Height = .Height * 2
End With
End Sub

폭 100,높이 100, X값 50,Y값 50을 주고 사각형을 생성한후
이것을 shpX변수에 넣었고
다시 shpX의 속성들을 건드려 주어 보았다
사각형은 사라지고 별이 한가운데로 이동되고 폭과 높이도 두개가 되었다
이것은 별이 그려진것이 아니고
사각형의 속성을 바꾸어 준 것이다
그러니 하나의 오브젝트에 속성만 바꾸어주면 마음대로 모양이 바뀌게
될수 있는 것이다
지우고 다시 만들 필요가 없이 그냥 있는 오브젝트의 속성만 바꿔준것이다
씨리즈 1에서 본 Range오브젝트와는 성질머리가 완존히 다르다
재미있지 않은가???
하나 더 해보자!!

Sub drawBoxToDuplicate()
Dim shtX As Worksheet
Dim shpX As Shape, shpXDupe As Shape
Set shtX = ActiveSheet
Set shpX = shtX.Shapes.AddShape(msoShapeRectangle, 50, 50, 100, 100)
DoEvents
MsgBox "도형이 그려졌다..속성아니...메소드를 적용하여 도형을 하나추가!!"
Set shpXDupe = shpX.Duplicate
With shpXDupe
    .AutoShapeType = msoShape8pointStar
    .Left = .Left + 100
    .Top = .Top + 100
    .Left = .Left + 100
    .Width = .Width * 2
    .Height = .Height * 2
    .Fill.ForeColor.SchemeColor = 3
End With
End Sub

새로운 도형을 추가하여 그린것이 아니고
Duplicate라는 메소드를 사용하여 새로운 도형을 복사하여 만들어 낸 것이다
새로 만들어 낸것과 마찬가지 효과를 준다

Duplicate는 속성(Property)가 아니고 메소드(Method)라고 부른다

무언가 재미있을 것 같지 않은가?
재미있다..
기본 원리만 알면 수없이 찍어내니까!!

이제 도형내에 문자를 넣어 볼까?
어떤 오브젝트에 무언가를 더 추가 시켜볼까???
라고 하는 것은 해당오브젝트가 갖고 있는 자원(속성이나 메소드)을 어떻게
활용할줄 아느냐??의 문제이다

Sub writeLetterInShape()
Dim shtX As Worksheet
Dim shpX As Shape
Set shtX = ActiveSheet
Set shpX = shtX.Shapes.AddShape(msoShapeRectangle, 50, 50, 100, 100)
DoEvents
MsgBox "도형속에 문자를 넣어보자"
With shpX
    With .TextFrame.Characters
        .Text = "A"
DoEvents
MsgBox "문자의 서식을 해보자"
        With .Font
                .ColorIndex = 3
                .Bold = True
                .Size = 54
            End With
        End With
DoEvents
MsgBox "문자의 위치를 제대로 잡아보자"
        .TextFrame.VerticalAlignment = xlVAlignCenter
        .TextFrame.HorizontalAlignment = xlHAlignCenter
End With
End Sub

씨리즈_1의 Range오브젝트를 차근 차근 보신분들은..
으흠..도형오브젝트들도 또 자식 오브젝트를 만들어주는 속성들이 있구나
라는 것을 느끼게 될것이다
아래의 화일에서 위의 내용을 좀더 구체적으로 살펴보고
그러면 위의 문제는 쥐뿔도 아닐것이다
순환문만 돌리면 되니까...
도형이라고 하는 것은 엑셀이 아닌 어느 프로그램에서나 마찬가지의
컨셉을 갖고 있는 것!!!
도형에는 도대체 뭔 오브젝트들을 하위오브젝트로 데리고 있을까??
궁금해 하면서 씨리즈를 계속해 나가자
여러분들이 능숙하게 잘 활용할수 있을때까지!!!


BrainTraining_066_1.