ExcelVBAからGoogle Apps Scriptへの移行：AIを活用したコード変換

## はじめに

多くの企業や学校では、長年にわたってExcelVBAを使用してきました。
しかし、クラウドサービスの台頭により、GoogleのG Suiteなどへの移行を検討する組織が増えています。
この記事では、ExcelVBAからGoogle Apps Script（GAS）への移行について、AIを活用したアプローチを紹介します。

## なぜExcelVBAからGASへの移行が難しいのか
1. 既存のコードベースが大きい
2. VBAとGASの文法の違い
3. Excelとスプレッドシートの機能の違い
4. プログラミングスキルを持つ人材の不足

特に学校現場では、プログラミングの専門家ではない教職員がVBAスクリプトを作成していることが多く、コメント無しにアルゴリズムがめちゃくちゃで、いるのかいらないのか不明な行が点在してたりで、コードの理解自体困難な場合が多々あります。
これはVBA↔GASだけでなく、あらゆる言語間で言えることだと思います。

## AIによるコード変換の可能性

AIを活用することで、これらの課題を克服し、効率的にコードを変換できる可能性があります。試しに、自作のExcelVBAコードをAIに変換してもらった例を見てみましょう。

### 元のExcelVBAコード

```vb
Sub 印刷領収書(印刷モード As Boolean)
    Dim wsData As Worksheet
    Dim wsReceipt As Worksheet
    Dim startNo As Long
    Dim endNo As Long
    Dim i As Long
    Dim dataRow As Long
    Dim col As Integer
    Dim fileName As String
    Dim schoolName As String

    ' エラーハンドリングを設定
    On Error GoTo ErrHandler

    ' データシートと領収書シートを設定
    Set wsData = ThisWorkbook.Sheets("データシート")
    Set wsReceipt = ThisWorkbook.Sheets("領収書")

    ' 開始Noと終了Noを取得
    startNo = wsData.Range("V2").Value
    endNo = wsData.Range("X2").Value

    ' データをループして領収書シートに転記し、印刷またはPDF保存
    For i = startNo To endNo
        ' データ行を計算
        dataRow = i + 2 ' No1が3行目に対応するため、2を加算

        ' 学校名をB列から取得して領収書シートのB5セルに入力
        schoolName = wsData.Cells(dataRow, 2).Value
        wsReceipt.Range("B5").Value = schoolName
        ' 支払い代金をS列から取得して領収書シートのG7セルに入力
        wsReceipt.Range("G7").Value = wsData.Cells(dataRow, 19).Value

        ' 学校名をA22セルに入力
        wsReceipt.Range("A22").Value = schoolName

        ' C列からS列の値をB25からR25に入力
        For col = 3 To 19
            wsReceipt.Cells(25, col - 1).Value = wsData.Cells(dataRow, col).Value
        Next col

        ' PDFとして保存または印刷
        If 印刷モード Then
            ' 印刷
            wsReceipt.PrintOut
        Else
            ' PDFとして保存
            fileName = "C:\PDFs\" & schoolName & "領収書.pdf"
            wsReceipt.ExportAsFixedFormat Type:=xlTypePDF, fileName:=fileName, Quality:=xlQualityStandard, _
                IncludeDocProperties:=True, IgnorePrintAreas:=True, OpenAfterPublish:=False
            Debug.Print "Saving PDF: " & fileName
        End If
    Next i

    ' 処理完了のメッセージ
    MsgBox "処理が完了しました。", vbInformation
    Exit Sub

ErrHandler:
    MsgBox "エラーが発生しました: " & Err.Description, vbCritical
    Debug.Print "エラーが発生しました: " & Err.Description
End Sub

Sub 印刷ボタン用()
    Call 印刷領収書(True)
End Sub

Sub PDF保存ボタン用()
    Call 印刷領収書(False)
End Sub
```
自分で言うのも何ですが結構綺麗に書いていると思います。コメントも主要な部分に入れて誰に渡しても「まぁまぁいいんじゃない！」って言って貰えるレベル！と勝手に思ってます。


## AIによって変換されたGASコード
```javascript
function printOrSaveReceipts(printMode) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var wsData = ss.getSheetByName("データシート");
  var wsReceipt = ss.getSheetByName("領収書");

  var startNo = wsData.getRange("V2").getValue();
  var endNo = wsData.getRange("X2").getValue();

  for (var i = startNo; i <= endNo; i++) {
    var dataRow = i + 2;
    
    var schoolName = wsData.getRange(dataRow, 2).getValue();
    wsReceipt.getRange("B5").setValue(schoolName);
    wsReceipt.getRange("G7").setValue(wsData.getRange(dataRow, 19).getValue());
    wsReceipt.getRange("A22").setValue(schoolName);

    for (var col = 3; col <= 19; col++) {
      wsReceipt.getRange(25, col - 1).setValue(wsData.getRange(dataRow, col).getValue());
    }

    if (printMode) {
      // 印刷機能はGASでは直接的にはサポートされていないため、代替案としてPDFを作成して手動で印刷
      saveAsPDF(wsReceipt, schoolName);
    } else {
      saveAsPDF(wsReceipt, schoolName);
    }
  }

  SpreadsheetApp.getUi().alert("処理が完了しました。");
}

function saveAsPDF(sheet, schoolName) {
  var folderId = "YOUR_FOLDER_ID_HERE"; // PDFを保存するGoogleドライブフォルダのID
  var ss = sheet.getParent();
  var pdfFile = DriveApp.getFolderById(folderId).createFile(ss.getBlob());
  pdfFile.setName(schoolName + "領収書.pdf");
  Logger.log("Saving PDF: " + pdfFile.getName());
}

function printButton() {
  printOrSaveReceipts(true);
}

function savePDFButton() {
  printOrSaveReceipts(false);
}
```

これを自分でやってたら、数時間はかかる気がします。
まずGASにそれほど慣れていないのでドキュメントを読みながらコードを書くのとエラー対処に時間を要する気がします。
まだ自分でコードの動作はイメージ出来ているので短時間で終わりそうですが、これが人のコードだとそうは行きません。
数日かかって、「もう自分で１から書いた方が早くね？」になってもおかしくないかも。


## AIによるコード変換の利点

1. **迅速な変換**: AIは瞬時にコードを解析し、適切な変換を行います。
2. **文法の自動調整**: VBAとGASの文法の違いを自動的に調整します。
3. **機能の置き換え**: ExcelとGoogle Spreadsheetsの機能の違いを考慮し、適切な代替手段を提案します。
4. **コメントの追加**: 必要に応じて、コードの動作を説明するコメントを追加できます。
5. **リファクタリングの提案**: より効率的なコード構造や最新のプログラミング手法を提案することがあります。
6. **エラーハンドリングの改善**: 適切なエラーハンドリング方法を提案し、コードの堅牢性を向上させます。

## 注意点

AIによるコード変換は非常に便利ですが、以下の点に注意が必要です：

1. **出力されたコードの検証**: AIが生成したコードは、必ず人間が確認し、テストする必要があります。
2. **ビジネスロジックの理解**: 元のコードのビジネスロジックを理解していないと、変換後のコードが正しく動作しているか判断が難しい場合があります。
3. **APIの制限**: GASには一部のExcel機能に相当するAPIがない場合があります。そのような場合は、代替手段を検討する必要があります。
4. **セキュリティとプライバシー**: 機密性の高いコードをAIに入力する際は、セキュリティとプライバシーに十分注意してください。

## まとめ

AIを活用したExcelVBAからGoogle Apps Scriptへのコード変換は、多くの組織にとって魅力的な選択肢となります。迅速かつ効率的なコード変換が可能になり、クラウドへの移行の障壁を下げることができます。

ただし、AIはあくまでもツールであり、最終的な判断と検証は人間が行う必要があります。プログラミングの基本的な知識を持ち、両方の環境（ExcelとGoogle Spreadsheet）を理解している人材が変換作業を進めることで、より確実で効果的な移行が可能になります。

AIを活用したコード変換は、今後さらに進化し、より精度の高い変換が可能になると予想されます。組織のデジタルトランスフォーメーションを進める上で、このようなツールを効果的に活用することが重要になってくるでしょう。

## 参考リンク

- [Google Apps Script 公式ドキュメント](https://developers.google.com/apps-script)
- [ExcelからGoogle Sheetsへの移行ガイド](https://support.google.com/a/users/answer/9331278?hl=ja)
- [VBAとGoogle Apps Scriptの違い](https://developers.google.com/apps-script/guides/sheets/functions)