Computer

LibreOffice Calc에서 VBA를 쓰는 방법

steloflute 2017. 3. 30. 23:30

http://snowxtal.egloos.com/m/3177506



최근 리눅스를 써야 할 일이 생겨서 낡은 PC에 루분투를 깔아서 이것저것 해보고 있는데 예전과 달리 설치가 엄청 간단해진 것에 놀라고(윈도우즈 설치하는 것보다 더 편리해 진것 같습니다), 이제 은행(궁민으냉)에서도 리눅스를 지원해서 공인인증서를 이용해 홈뱅킹이 가능해 졌다는 것에 또 놀라고, MS오피스만큼 강력한 오피스 프로그램을 무료로 사용할 수 있다는 점에 정말 놀랐습니다. 바로 LibreOffice입니다. 리눅스뿐만 아니라 윈도우즈, 맥 OS 등 다른 운영체제에서도 사용할 수 있습니다. Calc는 LibreOffice에 포함된 스프레드시트 프로그램인데 화면디자인이 마치 엑셀97을 보는 것 같습니다.


엑셀의 강력한 기능을 사랑하는 한 사람이지만 개인적으로 사서 쓰기엔 부담스런 가격 때문에 사실 집에서는 어둠의 경로를 이용해 온 지 이미 오래되었습니다. 이젠 그럴 필요가 없어졌습니다. 제가 엑셀로 하는 작업의 거의 대부분을 Calc로 대체할 수 있습니다. 근데 제게 단 하나 걸림돌이 매크로였습니다. Calc도 BASIC 스크립트를 지원하지만 그 문법과 지원하는 오브젝트들이 엑셀 VBA와는 확연히 다릅니다. A1:C2 범위의 셀을 A4로 복사하는 루틴을 예로 들어 보겠습니다.

Excel:
Range("A1:C2").Copy Range("A4")

Calc:
sht = ThisComponent.CurrentController.ActiveSheet
src = sht.getCellRangeByName("A1:C2")
dest = sht.getCellByPosition(0, 3) 'A4: column = 0, row = 3
sht.copyRange(dest.getCellAddress, src.getRangeAddress)

엑셀의 코드가 간결하고 이해하기 쉬운데 반해 LibreOffice BASIC은 상당히 여러 단계의 오브젝트 조작이 필요합니다. 게다가 IDE에서 코드 자동완성도 동작하지 않기 때문에 작성하는데 시간도 많이 걸리고, 버그 잡는데도 시간이 많이 걸립니다. 인터넷 뒤져가면서 매크로 짜는 게 쉽지 않습니다.

그런데 사실 Calc는 완벽하지는 않지만 엑셀 VBA를 지원합니다. 대단히 복잡한 과정까지는 안 해 봤지만 아래 예제 정도의 VBA는 아무 수정 안 해도 그대로 동작합니다. 작업내용이 중요한 건 아니고 단지 어떤 함수와 오브젝트가 지원되는 지만 보시면 됩니다.


Sub CopyToTable
 Dim src As Range, dest As Range, r As Range
    
    Set src = Range("A2")
    Set dest = Range("A10000").End(xlUp).Offset(1)
    Do While src <> ""
        src.Resize(1, 7).Copy
        dest.PasteSpecial xlPasteValues
        dest.Offset(-1).Resize(1, 7).Copy
        dest.PasteSpecial xlPasteFormats
        
        Set r = src.Offset(, 7)
        If r <> "" Then r = r + 1
        
        Set src = src.Offset(1)
        Set dest = dest.Offset(1)
    Loop
    
    Application.CutCopyMode = False
    
End Sub

보시다시피 상당한 수준의 VBA문법을 지원합니다. 그런데 이걸 그대로 쓰면 에러납니다. 사실 마법의 키워드가 하나 있습니다. 매크로를 담고 있는 모듈의 맨 첫 줄에 이렇게 써 줘야 합니다.

Option VBASupport 1

저는 이걸 모르고 인터넷 뒤져가며 LibreOffice BASIC 문법에 맞게 매크로를 새로 짜느라 며칠을 보냈습니다. 그리고 다 완성한 후에 뒤늦게 메뉴얼 보다가 알게 되어 허탈했죠. LibreOffice 사용자가 별로 없다데다 매크로까지 작성하는 사람은 더더욱 없으니 이런 팁을 아는 사람도 드물겁니다. 혹시나 LibreOffice에서 기존에 작성해 놓은 매크로를 쓸 수 있는지 검색하시는 분이 있을까 해서 오랫만에 글을 남겨 봅니다. 아무쪼록 도움이 되셨길 바랍니다.