엑셀 작업 중 워크시트마다 복사된 버튼, 도형, 차트, OLE 개체들이 누적되면서 작업 속도가 느려지거나 컴퓨터가 다운된 경험 있으신가요?
오늘은 **"모든 시트의 개체를 한 번에 삭제하는 VBA 자동화 코드"**를 소개합니다.
단순한 도형 삭제 수준이 아니라, 사진을 제외한 도형 / ActiveX / 차트 / 주석 등 실무에서 문제되는 개체들을 전부 정리합니다.
✅ 어떤 상황에서 유용할까요?
- 여러 시트를 복사하다가 정체불명의 개체가 생겼을 때
- 템플릿 문서를 자동화할 때 초기화용으로 사용
- 배포 전, 보고서 파일을 가볍게 만들고 싶을 때
💡 핵심 기능 요약
✔ 모든 시트를 순회하며
✔ 도형(사진 제외), OLE 개체, 차트, 주석 등을
✔ 단 1번 실행으로 전부 삭제
📌 VBA 코드 전체
| Sub AllShapeDelete() '모든 워크시트의 개체를 삭제하는 메인 프로시저 Dim ws As Worksheet Dim result As String Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Application.EnableEvents = False result = "개체 삭제 결과:" & vbCrLf & vbCrLf For Each ws In ActiveWorkbook.Worksheets result = result & "워크시트: " & ws.Name & vbCrLf result = result & 워크시트개체삭제(ws) & vbCrLf & vbCrLf Next ws Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic Application.EnableEvents = True MsgBox result, vbInformation, "개체 삭제 완료" End Sub Function 워크시트개체삭제(ws As Worksheet) As String '특정 워크시트의 모든 개체를 삭제하는 함수 Dim deleteCount As Long Dim totalCount As Long Dim result As String deleteCount = 0 '1. Shapes 컬렉션을 통한 일반 도형 삭제 deleteCount = deleteCount + Shapes컬렉션삭제(ws) '2. DrawingObjects를 통한 삭제 (Shapes로 접근 불가능한 개체 포함) deleteCount = deleteCount + DrawingObjects삭제(ws) '3. OLEObjects 삭제 (ActiveX 컨트롤, 삽입된 개체 등) deleteCount = deleteCount + OLEObjects삭제(ws) '4. ChartObjects 삭제 (차트) deleteCount = deleteCount + ChartObjects삭제(ws) '5. Comments 삭제 (주석) deleteCount = deleteCount + Comments삭제(ws) result = " 삭제된 개체 수: " & deleteCount & "개" 워크시트개체삭제 = result End Function Function Shapes컬렉션삭제(ws As Worksheet) As Long 'Shapes 컬렉션을 통한 도형 삭제 (사진 제외) Dim shp As Shape Dim deleteCount As Long On Error Resume Next '역순으로 삭제 (컬렉션 인덱스 변화 방지) For i = ws.Shapes.Count To 1 Step -1 Set shp = ws.Shapes(i) If Not shp Is Nothing Then '사진 타입은 제외하고 삭제 If shp.Type <> msoPicture Then shp.Delete deleteCount = deleteCount + 1 End If End If Next i On Error GoTo 0 Shapes컬렉션삭제 = deleteCount End Function Function DrawingObjects삭제(ws As Worksheet) As Long 'DrawingObjects를 통한 삭제 (구버전 호환성, 사진 제외) Dim deleteCount As Long Dim obj As Object On Error Resume Next '개별 개체를 확인하여 사진이 아닌 경우만 삭제 For i = ws.DrawingObjects.Count To 1 Step -1 Set obj = ws.DrawingObjects(i) If Not obj Is Nothing Then '사진이 아닌 경우만 삭제 (TypeName으로 구분) If TypeName(obj) <> "Picture" Then obj.Delete deleteCount = deleteCount + 1 End If End If Next i On Error GoTo 0 DrawingObjects삭제 = deleteCount End Function Function OLEObjects삭제(ws As Worksheet) As Long 'OLE 개체 삭제 (ActiveX 컨트롤, 삽입된 파일 등) Dim oleObj As OLEObject Dim deleteCount As Long On Error Resume Next For i = ws.OLEObjects.Count To 1 Step -1 Set oleObj = ws.OLEObjects(i) If Not oleObj Is Nothing Then oleObj.Delete deleteCount = deleteCount + 1 End If Next i On Error GoTo 0 OLEObjects삭제 = deleteCount End Function Function ChartObjects삭제(ws As Worksheet) As Long '차트 개체 삭제 Dim chartObj As ChartObject Dim deleteCount As Long On Error Resume Next For i = ws.ChartObjects.Count To 1 Step -1 Set chartObj = ws.ChartObjects(i) If Not chartObj Is Nothing Then chartObj.Delete deleteCount = deleteCount + 1 End If Next i On Error GoTo 0 ChartObjects삭제 = deleteCount End Function Function Comments삭제(ws As Worksheet) As Long '주석 삭제 Dim deleteCount As Long Dim rng As Range On Error Resume Next For Each rng In ws.UsedRange If Not rng.Comment Is Nothing Then rng.Comment.Delete deleteCount = deleteCount + 1 End If Next rng On Error GoTo 0 Comments삭제 = deleteCount End Function |
📣 실전 팁
- 사진은 보존됩니다: 보고서용 이미지, 스크린샷은 유지됨
- 주석도 삭제됩니다: 수기로 남긴 메모가 있다면 주의
- 코드 실행 전, 파일 백업 권장