none
엑셀 VBA 매크로가 스냅샷(카메라에 의한 그림삽입) 만 하면 엄청나게 느려지는 문제

    질문

  • 안녕하세요. 이 글을 보시는 모든 분들을 축복합니다.

    사용중인 엑셀버전은 2013 입니다.

    range 가 많이 사용된 매크로의 실행시간이 3초 가량 걸렸는데, 카메라에 의해 그림 하나만 삽입하면 느려집니다.

    그림을 몇개 더 삽입하면 밤새도록 실행됩니다.

    그런데 더 문제는 매크로가 실행되고 있는 xlsm 파일에 카메라 그림이 없더라도,

    열려있는 일반문서에라도 카메라 그림이 있으면 같은 현상이 일어난다는 것입니다.

    이에대한 해결방법으로, 어느 개발자는 그림객체를 다 찾아서 수식을 없애버리는 소스를 올려놓았는데, 

    이런 방법은 대안이 아닌 것 같습니다.

    일반적으로, 매크로 실행중에는 보통 아래와 같이 하여 속도저하를 막는 방법을 쓰죠.

     

        Application.EnableEvents = False
        Application.ScreenUpdating = False

    카메라 그림에도 수식(equal 에 의한 주소지정)이 있어서 느린 것이니, 카메라 그림의 수식의 작동을 막는 소스같은 것은 없나요?

    정말 답답합니다.

    아무리 훌륭한 매크로로 짠 프로그램도, ctrl+N 눌러 새문서 만들고, 카메라로 이미지 두세개 넣고, 다시 실행하면 형편없이 느려질 것입니다. 

    혹시 2017 버전에서는 해결된 사항인가요?

    2013 버전에서는 어떤 대안이 있나요?

    예제는 간단합니다.

                    

    '------ 시트소스에서 아래와 같이 간단한 출력로직을 구성하고 엑셀에서 셀을 선택하면 빠르게 숫자가 출력됩니다.

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
        
        If Range("A1") = "" Then
        
        For ii = 1 To 20
            For jj = 1 To 20
                Cells(ii, jj) = ii * jj + jj
            Next
        Next
        
        Else
            Range("A1").Resize(20, 20) = ""
        End If
        
    End Sub

    '----- 이번에는 해당시트에 카메라 기능을 이용하여 간단한 그림을 삽입한 후 위의 기능을 실행해보세요.
    '------느려질 것입니다. 그림을 몇개 더 삽입하면 엄청나게 느려집니다.
    '------ 더더욱 문제는 여러개의 열린문서가 있을 경우, 그중에 하나의 문서의 하나의 시트에라도 카메라 그림이 있으면 느려진다는 것입니다.
    '------ 수년전 중요 프로젝트때 이 문제 때문에 고생한 적이 있습니다 T.T 당시에는 원인파악조차 못했죠.


    2017년 7월 27일 목요일 오전 7:10

답변

  • 답변이 없네요. 고육지책으로 생각해낸 방법은

    매크로 프로그램만 안전모드를 열어서 사용하는 방법입니다. 이럴 경우, 이미 열려있는 엑셀과는 자원공유를 하지 않기 때문에 느려지지 않더군요.

    • 답변으로 표시됨 SpeedMIS 2017년 9월 6일 수요일 오전 1:00
    2017년 9월 6일 수요일 오전 12:59
  • Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim vData()
    ReDim vData(1 To 20, 1 To 20)

        If Range("A1") = "" Then
            For ii = 1 To 20
                For jj = 1 To 20
                    'Cells(ii, jj) = ii * jj + jj
    vData(ii, jj) = ii * jj + jj
                Next
            Next
    Range("A1").Resize(UBound(vData), UBound(vData, 2)) = vData
        Else
            Range("A1").Resize(20, 20) = ""
        End If
    End Sub

    데이터를 쓸때 셀에 하나 하나 쓰지말고 메모리 배열에 데이터를 저장한 후에

    시트에 한 번에 쓰면 느려지지 않습니다. 

    p.s 카메라 기능으로 만들어진 Shape가 셀에 쓸때마다 데이터를 갱신 해서 느려지는가 봅니다.

                                    

    • 답변으로 표시됨 SpeedMIS 2018년 2월 13일 화요일 오전 4:01
    2018년 2월 6일 화요일 오후 2:49

모든 응답

  • 일주일이 지나도록 답변이 없네요. 결국 답이 없다는 얘기인 거네요.
    2017년 8월 4일 금요일 오전 1:03
  • 답변이 없네요. 고육지책으로 생각해낸 방법은

    매크로 프로그램만 안전모드를 열어서 사용하는 방법입니다. 이럴 경우, 이미 열려있는 엑셀과는 자원공유를 하지 않기 때문에 느려지지 않더군요.

    • 답변으로 표시됨 SpeedMIS 2017년 9월 6일 수요일 오전 1:00
    2017년 9월 6일 수요일 오전 12:59
  • Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim vData()
    ReDim vData(1 To 20, 1 To 20)

        If Range("A1") = "" Then
            For ii = 1 To 20
                For jj = 1 To 20
                    'Cells(ii, jj) = ii * jj + jj
    vData(ii, jj) = ii * jj + jj
                Next
            Next
    Range("A1").Resize(UBound(vData), UBound(vData, 2)) = vData
        Else
            Range("A1").Resize(20, 20) = ""
        End If
    End Sub

    데이터를 쓸때 셀에 하나 하나 쓰지말고 메모리 배열에 데이터를 저장한 후에

    시트에 한 번에 쓰면 느려지지 않습니다. 

    p.s 카메라 기능으로 만들어진 Shape가 셀에 쓸때마다 데이터를 갱신 해서 느려지는가 봅니다.

                                    

    • 답변으로 표시됨 SpeedMIS 2018년 2월 13일 화요일 오전 4:01
    2018년 2월 6일 화요일 오후 2:49
  • 감사합니다. 이것도 하나의 대안으로 될 수 있겠네요.

    물론 시원스러운 답변은 MS 사에서 해줘야 할 것 같아요.

    2018년 2월 13일 화요일 오전 4:02