본문 바로가기

진리는어디에/VBA

[VBA] CSV 저장(export)

서문

제가 개발하고 있는 게임에서는 게임 내 메타 데이터(아이템, 퀘스트, 이벤트 관련 데이터 등등)를 csv를 이용하고 있습니다. 엑셀에서 강력한 함수들을 이용해 아이템의 레벨이라던지 경험치 배분을 관리하고 완료 되면 최종 단계에서 csv로 export하여 인게임에서 가져다 씁니다.

그런데 매번 데이터 변경이 있을 때 마다 각 시트를 export하기 너무 귀찮습니다. 관리하는 시트가 한 두개였을 때는 문제가 없었지만 많아지니 답도 없습니다. 그리고 시트가 많아지니 내가 무슨 시트를 수정했는지 기억도 안납니다. 그래서 생각한 것이

단축키 한번에 모든 시트들을 'csv'로 export 해줄수 있으면 좋겠다.

인터넷에서 csv로 export 해준다는 vba 소스를 찾아 복붙한 후 실행 시켰습니다. 그런데 이번엔 다른 문제가 생깁니다. 한글이 깨집니다. 위대한 세종대왕님께는 죄송하지만 어딜가나 이 한글이 문제입니다. utf8 포멧으로 저장이 되어야 하는데 Excel에서 기본적인 저장 인코딩은 ASCII입니다.

단축키 한번에 모든 시트들을 'utf8 인코딩 된 csv'로 export 해줄수 있으면 좋겠다.

그래서 스택 오버플로우와 MSDN을 뒤져 다시 utf8로 저장 할 수 있도록 만들었습니다. 하지만 스택오버플로우에서는 분명히 이렇게 하면 된다는데, 저는 안됩니다. 컴파일 에러가 납니다. Excel의 버전이 문제였습니다. 제가 사용하던 버전은 Excel 2016, 요즘 가이드 되고 있는 것은 Excel 2019 또는 365. 세상이 그동안 많이 바뀌었습니다. 그래서 이번기회에 오피스 2019 홈에디션을 구매했습니다(집에서 사용하려고 구매 했습니다. 회사는 365라이센스가 있습니다).

이제 utf8 포멧으로 제대로 export 했습니다. 그런데 그래도 안됩니다. 말이 이상하지만 어쨋든 안됩니다. 이번에는 export는 제대로 된것 같은데 프로그램에서 읽어 들이면 csv 파일 앞부분의 텍스트가 깨집니다. 원인은 Excel이었습니다. Excel은 utf8 BOM이라는 포멧을 사용합니다. 이것은 어떻게 할 수 없습니다. 읽을 때 utf8 BOM을 대응해야 합니다. 자세한 원인과 대응 방법에 대한 내용은 [여기]를 참고 하시면 됩니다.

아무튼 그래도 어찌어찌 완료를 했고 제가 했던 삽질들을 여러분들은 피해가길 바라며 이렇게 글을 씁니다.

VBA 스크립트 - exporting utf8 encoded csv

  • Alt + F11로 VBAProject 창을 띄웁니다.
  • '모듈 > 삽입 > 모듈' 을 선택해 프로젝트에 모듈을 추가 합니다

  • 모듈의 이름을 'Export'로 변경합니다. 원하신다면 다른 이름으로 해도 상관 없습니다.
    ※ 이름을 변경하기 위해 F2를 눌러도 아무런 소용이 없습니다. 추가 하신 모듈을 선택 하고 속성창에서 직접 변경 해줘야 합니다.

  • 아래 코드를 복사해서 붙여 넣습니다.
Sub ExportAllSheetsToCSV()
    Dim sheet As Worksheet
            
    For Each sheet In Application.ActiveWorkbook.Worksheets
        Call SaveAsCsv(sheet)
    Next
End Sub

Sub ExportSheetsToCSV()
    Dim sheet As Worksheet
    Set sheet = Application.ActiveSheet
    Call SaveAsCsv(sheet)
End Sub

Sub SaveAsCsv(sheet As Worksheet)
    Dim fileName As String
    Dim i As Integer
    
    sheet.Copy
    Application.CutCopyMode = False
    Application.DisplayAlerts = False
    ActiveWorkbook.WebOptions.Encoding = msoEncodingUTF8
    fileName = ThisWorkbook.Path & "\" & Application.ActiveSheet.Name & ".csv"
    ActiveWorkbook.SaveAs fileName:=fileName, FileFormat:=xlCSVUTF8
    'ActiveWorkbook.SaveAs fileName:=fileName, FileFormat:=xlCSV 'Excel 2016 버전에서..
    Application.DisplayAlerts = True
    ActiveWindow.Close
End Sub
  • 저장 후 엑셀로 돌아가 Alt + F8 또는 '보기 > 매크로 > 매크로 보기'를 선택하여 현재 실행 가능한 매크로 목록을 확인합니다.
    • ExportAllSheetsToCSV는 엑셀 문서 내의 모든 시트들을 엑셀 파일이 있는 위치에 '시트이름.csv' 로 저장합니다.
    • ExportSheetToCSV는 현재 활성화 되어 있는(보고 있는) 시트 하나를 엑셀 파일이 있는 위치에 '시트이름.csv'로 저장합니다.

NOTE - 저장 하실 땐 'Excel 매크로 사용 통합 문서 (*.xlsm)' 으로 저장하셔야 매크로와 함께 저장이 됩니다.

매크로에 단축키 할당하기

한번에 export하게는 만들었는데 매번 Alt+F8 누르고, 선택하고...귀찮습니다. 해결 방법을 찾으시는 분들은 아래의 링크를 참조해주시기 바랍니다. 제가 정리 해볼까 했지만 아래 링크에서 이미지들과 함께 너무 잘 설명 되어 있어서 링크로 대신 합니다.

부록 1. 같이 보면 좋은 글

유익한 글이었다면 공감(❤) 버튼 꾹!! 추가 문의 사항은 댓글로!!