PR

驚愕!ChatGPTにAccessから情報を抽出しExcelファイルにエクスポートするVBAコードを尋ねた件

VBA

最近流行りの「ChatGPT」、イーロン・マスク氏らが率いるOpenAI社によって「GPT-4」も公開されましたが、それでもなおChatGPTの存在感は凄まじく、様々な場面で活用することができます。

Accessクリエイターにとって、VBAの実装をChatGPTを用いることで非常に簡単に、かつ素早く実現することができ、業務効率を飛躍的に向上してくれます。

以前にもChatGPTを用いてVBAコードを作成してみましたので、そちらの記事もご参考にしてください。

今回も、実務でAccess中のデータを抽出してExcelファイルへエクスポートする機能を実装する必要があり、せっかくの機会なのでChatGPTにそれを作成してもらうこととしました。

早速、どのような質問をし、どのようなVBAコードが作成されたかを見ていきましょう。

スポンサーリンク

ChatGPTへの質問と回答

ChatGPTには次のような質問をしてみました。

Accessで「T_テーブル」のフィールドに「氏名」があり、「山田」という苗字の含まれるレコードを抽出し、ExcelファイルとしてエクスポートするためのVBAコードを教えて。Excelファイルは作成日を「YYMMDD」としてファイル名とし、ワークシートは「山田」にする。

図1 ChatGPTへの質問

この結果、ChatGPTからは図2に示すような回答が返ってきました。

図2 ChatGPTからの回答

以下は、Accessで「T_テーブル」のフィールドに「氏名」があり、「山田」という苗字の含まれるレコードを抽出し、ExcelファイルとしてエクスポートするためのVBAコードの例です。Excelファイルは作成日を「YYMMDD」としてファイル名とし、ワークシートは「山田」になります。

そしてVBAコードとして次のような結果が返されました。

Sub ExportDataToExcel()
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Dim fld As DAO.Field
    Dim excelApp As Excel.Application
    Dim excelWorkbook As Excel.Workbook
    Dim excelWorksheet As Excel.Worksheet
    Dim fileName As String
    
    'Set database file path and name
    Set db = OpenDatabase("C:\Users\username\Documents\example.accdb")
    
    'Open the table and filter by last name "山田"
    Set rs = db.OpenRecordset("SELECT * FROM T_テーブル WHERE 氏名 Like '*山田*'")
    
    'Set file name and path for Excel export
    fileName = "C:\Users\username\Documents\山田_" & Format(Date, "YYMMDD") & ".xlsx"
    
    'Create new Excel application and workbook
    Set excelApp = CreateObject("Excel.Application")
    Set excelWorkbook = excelApp.Workbooks.Add
    
    'Create new worksheet named "山田"
    Set excelWorksheet = excelWorkbook.Sheets.Add(After:=excelWorkbook.Sheets(excelWorkbook.Sheets.Count))
    excelWorksheet.Name = "山田"
    
    'Copy field names to first row of worksheet
    For Each fld In rs.Fields
        excelWorksheet.Cells(1, fld.OrdinalPosition).Value = fld.Name
    Next fld
    
    'Copy data to worksheet
    excelWorksheet.Range("A2").CopyFromRecordset rs
    
    'Save and close Excel file
    excelWorkbook.SaveAs fileName
    excelWorkbook.Close
    
    'Release Excel objects from memory
    Set excelWorksheet = Nothing
    Set excelWorkbook = Nothing
    excelApp.Quit
    Set excelApp = Nothing
    
    'Close recordset and database
    rs.Close
    db.Close
End Sub

そこで、Accessで標準モジュールを作成し、上記のVBAコードをコピーしますが、この際、Accessファイルの保存先、作成されるExcelファイルの保存先は「C:\Users\usersname\Documents」となっていますので、適宜修正をします。また、上記VBA中のAccessファイルの名前は「example.accdb」となっていますが、これも実装したいAccessファイルの名前に修正します。

次に、VBAの中でDAOを用いていますので、参照設定としてMicrosoft DAOライブラリーを追加してください。

一通りの修正とライブラリー設定が完了した後、VBAコードの処理を実行すると、実はエラーが発生します。

発生したエラーの確認

一つ目は、変数宣言のエラーとして以下3つが対象エラーとなります。

Dim excelApp As Excel.Application
Dim excelWorkbook As Excel.Workbook
Dim excelWorksheet As Excel.Worksheet

これら変数宣言は、As以下を「Object」にしてください。

二つ目は、「excelWorksheet.Cells(1, fld.OrdinalPosition).Value = fld.Name」というコードでエラーが発生します。
これは、「fld.OrdinalPosition」で取得される値は「0」からとなりますが、セルの番地に「0」を指定することができないことによります。

そこで、コードを次のように修正します。
excelWorksheet.Cells(1, fld.OrdinalPosition + 1).Value = fld.Name

修正版のVBAコードの確認

改めて実行可能なVBAコードを示します。

Sub ExportDataToExcel()
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Dim fld As DAO.Field
    Dim excelApp As Object
    Dim excelWorkbook As Object
    Dim excelWorksheet As Object
    Dim fileName As String
    
    'Set database file path and name
    Set db = OpenDatabase("C:\Users\usersname\Documents\example.accdb")
    
    'Open the table and filter by last name "山田"
    Set rs = db.OpenRecordset("SELECT * FROM T_テーブル WHERE 氏名 Like '*山田*'")
    
    'Set file name and path for Excel export
    fileName = "C:\Users\usersname\Documents\山田_" & Format(Date, "YYMMDD") & ".xlsx"
    
    'Create new Excel application and workbook
    Set excelApp = CreateObject("Excel.Application")
    Set excelWorkbook = excelApp.Workbooks.Add
    
    'Create new worksheet named "山田"
    Set excelWorksheet = excelWorkbook.Sheets.Add(After:=excelWorkbook.Sheets(excelWorkbook.Sheets.Count))
    excelWorksheet.Name = "山田"
    
    'Copy field names to first row of worksheet
    For Each fld In rs.Fields
        MsgBox fld.Name & fld.OrdinalPosition
        excelWorksheet.Cells(1, fld.OrdinalPosition + 1).Value = fld.Name
    Next fld
    
    'Copy data to worksheet
    excelWorksheet.Range("A2").CopyFromRecordset rs
    
    'Save and close Excel file
    excelWorkbook.SaveAs fileName
    excelWorkbook.Close
    
    'Release Excel objects from memory
    Set excelWorksheet = Nothing
    Set excelWorkbook = Nothing
    excelApp.Quit
    Set excelApp = Nothing
    
    'Close recordset and database
    rs.Close
    db.Close
End Sub

以上の修正が終わった後に再度VBAコードを実行してみてください。すると、今度は処理が上手く実行され、「山田」が含まれるレコードのみExcelファイルにエクスポートされ、条件に沿ったファイル名としてExcelファイルが作成されたと思います。

このようにして、ChatGPTを活用することで、AccessからExcelファイルをエクスポートするVBAコードも容易に実装することができるようになりました。

ChatGPTで完璧なVBAコードを作成することはまだまだ難しい部分もありますが、それでもほとんど間違いなく、少しの修正でこれだけの処理のコードを素早く作成してくれますので、業務ルーチンなどのためにVBAコードを実装することのハードルがかなり下がったのではないでしょうか。

まとめ

今回は、ChatGPTを用いて、Access中にあるデータをExcelファイルにエクスポートし、作成されたExcelファイルの名称も条件に沿って付与するというVBAコードを作成してみました。

質問方法も至ってシンプルなものでしたが、それでも返された回答にほとんど間違いはなく、ChatGPTが大変便利であることが示されました。

職場でChatGPTを用いるということに対して様々な議論を呼んでいますが、機微な情報等をChatGPTに載せるようなことはせず、要点だけを抑えて質問をしていくだけでも適切な回答は得られると思います。今後はますますこのようなAIツールを上手く活用することで業務効率を改善していくと良いのではないでしょうか。

今の時代、VBAに限らずプログラミングができるということは、当然のスキルとして広く社会で認知されています。いまだプログラミングが十分にできないという人は、今からでも遅くありません。できるだけ早く基本的なプログラミングスキルを習得することをお勧めします。

ご自身にあった専門書を参考に、実践的なプログラミング・データベース・サーバ、データ分析・機械学習など、システムエンジニアや今後を担うDX人材に必要とされているスキル獲得に向けて基礎から学んでいくことが大切です。

最初につまずきがちな点も、書籍を読みながら試行錯誤して課題解決していくことで、自身のスキルアップを目指すことができます。思い立ったが吉日、是非業務効率の改善に向けてプログラミング学習に勤しんでください!

スポンサーリンク

Kindle Unlimitedにサインアップして無料体験に登録する
Kindle Unlimitedに登録すると、人気のシリーズ、ベストセラー、名作などに好きなだけアクセスして、シームレスなデジタル読書体験を実現できます。

コメント

タイトルとURLをコピーしました