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

Shape|Type|AutoShapeType|TypeName|Type|AutoShapeType|
|TypeName()|Application.Wait|SelectAll|TimeValue|

Type속성과 AutoShapeType속성

앞에서 도형을 그려보면서 상수값이 -2였던것을 발견하고 의문을 품으셨다면
관찰력,분석력,열공력이 최상급이시다
상수명으로는 msoShapeMixed이고 상수값은 -2였다

ActiveSheet.Shapes.AddShape msoShapeMixed,10,10,100,100
ActiveSheet.Shapes.AddShape msoShapeMoon,10,10,100,100

라고 하면 첫번째것은 아무것도 그려지지도 않고 에러만 난다
두번째줄은 초생달이 달랑 그려지는 것을 볼수 있다
직접실행창에서 실행해보시기 바란다
다음에는 챠트를 하나 그리시고(챠트 못그리시는 분은 없겠지)
물론 앞으로 자동화로 그려대겠지만..여기에서는 손으로 그려 넣으시고



해당시트에 다른 도형은 아무것도 없는 상태에서 직접실행창에서

?ActiveSheet.Shapes(1).Name
혹은
?ActiveSheet.ChartObjects(1).Name

라는 명령을 실행하면 챠트이름을 알수 있을것이다
워크시트상에 그려지는 모든것들은 Shapes집합체오브젝트가
관리함을 알수 있는것이다
다시 아래의 명령을 실행해보시면

?ActiveSheet.Shapes(1).AutoShapeType

-2라는 값을 얻는다
바로 이것이 위에서 에러가 났던..msoShapeMixed상수값인것이다
그럼 이번에는 아래의 명령을 실행해보시기 바란다

?ActiveSheet.Shapes(1).Type

3이라는 숫자를 얻었다
Type과 AutoShapeType값이 틀린다
Type속성으로 얻어지는 상수값은 아래 그림의 왼쪽상수들이고
AutoShapeType속성으로 얻어지는 상수값은 그림의 오른쪽 상수들이다
ActiveSheet.Shapes(1).Type값은 3이고
이것은 그림 왼쪽에서 볼수 있는 msoChart라는 상수 즉 값은 3인것이다



참으로 헷갈린다..
이 이름이 이것같고..저 이름이 이것 같고
프로그래밍에서는 이름 짓는 일이 중요한 일인것이다
엑셀을 만든 사람들도 상수명을 짓던..속성명을 짓던..메소드명을 짓던
최대한 알아보기 쉽게 짧게 지으려고 하지만
너무 많은 오브젝트에 속성에..상수에..메소드에 어지러워진다
그래서 엑셀프로그래밍을 하시는 분들은 VB편집기내에서 F2키를
종종 눌러서 개체찾아보기 창을 수시로 보시는 습관도 좋은 습관이다
이런 것을 외울려고 하시는 분들은 없으시겠지
이런것을 외우고 싶다면 소설책이나 영화를 한편 더 보는것이 좋다
프로그래밍은 원리와 컨셉을 아는것이 중요하다
물론 원리와 컨셉을 제대로 잘 이해하기 위하여서는 위와 같은
쓸데없는것을 외우는 일(?)도 거쳐야 한다
도대체 어떻게 하라는 소리인지 헷갈릴것이다
고수가 되려면 바닥부터 빡빡 기어야 한다는 이야기다

워크시트상의 개체를 모두 삭제하고 싶다

워크시트에 이것저것 도형을 그려 넣고 범위를 삭제하고
이런 작업 저런 작업을 하다 보면..
도형이 깜쪽같이 숨어있는 경우도 있고
화면이 지저분해진다
이때 수동으로 도형을 모두 선택하고 싶다면 어떻게 할까??
Shift키를 누른 상태에서 도형 하나,하나를 선택할까??
그런데 도형이 있는 상태에서 범위를 삭제하는 등의 작업을
하다 보면 숨어있는 도형을 육안으로 식별하기가 힘들고
넓고 넓은 시트의 어느쪽에 숨어있는지 찾기가 힘들다
이때는
편집/이동/옵션/그리고 개체선택옵션을 선택하고 확인하면
모든 도형이 선택된다
그리고 삭제를 하면 깨끗히 삭제된다



위와 같이 손으로 한 작업을 VB로 처리한다면 아래와 같이 한줄이면 된다

ActiveSheet.Shapes.SelectAll

챠트이던 양식의 콘트롤이던 모두 선택된다
만약 몽땅 지우고 싶다면

ActiveSheet.Shapes.SelectAll
Selection.Delete

로 한줄 더 추가한다
참고로 아래와 같이 하면 결과가 어떤 값이 나올까?

ActiveSheet.Shapes.SelectAll
?TypeName(Selection)

결과값은 쌩뚱맞게도 "DrawingObjects"라고 나온다
앞에서도 이야기 했듯이 Shapes집합체의 옛날 버전이 DrawingObjects였다
그래서 아래와 같이 하면 에러가 날것이다

If TypeName(Selection)="Shapes" Then
Selection.Delete
End If

Type속성이던 AutoShapeType속성을 도대체 뭣에 써먹나??


-2라는 숫자가 나오던 3이라는 숫자가 나오던
이런것이 도대체 뭣에 써먹겠다는 거냐??
위에서 손으로 구차하게 메뉴찾아다니면서 지웠다
자동으로 지우는대 무차별하게 몽땅 지우지 말고
챠트와 버튼만 남겨두고 나머지는 모두 지우고 싶다면
어찌 할것인가??

만약 어떤 시트에 명령버튼도 있고 콘트롤도 있고
그리고 도형도 그려 있다
어떤 명령버튼을 크릭할때 마다 도형만 지워지고 나머지는 그대로
유지 시키고 싶을때가 있을것이다

Dim shpX As Variant
For Each shpX in ActiveSheet.Shapes
shpX.Delete
Next

라고 하면 명령버튼이고 콘트롤이고 몽땅 날아갈것이다

Dim shpX As Variant
For Each shpX In ActiveSheet.Shapes
If shpX.AutoShapeType>-2 Then
shpX.Delete
End If
Next

와 같이 삭제하기 전에 타입을 알아보고 처리하면 되는것이다
그러니 좋은 속성들 아니겠는가??



아래의 화일에서는

  • 위의 그림과 같이 몇개의 개체를 순환하면서 그려나가고
  • ActiveSheet.DropDowns.Add()와 ActiveSheet.AddFormControl()과의 차이
  • 개체를 받아줄 변수의 타입을 Variant로 하는 경우와 Shape로 하는 경우
  • 매번 순환할때마다 잠시 정해진 시간만큼 중단을 하고 싶다(Wait메소드)
  • AutoShapeType,Type,TypeName()의 역활


Type AutoShapeType TypeName