- 최초 작성일: 2001-07-14
- 최종 수정일: 2026-09-30
- 조회수: 11 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: 그림 확대하기
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
지난 시간에 넋두리 아닌 넋두리를 좀 했더니 몇 분이 위로의 글을 주셨군요. ^^ 격려의 글을 보내주신 세 분께 감사를 드립니다. 아무리 상대방이 눈에 보이지 않는다고 해도 지킬 것은 지키자는 의미에서 다함께 생각하는 시간을 갖기 위해서였지, 누구를 원망한다거나 비난하기 위해 그런 것은 아닙니다. 먼저 기본이 된 상태에서 기교를 갖추어야 하는 것이지요.
그건 그렇고...
...(중략)... 제가 추가로 질문했던 사항은 여러 개의 그림들이 배열되어
있을 때, 각각의 그림은 layer 별로 배열이 되어 있어서 아래쪽 layer의
그림을 확대하면 위쪽 layer의 그림 때문에 위쪽 layer의 그림만큼 가려지는
것을 어떻게 해결하면 좋을 지에 대해서 였습니다.
그러니까 제가 확대하고자 click한 그림이 맨 위쪽 layer로 올라가면서
확대되면 확대한 그림을 전부 볼 수 있을 것 같은데요...(하략)...
먼 소린지 이해가 되십니까? 일단 아래의 버튼을 눌러서 연습 시트로 이동하신 다음, 여러 개의 사진을 한번씩 눌러보세요.
그림 확대하기
핵심 요약: 클릭한 그림 맨 앞으로 가져와 확대
Application.Caller로 클릭한 그림을 찾고 ZOrder msoBringToFront로 맨 앞으로 가져오면 확대해도 다른 그림에 가려지지 않습니다.
- 1단계: OnAction으로 각 그림에 매크로를 연결합니다.
- 2단계: Application.Caller로 클릭한 그림을 참조하고 원래 크기를 저장합니다.
- 3단계: 순환문으로 확대하며 ZOrder로 맨 앞으로 가져오고, 끝나면 원래 크기로 되돌립니다.
Step 1: 그림 확대하기 (PictureModify)
눌러 보셨지요? 어떤 현상이 생깁니까? 사진을 클릭하면 해당 사진의 크기가 확대될 것입니다. 그런데 일부 사진, 예를 들면 김유신이나 강감찬의 경우, 아래에 있는 사진에 의해 일부가 가려져서 보이지 않지요? 이런 경우에 항상 클릭한 사진이 맨 위에 놓이도록 하고 싶다는 질문입니다. 일단 코드를 보도록 합니다.
Sub PictureModify()
AttachCode "PictureModify"
'''AttachCode라는 외부 프로시저를 먼저 호출합니다. 이 프로시저는 Stage 시트에
'''있는 그림들에 VBA코드를 연결하는 역할을 수행합니다.
Dim objPic As Object
Dim i As Integer, j As Integer, k As Integer
Dim lngHeight As Long, lngWidth As Long
Dim lngOldHeight As Long, lngOldWidth As Long
Set objPic = ActiveSheet.DrawingObjects(Application.Caller)
lngWidth = objPic.Width
lngHeight = objPic.Height
lngOldWidth = objPic.Width
lngOldHeight = objPic.Height
'''필요한 변수들을 선언해 줍니다. 나중에 그림의 크기를 원래 크기로 만들기 위해
'''현재의 크기를 변수에 담아 둡니다.
For i = 1 To 75
objPic.Width = lngWidth + objPic.Width * i / 100
objPic.Height = lngHeight + objPic.Height * i / 100
For k = 1 To 30000: Next k
'''순환문을 돌면서 그림의 크기를 확대합니다. For k=1 ~ Next k 이 부분은
'''속도 조절을 위한 것일 뿐, 다른 의미는 없습니다.
Next i
MsgBox "그림이 확대되었습니다. 이제 다시 원래 크기로 되돌립니다"
objPic.Width = lngOldWidth
objPic.Height = lngOldHeight
Set objPic = Nothing
'''그림을 원래 크기로 되돌리고 오브젝트 변수를 초기화 시킵니다.
End Sub
Step 2: 클릭한 그림을 맨 앞으로 (PictureModify2)
이제 아래의 버튼을 다시 눌러서 좀전에 가려졌던 그림들이 제대로 나타나는지 확인해 보세요.
Sub PictureModify2()
AttachCode "PictureModify2"
Dim objPic As Object
Dim i As Integer, j As Integer, k As Integer
Dim lngHeight As Long, lngWidth As Long
Dim lngOldHeight As Long, lngOldWidth As Long
Set objPic = ActiveSheet.DrawingObjects(Application.Caller)
lngWidth = objPic.Width
lngHeight = objPic.Height
lngOldWidth = objPic.Width
lngOldHeight = objPic.Height
For i = 1 To 75
objPic.Width = lngWidth + objPic.Width * i / 100
objPic.Height = lngHeight + objPic.Height * i / 100
For k = 1 To 30000: Next k
objPic.ShapeRange.ZOrder msoBringToFront
'''다른 부분은 똑같고 이 한 줄이 추가되었습니다. 말 그대로 현재 선택된 그림을
'''Bring To Front, 즉 맨 앞으로 가져오는 것입니다.
Next i
MsgBox "그림이 확대되었습니다. 이제 다시 원래 크기로 되돌립니다"
objPic.Width = lngOldWidth
objPic.Height = lngOldHeight
Set objPic = Nothing
End Sub
Step 3: 그림에 코드 연결하기 (AttachCode)
두 프로시저가 호출하는 AttachCode는 Stage 시트에 있는 그림들에 매크로를 연결해 주는 프로시저입니다.
Sub AttachCode(strMacro As String)
Dim objPic As Object
For Each objPic In Sheets("Stage").Pictures
objPic.OnAction = strMacro
Next objPic
End Sub
마무리
많이 응용해 보시기 바랍니다. 다음 주에는 Exceller가 머얼~리 출장을 갑니다. 가깝고도 먼 나라로... 해서 강좌를 진행할 수 없을 것 같습니다.
다음 시간에 또...
정리 — 그림 확대 핵심
| 구분 | 사용한 코드 | 역할 |
|---|---|---|
| 그림 참조 | ActiveSheet.DrawingObjects(Application.Caller) | 클릭한 그림 지정 |
| 크기 저장 | lngOldWidth = objPic.Width | 원래 크기 보관 |
| 확대 | objPic.Width = lngWidth + objPic.Width * i / 100 | 순환문으로 점진적 확대 |
| 맨 앞으로 | objPic.ShapeRange.ZOrder msoBringToFront | 가려짐 방지 |
| 매크로 연결 | objPic.OnAction = strMacro | 그림 클릭 시 실행 |
자주 묻는 질문 (FAQ)
Q1. 클릭한 그림이 다른 그림에 가려지지 않게 하려면?
ShapeRange.ZOrder msoBringToFront로 해당 그림을 맨 앞으로 가져옵니다.
Q2. 매크로를 실행한 그림은 어떻게 알아내나요?
Application.Caller가 프로시저를 호출한 개체의 이름을 돌려주므로 DrawingObjects(Application.Caller)로 참조합니다.
Q3. 확대 후 원래 크기로 되돌리려면?
확대하기 전에 Width와 Height를 변수에 저장해 두었다가 다시 대입합니다.
마치며
ZOrder와 Application.Caller를 활용하면 클릭한 그림을 맨 앞으로 가져와 자연스럽게 확대하는 효과를 낼 수 있습니다.