Shape 개체

🔧 모든 워크시트의 개체 한 번에 삭제하는 VBA 코드 공개합니다

노만e 2025. 8. 6. 23:15

엑셀 작업 중 워크시트마다 복사된 버튼, 도형, 차트, 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

 

📣 실전 팁

 
  • 사진은 보존됩니다: 보고서용 이미지, 스크린샷은 유지됨
  • 주석도 삭제됩니다: 수기로 남긴 메모가 있다면 주의
  • 코드 실행 전, 파일 백업 권장

현재 파일의 모든 개체 삭제.xlsm
0.02MB