본문 바로가기
도전! N잡러!/도전! 게임 개발!

엑셀 데이터 CSV 저장 매크로!

by NAWE 2023. 6. 20.
반응형

안녕하세요. 나위입니다.

게임을 만들다 보면 엑셀을 사용해서 데이터 테이블을 만드는 경우가 많죠.

이 블로그에 연재했었던 마이너리티 아레나기본 전투 시스템 기획서를 작성하면서도 데이터 테이블에 대한 이야기를 많이 했었습니다.

 

기억나지 않으신다고요?!

링크를 남겨드리죠!

 

시스템 기획서 작성 ─ 기본 전투 시스템 기획서 ③

시스템 기획서 작성 ─ 기본 전투 시스템 기획서 ④

 

여하튼, 포스팅 내용에도 있듯이 엑셀은 기획자의 친구입니다.

게임에서 사용할 데이터를 엑셀을 통해 입력하고, 밸런싱하며 재미를 구현해 내니까요.

그런데, 그냥 엑셀로 테이블만 만들었다고 해서 게임에 쓸 수 있는 건 아니죠. 개발자가 엑셀 데이터를 가져와서 사용할 수 있게끔 가공해줘야 합니다.

 

개발사에 따라 다르긴 하지만, 저는 일반적으로 사용하는 방식으로 데이터를 가공해보려 합니다.

데이터 포맷 'CSV(comma separated variables, 쉼표 구분 변수)'파일로 말이죠.


CSV 파일이란, 엑셀에서 사용하는 셀 서식을 모두 제거하고 온전히 데이터 값만 텍스트 파일로 저장한 파일입니다.

예를 들어.

마이너리티 아레나의 CharacterTable을 엑셀로 작성, CSV로 저장하면...
이렇게 저장이 됩니다.

칼럼 간의 구분은 쉼표(,)로, 그리고 열의 구분은 개행(Enter)으로 구분된 모습을 볼 수 있죠.

그리고 가장 위쪽의 2줄은 데이터에 포함하지 않았습니다. 컬럼의 이름과 영문명은 기획자와 개발자가 참고용으로 사용하는 것이라 실제 데이터에는 포함되지 않는 것이 좋으니까요.

 

여하튼...

엑셀에 있는 값들을 실제 게임 개발에 사용하기 위해 CSV 형식으로 변환하는 것입니다.

그리고 엑셀 데이터를 CSV 파일로 저장하는 법은 상당히 간단합니다.

엑셀에서 다른 이름으로 저장(단축키 F12) → 파일 형식을 CSV로 선택해서 저장하기만 하면 되니까요.

파일 형식에 CSV를 찾으면 됩니다!

그런데 게임에서 사용하는 테이블은 1개가 아니죠.

어쩌면 수십, 수백개의 테이블을 사용하기도 합니다.

문제는 엑셀 파일을 CSV로 저장하려 할 때, 여러 개의 시트가 들어있는 통합 문서일 경우에는 각 시트별로 따로 저장을 해 줘야 한다는 거예요.

메시지 박스에서도 따로 저장하라고 안내를 하네요.

엑셀 시트가 10개면 10번을. 100개면 100번을 따로따로 저장하라니 여간 곤혹스러운 일이 아닐 수 없습니다.

그래서 보통 매크로를 만들어 사용합니다.

자동으로 여러 시트를 CSV 파일로 저장해 주는 매크로를 VB로 만드는 것입니다.


만드는 법은 아래와 같습니다.

아주 간단하니까 따라가 봅시다.

개발 도구 - Visual Basic 선택
삽입 - 모듈 선택
코드 입력창에 아래의 코드를 복붙해 봅시다.

Option Explicit

Sub saveCSVwithoutBOMbyTable()

    Dim strPath, strFileName As String
    Dim i, j, x, y As Integer
    Dim countX, countY
    
    Dim fs As Object 'ADODB.Stream'
    Dim fsText As String
    
    Dim bs As Object 'ADODB.Stream'
            
    strPath = ThisWorkbook.Path & "\"
    ChDir strPath
            
    For i = 1 To ThisWorkbook.Sheets.Count
        ThisWorkbook.Sheets(i).Select
        strFileName = ThisWorkbook.Sheets(i).Name & ".txt"

        countX = 1
        If Trim(Range("B2")) <> "" Then
            countX = Range("A2").End(xlToRight).Column
        End If
        
        countY = 3
        If Trim(Range("A4")) <> "" Then
            countY = Range("A3").End(xlDown).Row
        End If
        
        Set fs = CreateObject("ADODB.Stream")
        fs.Type = 2
        fs.Charset = "utf-8"
        fs.Open
        
        For y = 3 To countY
            For x = 1 To countX
                fsText = Cells(y, x)
                fs.writetext fsText
                If x <> countX Then
                    fs.writetext ","
                End If
            Next
            If y <> countY Then
                fs.writetext vbCrLf
            End If
        Next
        
        fs.Position = 3
        
        Set bs = CreateObject("ADODB.Stream")
        bs.Type = 1
        bs.Open
        
        fs.CopyTo bs
        
        fs.flush
        fs.Close
        
        bs.SaveToFile strPath & strFileName, 2
        bs.flush
        bs.Close
    Next
    
End Sub

참고로 저 코드에 대해서는 잘 모릅니다.

그냥 어느 부분이 어느 기능을 하는지는 대략적으로 알고 있을 뿐이에요. 그러니 코드에 대해 문의하신다고 해도 저는 설명드리지 못합니다 ㅠ

 

그리하여 마지막.

엑셀을 저장할 때의 파일 형식은 매크로 사용이 가능한 xlsm을 선택하여 저장해 줍시다.

파일 형식을 매크로 사용 통합 문서로 저장

이제 다 끝났습니다.

엑셀을 끄고, 저장한 파일을 다시 실행시켜 봅시다.

일반적인 상황이라면 아래와 같은 보안 경고 메시지가 뜰 텐데, '콘텐츠 사용'을 선택해서 매크로를 사용하겠다는 걸 확인시켜 줍시다.

콘텐츠 사용을 눌러줍시다!

그리고 Alt+F8 또는 개발 도구 - 매크로를 선택하면...

개발 도구 - 매크로 선택

아래와 같이 매크로 창이 나타나고, 아까 우리가 입력했던 매크로가 자동으로 선택되어 있을 겁니다.

그걸 실행하시면 엑셀 파일을 저장했던 경로에 시트 이름으로 CSV 파일이 자동 저장됩니다.

매크로 창이 나타나고, 여기서 실행을 누르면 됩니다.
저장 완료!

저는 DB라는 통합 시트 안에 Bike, Character, CharacterLevel, Grade 테이블을 만들어 둔 상태여서 저렇게 4개의 텍스트 파일이 만들어졌어요.

 

저게 다 무슨 테이블이냐고요?

바로 저의 1인 개발 프로젝트! CICC를 개발하는데 필요한 테이블을 제작하는 중이랍니다.

언젠가 개발될 CICC 많이 기대해 주세요 ㅎㅎ

반응형

'도전! N잡러! > 도전! 게임 개발!' 카테고리의 다른 글

TAP FLOAT 개발 일기 #1  (98) 2023.09.13
TAP FLOAT 개발 일기 #0  (94) 2023.09.11
개인정보처리방침  (1) 2023.09.07
CICC 타이틀 화면 제작!  (7) 2023.04.20
1인 게임 개발 도전!  (15) 2023.04.10

댓글