Excel - VBA

Selenium TakeScreenshot.Copy와 TakeScreenshot.SaveAs

EGTools 2023. 9. 11. 23:00

Selenium을 이용해서 지적도와 항공사진을 다운로드 하는 작업을 했는데, 

지적도나 항공사진 서비스가 하나의 그림파일로 제공되는 게 아니라 일정크기 구역의 지도를 모자이크로 만드는 것이 대부분이므로 이걸 다운로드 하기 어려워 결국 ScreenShot으로 해결을 합니다.

 

먼저 사용한 방법이 아래와 같이 스크린 샷을 복사하고 바로 붙여 넣기 하는 방식이었는데,

다운로드 한 지도가  수백장이 되니,,,  Excel의 메모리 사용량이 1GB를 넘기게 되었습니다.

WD.TakeScreenshot.Copy
ActiveSheet.Paste    
With ActiveSheet.Shapes(ActiveSheet.Shapes.Count)
  '// 화면캐처라 불필요한 부분 잘라내기
  .PictureFormat.CropLeft = CInt(.Width * 0.35)
  .PictureFormat.CropRight = CInt(.Width * 0.1)
  .PictureFormat.CropTop = CInt(.Height * 0.2)
  .PictureFormat.CropBottom = CInt(.Height * 0.2)
  '// 제위치로 이동
  .Top = sh.Cells(R, C).Top + 1
  .Left = sh.Cells(R, C).Left + 1
  .Width = sh.Cells(R, C).Width - 2
  .Height = sh.Cells(R, C).Height - 2
  .Placement = xlMoveAndSize
End With

당연히 파일 핸들링이 문제가 되고, 스크랩 중에 ChromeDriver와 Excel 자체에서도 오류가 발생합니다. 

  • Run-time Error '-2146233078 (801315a)
  • 1004 Run-Time Error : Worksheet 클래스 중 Paste 메서드에 오류가 있습니다.

마치 복사하고 붙여 넣은 캡처 그림이 계속 메모리에 누적되는 듯한 느낌...

 

발생하는 오류를 해결하기 위해 여기저기 찾아봐도 마땅한 해결책이 없어서

복사하고 붙여넣기 하여 Excel 자원을 쓰는 것보다 파일로 저장하고 그림을 불러오는 것이 어떤가 싶었습니다.

EGTools에서 폴더 삽입 기능을 개발 할 때 수백장의 그림이 아무 에러 없이 잘 삽입이 되었기 때문이죠...

WD.TakeScreenshot.SaveAs sPath 
Set oPic = ActiveSheet.Shapes.AddPicture(Filename:=sPath, linktofile:=msoFalse, _
           savewithdocument:=msoCTrue, Left:=100, Top:=100, Width:=-1, Height:=-1)
          
With oPic
  '// 화면캐처라 불필요한 부분 잘라내기
  .PictureFormat.CropLeft = CInt(.Width * 0.35)
  .PictureFormat.CropRight = CInt(.Width * 0.1)
  .PictureFormat.CropTop = CInt(.Height * 0.2)
  .PictureFormat.CropBottom = CInt(.Height * 0.2)
  '// 제위치로 이동
  .Top = sh.Cells(R, C).Top + 1
  .Left = sh.Cells(R, C).Left + 1
  .Width = sh.Cells(R, C).Width - 2
  .Height = sh.Cells(R, C).Height - 2
  .Placement = xlMoveAndSize
End With

메모리 사용량도 일반 매크로 사용시와 크게 다르지 않습니다.

 

어제부터 골치가 아팠는데, 싸악 가시네요...