첨부해 주신 파일 다운로드해서 매크로 실행해보니 아주 눈 깜짝할 새에 처리가 되는데요. 속도가 느리다고 고민하시는 걸로 봐서 이 파일의 문제보다 다른 요인이 있는 것 같습니다.
정확한 원인이 맞을 지 모르겠지만 한 번 이렇게 확인해 보시기 바랍니다.
다른 엑셀 파일을 모두 종료하고 이 파일만 매크로 실행해 보세요. 처리 속도에 문제가 없다면 다른 열려있는 엑셀 파일이 원인일 가능성이 있습니다. 제 경우 수식(특히 vlookup이 많이 들어가 있는)과 필터링이 있는 다른 엑셀 파일이 열려 있는 경우, 원래 작업중인 파일에서 계산을 할 때 아까 열려있는 엑셀파일도 재계산을 하게 되어 속도가 매우 느려지게 됩니다.
위에 Call 처리속도복귀를 보면 .Calculation = xlCalculationAutomatic 이렇게 계산을 새로 하도록 하는데 이때 복잡한 수식이 포함된 다른 엑셀 파일이 열려있으면 그 영향을 받게 됩니다. 제가 생각하는 게 맞다면, 그 다른 파일을 잠시 닫아두고 이 파일만 매크로를 실행해 보세요. 그렇게 해서 속도가 향상된다면 그 파일이 꼭 열려있어야 하는지에 따라서 코드를 추가하거나 하는 방법을 찾으시면 될 것 같습니다.
2022.02.07
좋아요
007Lv.17작성자
@나는나 님
답변 주셔서 감사합니다.
1) 열려있는 다른 엑셀 파일을 모두 닫고
2) 코드에서 .Calculation = xlCalculationAutomatic 주석 처리하였으나
여전히 처리속도가 10초 정도입니다.
특히, 첫번째 A구청의 '현황작성'(2초 정도 소요)을 하고 두번째 B구청의 '현황작성' 을 하면
이 때부터 처리속도(10초 정도 소요)가 첫번째 실행때 보다 확연히 느려집니다.
처리속도 느림 현상은 두번째 '현황작성' 실행 이후(세 번째, 네번째...)부터 줄 곧 10초 정도 걸립니다.
VBA가 있는 다른 엑셀 파일은 느리지 않는데 유독 이 파일만 VBA를 실행하면 많이 느려집니다.
ㅠㅠ
답변 거듭 감사합니다.
2022.02.07
좋아요
채택된 답변
나는나Lv.24
@007 님
말씀하신 대로 여러 번 구청을 바꿔가면서 매크로 실행하니 속도가 좀 느려지긴 하네요. 제가 추측했던 부분의 문제라기 보다는 For...Next 반복문에서 셀을 순환하면서 하는 작업들이 좀 시간을 잡아먹는 것 같아서 약간 수정해봤습니다.
'조건에맞게 열숨기기
For Each xRg In Range("E6:R6")
If xRg.Value = 0 Then
ReDim Preserve temp(i)
temp(i) = xRg.Address
i = i + 1
End If
Next xRg
Range(Join(temp, ",")).Columns.Hidden = True
'줄간격 맞추기
Range("B6:B" & intR + 5).EntireRow.AutoFit
Range("B6:B" & intR - 2).EntireRow.RowHeight = 17.25 + rGap
'그림(결재란) 보이게하기
ActiveSheet.Shapes.Range(Array("Pic_결재")).Top = Range("U" & intR).Top
위 코드 내용으로 조금 손을 봤습니다. 열 숨기기는 숨길 열이 있는 셀을 찾아 하나씩 배열에 주소를 넣은 후 그 주소를 한 번에 숨기기하는 방식으로 바꿨습니다. 순환문에서 열 한 개씩 숨기는 것보다 시간이 단축됩니다.
마찬가지로 줄간격 맞추기에서도 AutoFit 이후에 선택된 셀마다 셀높이+rGap 이렇게 하신 걸, 원래 셀 높이가 모두 17.25인 점을 참고해 곧바로 17.25 + rGap 이렇게 한 번에 셀높이를 변경하도록 바꿨습니다.
그림(결재란)의 경우 굳이 숨겼다가 다시 보였다가 위치를 조정할 필요 없이 행의 위치만 찾아가도록 수정했습니다.
다른 부분은 원래 작성하셨던 대로 그대로 두었으니 첨부파일로 테스트 해보시기 바랍니다.
'프린트영역 설정
ActiveSheet.PageSetup.PrintArea = "B2:U" & intR + 5
첨부파일에는 그대로 남겨두었는데 이 프린트영역 설정을 주석처리하면 속도가 월등히 빨라집니다. 주석 처리 후 저장한 다음 반드시 파일을 닫았다가 다시 열어서 테스트 해보시기 바랍니다. 속도가 눈에 띄게 빨라집니다. 굳이 꼭 필요한 부분이 아니라면 프린트영역은 그냥 파일의 프린트영역 설정에서 행 방향만 적당히 여유있게 고정시켜 놓는 것을 고려해보시는 것도 좋을 것 같습니다. 열 방향은 어차피 열 숨기기로 자동으로 조절이 되니 행만 잘리지 않도록 여유있게 고정하시면 굳이 프린트영역 설정 명령은 사용하지 않아도 좋을 것 같습니다.
정확한 원인이 맞을 지 모르겠지만 한 번 이렇게 확인해 보시기 바랍니다.
다른 엑셀 파일을 모두 종료하고 이 파일만 매크로 실행해 보세요. 처리 속도에 문제가 없다면 다른 열려있는 엑셀 파일이 원인일 가능성이 있습니다. 제 경우 수식(특히 vlookup이 많이 들어가 있는)과 필터링이 있는 다른 엑셀 파일이 열려 있는 경우, 원래 작업중인 파일에서 계산을 할 때 아까 열려있는 엑셀파일도 재계산을 하게 되어 속도가 매우 느려지게 됩니다.
ActiveSheet.PageSetup.PrintArea = "B2:U" & intR + 5 Call 처리속도복귀 Range("E1").Select위에 Call 처리속도복귀를 보면 .Calculation = xlCalculationAutomatic 이렇게 계산을 새로 하도록 하는데 이때 복잡한 수식이 포함된 다른 엑셀 파일이 열려있으면 그 영향을 받게 됩니다. 제가 생각하는 게 맞다면, 그 다른 파일을 잠시 닫아두고 이 파일만 매크로를 실행해 보세요. 그렇게 해서 속도가 향상된다면 그 파일이 꼭 열려있어야 하는지에 따라서 코드를 추가하거나 하는 방법을 찾으시면 될 것 같습니다.
1) 열려있는 다른 엑셀 파일을 모두 닫고
2) 코드에서 .Calculation = xlCalculationAutomatic 주석 처리하였으나
여전히 처리속도가 10초 정도입니다.
특히, 첫번째 A구청의 '현황작성'(2초 정도 소요)을 하고 두번째 B구청의 '현황작성' 을 하면
이 때부터 처리속도(10초 정도 소요)가 첫번째 실행때 보다 확연히 느려집니다.
처리속도 느림 현상은 두번째 '현황작성' 실행 이후(세 번째, 네번째...)부터 줄 곧 10초 정도 걸립니다.
VBA가 있는 다른 엑셀 파일은 느리지 않는데 유독 이 파일만 VBA를 실행하면 많이 느려집니다.
ㅠㅠ
답변 거듭 감사합니다.
'조건에맞게 열숨기기 For Each xRg In Range("E6:R6") If xRg.Value = 0 Then ReDim Preserve temp(i) temp(i) = xRg.Address i = i + 1 End If Next xRg Range(Join(temp, ",")).Columns.Hidden = True '줄간격 맞추기 Range("B6:B" & intR + 5).EntireRow.AutoFit Range("B6:B" & intR - 2).EntireRow.RowHeight = 17.25 + rGap '그림(결재란) 보이게하기 ActiveSheet.Shapes.Range(Array("Pic_결재")).Top = Range("U" & intR).Top위 코드 내용으로 조금 손을 봤습니다. 열 숨기기는 숨길 열이 있는 셀을 찾아 하나씩 배열에 주소를 넣은 후 그 주소를 한 번에 숨기기하는 방식으로 바꿨습니다. 순환문에서 열 한 개씩 숨기는 것보다 시간이 단축됩니다.
마찬가지로 줄간격 맞추기에서도 AutoFit 이후에 선택된 셀마다 셀높이+rGap 이렇게 하신 걸, 원래 셀 높이가 모두 17.25인 점을 참고해 곧바로 17.25 + rGap 이렇게 한 번에 셀높이를 변경하도록 바꿨습니다.
그림(결재란)의 경우 굳이 숨겼다가 다시 보였다가 위치를 조정할 필요 없이 행의 위치만 찾아가도록 수정했습니다.
다른 부분은 원래 작성하셨던 대로 그대로 두었으니 첨부파일로 테스트 해보시기 바랍니다.
'프린트영역 설정
ActiveSheet.PageSetup.PrintArea = "B2:U" & intR + 5
첨부파일에는 그대로 남겨두었는데 이 프린트영역 설정을 주석처리하면 속도가 월등히 빨라집니다. 주석 처리 후 저장한 다음 반드시 파일을 닫았다가 다시 열어서 테스트 해보시기 바랍니다. 속도가 눈에 띄게 빨라집니다. 굳이 꼭 필요한 부분이 아니라면 프린트영역은 그냥 파일의 프린트영역 설정에서 행 방향만 적당히 여유있게 고정시켜 놓는 것을 고려해보시는 것도 좋을 것 같습니다. 열 방향은 어차피 열 숨기기로 자동으로 조절이 되니 행만 잘리지 않도록 여유있게 고정하시면 굳이 프린트영역 설정 명령은 사용하지 않아도 좋을 것 같습니다.
제안해 주신 대로 소스를 수정하니 속도가 많이 빨라졌습니다.
흔쾌히 지혜를 나누어 주셔서 이렇게 또 배웁니다.
늘 평안하세요.
거듭 감사합니다.