ExcelVBA:ゲーム開発者が使えるマクロ5選
ゲーム開発の現場では、Excelを使う場面が意外とたくさんあります。
アイテムのパラメータ、ローカライズ用のテキスト、アセットの管理リスト…
気づいたらシートが増えていて、同じような手作業を何度も繰り返していたりしませんか?
「このデータ、毎回手動で整形してるな…」
「また同じコピペ作業か…」
そんな地味にストレスな場面、VBAのマクロを使えばボタン一つで解決できます。
今回は、ゲーム開発の現場で実際に役立つVBAマクロを5つ紹介します。
どれも短いコードで書けるので、VBAに慣れていない方でも気軽に試せると思います。
ひとつでも「これ使える!」と思ってもらえたら嬉しいです!
目次
マクロ① — データの空白・重複を自動チェック
マクロ② — 選択範囲をMarkdown表に変換してコピー
マクロ③ — フォルダ内のファイル名を一覧化
マクロ④ — ローカライズ用テンプレートを自動生成
マクロ⑤ — データをCSV・JSONに一括出力
まとめ
マクロ① — データの空白・重複を自動チェック
どんな場面で使う?
アイテムIDや敵IDなど、重複があってはいけないデータを大量に管理しているとき。目視チェックは見落としがあるし、データが増えるほど大変です。
できること:
- 指定列の空白セルを検出して警告
- 重複している値をハイライト表示
Sub CheckDuplicatesAndBlanks() Dim ws As Worksheet Set ws = ThisWorkbook.ActiveSheet Dim checkCol As Range Set checkCol = ws.Range(“A2:A100”) Dim cell As Range Dim dupCount As Integer dupCount = 0 For Each cell In checkCol ‘ Skip empty rows If IsEmpty(cell.Value) Then cell.Interior.Color = RGB(255, 255, 0) dupCount = dupCount + 1 End If ‘ Check duplicate If WorksheetFunction.CountIf(checkCol, cell.Value) > 1 Then If Not IsEmpty(cell.Value) Then cell.Interior.Color = RGB(255, 150, 150) dupCount = dupCount + 1 End If End If Next cell If dupCount = 0 Then MsgBox “No issues found!” Else MsgBox dupCount & ” issue(s) found. Please check highlighted cells.” End If End Sub |
ポイント: CountIf()をVBAから呼び出すのが地味に便利です。わざわざ関数列を追加しなくていいので、シートがすっきり保てます。
マクロ② — 選択範囲をMarkdown表に変換してコピー
どんな場面で使う?
ExcelのデータをGitHubのREADMEやNotion、社内Wikiに貼り付けたいとき。いちいち手動で|を入力して表を作るのは面倒ですよね。
できること:
- 選択したセル範囲をMarkdown表の形式に変換
- そのままクリップボードにコピーするので、貼り付けるだけでOK
例えばこのExcelデータを選択して実行すると…
EnemyID | HP | ATK |
E001 | 100 | 30 |
E002 | 300 | 45 |
こうなります:
| EnemyID | HP | ATK | |—|—|—| | E001 | 100 | 30 | | E002 | 300 | 45 | |
コード:
Sub CopyAsMarkdownTable() Dim sel As Range Set sel = Selection If sel Is Nothing Then MsgBox “Please select a range first.” Exit Sub End If ‘ Load selection into array Dim arrData As Variant arrData = sel.Value Dim lastRow As Long Dim lastCol As Long lastRow = UBound(arrData, 1) lastCol = UBound(arrData, 2) Dim arrOut() As String ReDim arrOut(0) Dim r As Long, c As Long ‘ Header row Dim headerCols() As String ReDim headerCols(1 To lastCol) For c = 1 To lastCol headerCols(c) = CStr(arrData(1, c)) Next c arrOut(0) = “| “ & Join(headerCols, ” | “) & ” |” ‘ Separator row ReDim Preserve arrOut(UBound(arrOut) + 1) Dim sepCols() As String ReDim sepCols(1 To lastCol) For c = 1 To lastCol sepCols(c) = “—“ Next c arrOut(UBound(arrOut)) = “| “ & Join(sepCols, ” | “) & ” |” ‘ Data rows For r = 2 To lastRow Dim rowCols() As String ReDim rowCols(1 To lastCol) For c = 1 To lastCol rowCols(c) = CStr(arrData(r, c)) Next c ReDim Preserve arrOut(UBound(arrOut) + 1) arrOut(UBound(arrOut)) = “| “ & Join(rowCols, ” | “) & ” |” Next r ‘ Copy to clipboard Dim result As String result = Join(arrOut, vbCrLf) With CreateObject(“Forms.TextBox.1”) .MultiLine = True .Text = result .SelectAll .Copy End With MsgBox “Copied as Markdown table! (“ & lastRow & ” rows)” End Sub |
ポイント: クリップボードへのコピーにForms.TextBox.1を使っています。外部ライブラリ不要で動くので、どの環境でもそのまま使えます。また、ExcelVBA:配列でマクロの処理時間を高速化する方法で紹介した配列テクニックを使っているので処理も高速です。
マクロ③ — フォルダ内のファイル名を一覧化
どんな場面で使う?
Unityのアセットフォルダやサウンドフォルダの中身をExcelで管理したいとき。手動でファイル名を入力するのは現実的じゃないですよね。
できること:
- 指定フォルダのファイル名を全部シートに書き出す
- 拡張子でフィルタリングも可能(例:.pngだけ、.wavだけ)
Sub ListFilesInFolder() Dim folderPath As String folderPath = InputBox(“Enter folder path:”, “Folder Path”) If folderPath = “” Then Exit Sub Dim ws As Worksheet Set ws = ThisWorkbook.ActiveSheet ws.Cells.Clear ‘ Header ws.Cells(1, 1).Value = “FileName” ws.Cells(1, 2).Value = “Extension” ws.Cells(1, 3).Value = “FullPath” Dim fileName As String Dim row As Long row = 2 fileName = Dir(folderPath & “\*.*”) Do While fileName <> “” ws.Cells(row, 1).Value = fileName ws.Cells(row, 2).Value = LCase(Right(fileName, Len(fileName) – InStrRev(fileName, “.”))) ws.Cells(row, 3).Value = folderPath & “\” & fileName row = row + 1 fileName = Dir() Loop MsgBox “Found “ & row – 2 & ” file(s)!” End Sub |
ポイント: Dir()関数はシンプルですが、フォルダ内を走査する基本テクニックです。アセット管理だけでなく、ログファイルの収集などにも応用できます。
マクロ④ — ローカライズ用テンプレートを自動生成
どんな場面で使う?
ゲームに多言語対応が必要なとき、翻訳担当者に渡すファイルを毎回手動で作るのは大変です。
できること:
- 「テキストID」と「原文(日本語)」の列から、翻訳用シートを自動生成
- 対応言語(英語・中国語など)の列を自動で追加
Sub GenerateLocalizationSheet() Dim wsSrc As Worksheet Dim wsLoc As Worksheet Set wsSrc = ThisWorkbook.ActiveSheet ‘ Languages to add Dim langs As Variant langs = Array(“EN”, “ZH”, “KO”) ‘ Create or clear Localization sheet On Error Resume Next Set wsLoc = ThisWorkbook.Sheets(“Localization”) On Error GoTo 0 If wsLoc Is Nothing Then Set wsLoc = ThisWorkbook.Sheets.Add wsLoc.Name = “Localization” Else wsLoc.Cells.Clear End If ‘ Header wsLoc.Cells(1, 1).Value = “ID” wsLoc.Cells(1, 2).Value = “JA” Dim i As Integer For i = 0 To UBound(langs) wsLoc.Cells(1, 3 + i).Value = langs(i) Next i ‘ Copy ID and JA columns from source Dim lastRow As Long lastRow = wsSrc.Cells(wsSrc.Rows.Count, 1).End(xlUp).Row wsSrc.Range(“A2:B” & lastRow).Copy wsLoc.Range(“A2”) MsgBox “Localization sheet generated!” End Sub |
ポイント: langsの配列を変えるだけで対応言語を増減できます。プロジェクトごとにカスタマイズしやすい構造にしておくのがポイントです。
マクロ⑤ — データをCSV・JSONに一括出力
どんな場面で使う?
Excelで管理しているゲームデータをUnityに渡すとき。毎回「名前を付けて保存」でCSVにするのは手間だし、JSONが必要な場合はさらに面倒です。
できること:
- アクティブシートのデータをCSVとして出力
- 出力先はExcelファイルと同じフォルダに自動保存
Sub ExportToCSV() Dim ws As Worksheet Set ws = ThisWorkbook.ActiveSheet Dim filePath As String filePath = ThisWorkbook.Path & “\” & ws.Name & “.csv” Dim lastRow As Long Dim lastCol As Long lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row lastCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column ‘ Load to array (faster than Range access) Dim arrData As Variant arrData = ws.Range(ws.Cells(1, 1), ws.Cells(lastRow, lastCol)).Value Dim arrOut() As String ReDim arrOut(1 To lastRow) Dim r As Long, c As Long For r = 1 To lastRow Dim rowData() As String ReDim rowData(1 To lastCol) For c = 1 To lastCol rowData(c) = CStr(arrData(r, c)) Next c arrOut(r) = Join(rowData, “,”) Next r ‘ Write UTF-8 With CreateObject(“ADODB.Stream”) .Charset = “UTF-8” .Open .WriteText Join(arrOut, vbCrLf), 1 .SaveToFile filePath, 2 .Close End With MsgBox “CSV exported: “ & filePath End Sub |
ポイント: ExcelVBA:配列でマクロの処理時間を高速化する方法で紹介した配列テクニックをここでも活用しています。大量データでも高速に動作します。またUTF-8で出力するので、日本語が含まれていても文字化けしません。
まとめ
今回紹介した5つのマクロをまとめると:
# | マクロ名 | 使いどころ |
① | 空白・重複チェック | IDの入力ミスを防ぐ |
② | Markdown表に変換してコピー | GitHubへのコピペ |
③ | ファイル名一覧化 | アセット管理の自動化 |
④ | ローカライズ生成 | 翻訳作業の準備を効率化 |
⑤ | CSV出力 | Unityへのデータ渡し |
どれも単体で使えますが、組み合わせることでより強力なパイプラインが作れます。ぜひ自分のプロジェクトに合わせてカスタマイズしてみてください!