1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

生成AIに関する記事を書こう!
Qiita Engineer Festa20242024年7月17日まで開催中!

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

Last updated at Posted at 2024-07-15

はじめに

多くの企業や学校では、長年にわたって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コード

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コード

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

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

参考リンク

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?