ホーム » JOB » ツール » ChatGPTとコラボしてVBAを業務改善に活かそう! – 実践的なプログラミングガイド①

ChatGPTとコラボしてVBAを業務改善に活かそう! – 実践的なプログラミングガイド①

JOB

概要

この記事では、ChatGPTとVBAを組み合わせ、効率的な業務改善を実現するための実践的な方法を提案したいと思います。

VBAはエクセルやWordなどのMicrosoft Office製品に組み込まれたプログラミング言語であり、これを活用できれば作業の自動化により業務改善につながることはみなさんご存じのとおりです。ただしプログラムというとなかなか自分で作成するのが難しいと感じている方が多いのではないかと思います。

ここでは、VBAでコード(プログラム)作成などしたことがない人を対象とします。私も使ったことがありませんでしたが、ChatGPTの高いVBAコード作成能力を活かしながら、業務にも利用できるのではないかと考えています。

基本的な知識から始め、実際のコーディングを通じて業務改善にどのように貢献できるかを説明して行きたいと思います。


ChatGPTとは何か?

  • ChatGPTの概要
  • ChatGPTの特徴と利用シーン

ChatGPTの概要

ChatGPT(Generative Pre-trained Transformer)は、OpenAI社が開発した自然言語処理モデル(人工知能)によるチャットサービスです。ChatGPTは、インターネット上の膨大なデータから言葉同士の関連性や文章構造などを学習しています。それにより、ユーザーが投げかけた質問や指示(プロンプト)に対して自然な文章で回答することができます。ChatGPTは、対話に特化した言語モデルであり、自然な会話が行えることが特徴です。

ChatGPT3.5は、2022年11月に無料でリリースされ、わずか2ヶ月ほどで世界のユーザー数が1億人を突破しました。さらに高性能なChatGPT4が2023年3月にアップデートされています。こちらは有料(20$)ですが、2023年秋には画像認識機能が加わったChatGPT4Vが公開され、まさに日進月歩で進化しています。

ChatGPTの特徴と利用シーン

ChatGPTの特長としてよく挙げられるのは高度な文章生成能力ですが、ChatGPTはプログラミング言語についても非常に高い能力を持っていて、広範なプログラミング言語の理解と生成が特長として挙げられます(下表参照)。

この特性により、ChatGPTはプログラミングの質問に対して高い精度で回答し、複雑なコードやプログラムの生成が可能です。ChatGPTは質問応答、文章生成、コーディングサポートなど、多岐にわたる利用シーンに適しています。

表.ChatGPTが扱えるプログラミング言語

language-list

https://chat.openai.com/ ChatGPTはOpen AIのサイトで登録できます。

【その2】ChatGPTとは?使い方や機能、活用方法を徹底解説 – ライフ&ジョブブログ (life-and-job.com)

VBA概要

  • VBAとは
  • 言語の特徴
  • エクセルやWordとの連携方法

VBAとは

Visual Basic for Applications(VBA)は、Microsoftが開発したプログラミング言語で、主にMicrosoft Office製品と統合されています。VBAは、EXCELやWord、Accessなどのアプリケーション内で使用され、これらのアプリケーションの機能を拡張したり、自動化したりするために利用されます。VBAはイベント駆動型の言語と言われており、ユーザーの操作や特定の条件に応じてコードが実行されます。

EXCELを使ったことのある方なら、マクロという言葉を聞いたことがある、あるいは実際使ったことがあると思います。EXCELの操作を実際に行ないながら記録させることで、VBAのコード(プログラム)が自動生成でき、定型業務を自動化、省力化するものです。

言語の特徴

VBAは易学性と柔軟性が特徴の言語と言われます。Basic(ビジュアル ベーシック)系の言語であるため、シンプルな構文やわかりやすい記述が可能です。VBAの文法は英語に近く、初学者でも理解しやすい構造を持っています。

EXCELとの連携方法

VBAは特にEXCELとの親和性が高く、EXCELのオブジェクトモデルにアクセスすることができます。これにより、セルの操作、データの処理、グラフの生成などEXCELの様々な機能をVBAを使って自動化できます。VBAコードはEXCELファイル内に埋め込んで保存することができ、他のユーザーと共有する際にも非常に便利です。VBAを使用することで、EXCELの操作を単なるデータ入力以上のものにし、効率的な業務プロセスを構築できます。

Excelの魔法を解き放つ!VBA入門:ステップバイステップガイド – ライフ&ジョブブログ (life-and-job.com)

EXCEL以外のMicrosoftアプリケーションへの活用

VBAはEXCELだけでなく、他のMicrosoftアプリケーションにも幅広く活用できる多機能な言語です。以下に、VBAがどのようにして他のアプリケーションと連携し、活用されるかについて解説します。

Word(ワード)

VBAを使用することで、Word文書の自動生成、書式設定の自動化、文書内のテキスト検索や置換、表の操作などが可能です。例えば、契約書や報告書のテンプレートを自動的に生成したり、特定のキーワードを検索して強調表示するなどの処理が行えます。

Outlook(アウトルック)

Outlookでは、VBAを利用して自動的なメールの作成や送信、受信メールの処理、カレンダーの操作などが可能です。スケジュールに基づいて自動でメールを送信したり、特定の条件に応じて受信メールを整理するスクリプトを作成することができます。

PowerPoint(パワーポイント)

PowerPointにおいても、VBAを利用してプレゼンテーションの自動生成、スライドの編集、グラフの挿入、スライドのフォーマット設定などが可能です。これにより、大量のデータから自動的にプレゼンテーションを生成することができます。

その他のアプリケーション

VBAはこれらの主要なMicrosoftアプリケーションだけでなく、他のアプリケーションにも応用できます。VBAがサポートされているアプリケーションでは、そのアプリケーションのオブジェクトモデルにアクセスして、自動化やカスタマイズを行うことが可能です。

これにより、VBAはMicrosoft Office全体で一貫性のあるプログラミング環境を提供し、業務プロセス全体を効率化することが可能となります。

ChatGPTとVBAの連携メリット

  • ChatGPTがもたらす柔軟性と問題解決力
  • VBAとの組み合わせで実現する業務改善のポイント

ChatGPTがもたらす柔軟性と問題解決力

ここから実際にVBAを使ってみたいと思います。

例1:簡単なコード生成

ChatGPTに以下の質問をしました。こんな漠然とした質問ですが、「データの自動フィルタリング」「セルの結合解除」「シートのコピーや移動」「メールの自動送信」という4例をコードを付けて提案してくれました。

chat1

すべてを記載しませんが、「シートのコピーや移動」のコードは以下の通りです。VBAを知っている方は分かると思いますが、ちゃんと動きます。分からない方は、試してみてください。

Sub シートのコピーや移動()
    ' シートのコピー
    Sheets("Sheet1").Copy After:=Sheets("Sheet1")
    ' シートの移動
    Sheets("Sheet1").Move After:=Sheets("Sheet2")
End Sub

ChatGPTの能力の高さに驚きます。VBA素人の私は最初非常に感激しました。ちょっとした質問からこれだけの例を挙げてくれます。このようなところから実務に繋がるアイデアが浮かぶきっかけが生まれると思います。

ただ、このくらいの操作であれば、わざわざVBAでプログラムにしなくても、手操作で行なった方が早いですよね。であれば、もっと高度なプログラムを作成させてみたい。

例2:難しいコード生成

そこで以下のようなデータ集計のコード生成を指示してみます。実務では、データファイル(ブック)が違っていたり、Sheetの数が多かったりして、より労力がかかる集計作業が多いと思いますが、ここではある程度シンプルな内容としています。

chat2
datasheet
【プロンプトエンジニアリングに学ぶ】上手なAIとの対話や質問の仕方
言語モデルを効率的に使用するためのプロンプト開発および最適化する研究分野がプロンプトエンジニアリングと呼ばれ、その内容が「Prompt Engineering Guide」に纏められています。AIへの質問の仕方、回答のさせ方のコツを纏めます。

【プロンプトエンジニアリングに学ぶ】上手なAIとの対話や質問の仕方 – ライフ&ジョブブログ (life-and-job.com)

最初の生成コード

生成されたコードは以下の通りです。素人なので分からないですが、見た感じ完璧に見えます。さっそくこのコードを入力して実行してみました。

Sub 患者数集計()

    ' 変数の宣言
    Dim wsSource As Worksheet
    Dim wsOutput As Worksheet
    Dim lastRow As Long
    Dim lastCol As Long
    Dim i As Long, j As Long
    Dim monthDict As Object
    Set monthDict = CreateObject("Scripting.Dictionary")
    
    ' シートの設定
    Set wsOutput = Sheets("Sheet4")
    
    ' シートごとに処理
    For Each wsSource In Worksheets(Array("Sheet1", "Sheet2", "Sheet3"))
        
        ' 最終行と最終列を取得
        lastRow = wsSource.Cells(wsSource.Rows.Count, "A").End(xlUp).Row
        lastCol = wsSource.Cells(1, wsSource.Columns.Count).End(xlToLeft).Column
        
        ' データの読み取りと集計
        For i = 2 To lastRow
            Dim dateValue As Date
            dateValue = wsSource.Cells(i, 1).Value
            Dim monthKey As String
            monthKey = Format(dateValue, "yyyy-mm")
            
            If Not monthDict.Exists(monthKey) Then
                monthDict(monthKey) = CreateObject("Scripting.Dictionary")
            End If
            
            If Not monthDict(monthKey).Exists(wsSource.Name) Then
                monthDict(monthKey)(wsSource.Name) = 0
            End If
            
            monthDict(monthKey)(wsSource.Name) = monthDict(monthKey)(wsSource.Name) + wsSource.Cells(i, 2).Value
        Next i
        
    Next wsSource
    
    ' 集計結果を出力
    wsOutput.Cells.Clear
    
    ' ヘッダーの書き込み
    wsOutput.Cells(1, 1).Value = "年月"
    wsOutput.Cells(1, 2).Value = "東京都"
    wsOutput.Cells(1, 3).Value = "神奈川県"
    wsOutput.Cells(1, 4).Value = "埼玉県"
    
    ' データの書き込み
    i = 2
    For Each monthKey In monthDict.Keys
        wsOutput.Cells(i, 1).Value = monthKey
        j = 2
        For Each wsName In Array("Sheet1", "Sheet2", "Sheet3")
            If monthDict(monthKey).Exists(wsName) Then
                wsOutput.Cells(i, j).Value = monthDict(monthKey)(wsName)
            Else
                wsOutput.Cells(i, j).Value = 0
            End If
            j = j + 1
        Next wsName
        i = i + 1
    Next monthKey

End Sub

これを実行すると以下のようなメッセージが出てしまいました。

message

何を言っているのか全然分かりません!

分からないままに、以下のようにChatGPTへ知らせると、すぐ修正してくれました。

修正後のコード(完成版)

下が修正したコードです。26行目が修正されています。これだけ修正すれば動くのか・・・試してみます。

Sub 患者数集計()

    ' 変数の宣言
    Dim wsSource As Worksheet
    Dim wsOutput As Worksheet
    Dim lastRow As Long
    Dim lastCol As Long
    Dim i As Long, j As Long
    Dim monthDict As Object
    Set monthDict = CreateObject("Scripting.Dictionary")

    ' シートの設定
    Set wsOutput = ThisWorkbook.Sheets("Sheet4")

    ' シートごとに処理
    For Each wsSource In ThisWorkbook.Worksheets(Array("Sheet1", "Sheet2", "Sheet3"))

        ' 最終行と最終列を取得
        lastRow = wsSource.Cells(wsSource.Rows.Count, "A").End(xlUp).Row
        lastCol = wsSource.Cells(1, wsSource.Columns.Count).End(xlToLeft).Column

        ' データの読み取りと集計
        For i = 2 To lastRow
            Dim dateValue As Date
            dateValue = wsSource.Cells(i, 1).Value
            Dim monthKey As Variant ' Variant型に変更
            monthKey = Format(dateValue, "yyyy-mm")

            If Not monthDict.Exists(monthKey) Then
                Set monthDict(monthKey) = CreateObject("Scripting.Dictionary")
            End If

            If Not monthDict(monthKey).Exists(wsSource.Name) Then
                monthDict(monthKey)(wsSource.Name) = 0
            End If

            monthDict(monthKey)(wsSource.Name) = monthDict(monthKey)(wsSource.Name) + wsSource.Cells(i, 2).Value
        Next i

    Next wsSource

    ' 集計結果を出力
    wsOutput.Cells.Clear

    ' ヘッダーの書き込み
    wsOutput.Cells(1, 1).Value = "年月"
    wsOutput.Cells(1, 2).Value = "東京都"
    wsOutput.Cells(1, 3).Value = "神奈川県"
    wsOutput.Cells(1, 4).Value = "埼玉県"

    ' データの書き込み
    i = 2
    For Each monthKey In monthDict.Keys
        wsOutput.Cells(i, 1).Value = monthKey
        j = 2
        For Each wsName In Array("Sheet1", "Sheet2", "Sheet3")
            If monthDict(monthKey).Exists(wsName) Then
                wsOutput.Cells(i, j).Value = monthDict(monthKey)(wsName)
            Else
                wsOutput.Cells(i, j).Value = 0
            End If
            j = j + 1
        Next wsName
        i = i + 1
    Next monthKey

End Sub

下のように結果が表示されました。各都県とも月ごとに集計されています。これは凄いです!

result

この例は3つのシートだけですが、47都道府県に増えても同じように集計することができるはずで、数が増えるほどその効果を発揮することはお分かりになると思います。

このようにChatGPTは非常に柔軟なアイデアとコードを提示し、またその問題解決にも柔軟に対応してくれます。

VBAとの組み合わせで実現する業務改善のポイント

このように素人でもChatGPTを利用しながら、VBAを利用した業務改善へつながる可能性があることを紹介しました。さらにそれを推し進めるためのポイントが何かを探っていきたいと思います。


ここまでのまとめ

ChatGPTとVBAの組み合わせによる業務改善のポイントを紹介しました。

  1. ChatGPTの柔軟性と問題解決力
    • ChatGPTは高度な文章生成能力を持ち、質問に対して自然な文章で回答することができる。
    • ChatGPTはプログラミング言語にも精通しており、VBAに関する質問に高精度で応答する。
  2. VBAの特徴と連携方法
    • VBAはMicrosoft Office製品に統合されたプログラミング言語で、特にEXCELとの親和性が高い。
    • VBAはシンプルな構文や英語に近い文法を持ち、EXCELの操作を自動化し効率的な業務プロセスを構築するのに適している。
  3. VBAの他アプリケーションへの活用
    • VBAはEXCELだけでなく、Word、Outlook、PowerPointなど他のMicrosoftアプリケーションにも応用可能。
    • VBAを使用してこれらのアプリケーションの自動化やカスタマイズが可能。
  4. ChatGPTとVBAの連携メリットの実例
    • ChatGPTを使用してVBAコードを生成する際、簡単なコード生成や難しいコード生成が可能。
    • ChatGPTが提示したコードをVBAで実行する際、修正が必要な部分もChatGPTに指摘すると迅速に修正され、効果的なコードが生成された。
  5. 具体的な例:患者数集計
    • ChatGPTによって生成されたVBAコードを元に、患者数の月ごとの集計を実施。
    • ChatGPTが提示したコードは初回にエラーがあり、ChatGPTにエラー箇所を指摘すると修正が加えられ、正常に動作するコードが生成された。
    • 生成されたコードによって、複数のシートからデータを取得して都道府県ごとの月次集計が自動化された。

「ChatGPTとVBAの連携メリット」を通じて、ChatGPTの柔軟性とVBAの強力な機能が組み合わさり、効率的な業務プロセスの改善が可能であることが示されました。

次回は、もう少し複雑な業務課題を例に、解決するためのアプローチについての考察と、より効果的にChatGPTとVBAを連携活用しながら業務改善を進めるためにはどうすれば良いか考えていきたいと思います。

コメント

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