Site cover image

Site icon imageExcelおさるくんのastro-notion-blog

VBA / Python / Notion / AIによる業務効率化とデータサイエンスに関する情報を発信しています!

Post title iconChatGPTの最新モデルGPT-4oが登場!ExcelシートのスクリーンショットからVBAコードを生成する方法をご紹介します!

Featured image of the post

🔄 アップデート情報

2024年9月12日よりChatGPTの最新モデルとしてOpenAI o1の提供が開始されました!
  • 高度な推論能力を持つように設計されており、特に科学、数学、コーディングの分野で優れたパフォーマンスを発揮します。
  • 応答前に「思考時間」を取るよう訓練されており、複雑な問題に対してより深い分析が可能です。
  • o1-previewo1-miniの2つのモデルがあります。主な違いを以下の表にまとめました。
特徴o1-previewo1-mini
推論能力より高度o1-previewよりやや劣る
処理速度標準より高速
コスト高いo1-previewの約80%
週間利用制限30メッセージ50メッセージ
最大出力トークン数32,768トークン65,536トークン
主な用途高度な技術開発、
研究プロジェクト
小規模プロジェクト、
基本的な自動化タスク
コーディング能力非常に高いo1-previewと同等
リソース消費多い少ない(軽量)
複雑なタスク処理優れているやや劣る
Image in a image block
🎙️
漫才を書かせて比較してみました。テーマは「スターバックス」です。
OpenAI o1
Image in a image block
Image in a image block
GPT-4o
Image in a image block
Image in a image block

比較すると確かにOpenAI o1の方がボケとツッコミの掛け合いが自然でオチまでついて、よりネタが作り込まれている気がします…笑

VBAコードの実行方法について
  • 本記事で紹介している動画にたくさんのコメント、ご質問をいただきました。ありがとうございます!
Image in a image block

  • ご質問の中にありました、VBAコードの実行方法について詳しくご説明いたします。
Image in a image block

1. コードを入力するVBE(Visual Basic Editor)の画面を表示する方法
  • まずはコードを入力するVBE(Visual Basic Editor)の画面を表示する方法をご紹介します。
    Image in a image block

  • Excelのツールバーのメニューから「開発」タブを選び、「Visual Basic」をクリックします。
    Image in a image block

  • もし開発タブが表示されていない場合は、リボンの上で右クリック、リボンのユーザー設定を選択します。
    Image in a image block

  • リボンのユーザー設定が選択されていることが確認できたら、「開発」にチェックマークを入れてOKボタンをクリックします。
    Image in a image block

  • また、ショートカットキーで起動することも可能です。Excelが開いている状態で、キーボードのAlt + F11を押すことで、直接VBEを起動することができます。
    Image in a image block
    Image in a image block

2. VBE(Visual Basic Editor)にコードを貼り付ける方法
  • 次にコードの貼り付け方法をご紹介します。
    Image in a image block

  • VBE画面の、左のプロジェクトウィンドウで現在開いているExcelファイルの「VBAProject (現在のファイル名)」を右クリックし、「挿入」→「標準モジュール」を選択します。
    Image in a image block
    Image in a image block

  • キーボードショートカットで挿入する場合はAlt ➜ I ➜ Mで挿入できます。
    Image in a image block

  • 標準モジュールを削除する場合は削除するモジュールを選択し、右クリックからモジュールの解放を選択します。
    Image in a image block
    Image in a image block

  • 「いいえ」を選択することでモジュールを削除することができます。
    Image in a image block

  • 本記事でご紹介したChatGPTで作成したVBAコードを貼り付けます。
    Image in a image block

3. VBAコードの実行方法
  • 最後にコードの実行方法をご紹介します。
    Image in a image block

  • コードを貼り付けたら、エディタの上部にある「実行」ボタン(緑の再生ボタン)をクリックするか、F5キーを押して実行できます。
    Image in a image block

1️⃣ はじめに

  • 今回は、ChatGPTのフラッグシップモデルとして2024/5/13より提供が開始されたGPT-4o(オムニ)を利用してスクショした画面からVBAコードを生成する方法を紹介していきます。
📖
GPT-4o(オムニ)とは?
OpenAIが開発した最新のマルチモーダルAIモデルです。
  • テキスト、音声、画像、映像をシームレスに扱い、自然なテンポでのリアルタイム音声会話が可能になりました。特に、視覚と音声の理解力が際立ち、多言語対応や複雑な対話の要素を理解できるようになったと言われています。
  • GPT-4oの「o」は「omni」を意味し、omniとは全て、あまねくという意味を含み、マルチモーダルとなった新たなGPTと、多言語に対応したことを指す意図が推測されます。
  • さらに、既存モデルや競合モデルを上回る性能でありながら、制限はありますが、無料ユーザーも利用可能となっています。
Image in a image block

  • それでは早速、動画で作成方法を確認していきましょう!

2️⃣ GPT-4oの利用方法について

  • GPT-4oは画面左上のプルダウンメニューから選択することが可能です。
Image in a image block

3️⃣ スクリーンショットからVBAコードの作成

1. 列のピボット解除を行うVBAコードの生成
  • まずはこちらのExcelファイルの列のピボット解除を行うVBAを作成します。
    Image in a image block

📖
列のピボット解除とは?

横持ちのデータ縦持ちのデータに変換する作業のことです。

横持ちのデータ : 行と列にそれぞれ異なる項目が配置され、データが横方向に蓄積されていきます。一般的に Excel などによくみられる形で、人が見るには視認性が高いですがデータ分析では扱いづらい形式です。

Image in a image block

縦持ちのデータ : 列に配置された項目に対して、データが縦方向に蓄積されていきます。一般的にリレーショナルデータベース(RDB)の構築やデータ分析の処理は縦持ちのデータが適しているといわれます。

Image in a image block

  • 以前こちらの動画でも、スクリーンショットからVBAコードの生成を行いましたが、今回は画像認識の能力が強化されたGPT-4oを利用して、より手軽にVBAコードを生成する方法をご紹介します。

  • VBAで処理を自動化する際は、予め処理後の形式がわかっていることがほとんどかと思います。処理後のイメージがわかっていることが前提として、変更と変更のスクショを撮影しChatGPTで差分を分析し、コードを生成していきます。
    graph TD;
        A[Excelシートのスクリーンショットを撮影] --> B[処理する前のスクリーンショット]
        A[Excelシートのスクリーンショットを撮影] --> C[処理した後のスクリーンショット]
        B --> D[ChatGPTに処理する前のスクショをアップロード]
        C --> E[ChatGPTに処理した後のスクショをアップロード]
        D --> F[変更内容を分析]
        E --> F[変更内容を分析]
        F --> G[VBAコードを生成]
        G --> H[生成されたVBAコードの実行]
    

  • VBAで処理をしたい変更のExcelデータをスクリーンショットで撮ります。
    Image in a image block

  • 続いて、VBAで処理をしたい変更のExcelデータをスクリーンショットで撮ります。
    Image in a image block

 

  • 2枚のスクリーンショットをChatGPTにアップロードし、プロンプトを記述します。
    🪄
    プロンプトの内容
    • 1枚目から2枚目の状態にするVBAコードを教えてください。
      日本語でお願いいたします。
    Image in a image block

    ※何も指示しない場合、英語で出力されることが多いため日本語で出力する指示をしています。

  • VBAコードが出力されました。
    Image in a image block

  • VBEに貼り付けて、F5キーでコードを実行します。
    Image in a image block

  • 列のピボット解除が完了しました。
Image in a image block

列のピボット解除のVBAコード
Option Explicit

Sub ConvertDataFormat()
    Dim wsSource As Worksheet
    Dim wsDest As Worksheet
    Dim lastRow As Long
    Dim i As Long
    Dim destRow As Long

    ' ソースシートとデスティネーションシートの設定
    Set wsSource = ThisWorkbook.Sheets("修正前")
    Set wsDest = ThisWorkbook.Sheets("修正後")

    ' デスティネーションシートの初期設定
    wsDest.Cells.Clear
    wsDest.Range("A1").Value = "社員"
    wsDest.Range("B1").Value = "カテゴリ"
    wsDest.Range("C1").Value = "値"

    ' 最終行の取得
    lastRow = wsSource.Cells(wsSource.Rows.Count, "A").End(xlUp).Row

    ' データの変換
    destRow = 2
    For i = 2 To lastRow
        wsDest.Cells(destRow, 1).Value = wsSource.Cells(i, 1).Value
        wsDest.Cells(destRow, 2).Value = "データ分析"
        wsDest.Cells(destRow, 3).Value = wsSource.Cells(i, 2).Value
        destRow = destRow + 1

        wsDest.Cells(destRow, 1).Value = wsSource.Cells(i, 1).Value
        wsDest.Cells(destRow, 2).Value = "機械学習"
        wsDest.Cells(destRow, 3).Value = wsSource.Cells(i, 3).Value
        destRow = destRow + 1

        wsDest.Cells(destRow, 1).Value = wsSource.Cells(i, 1).Value
        wsDest.Cells(destRow, 2).Value = "ウェブ開発"
        wsDest.Cells(destRow, 3).Value = wsSource.Cells(i, 4).Value
        destRow = destRow + 1

        wsDest.Cells(destRow, 1).Value = wsSource.Cells(i, 1).Value
        wsDest.Cells(destRow, 2).Value = "データベース"
        wsDest.Cells(destRow, 3).Value = wsSource.Cells(i, 5).Value
        destRow = destRow + 1

        wsDest.Cells(destRow, 1).Value = wsSource.Cells(i, 1).Value
        wsDest.Cells(destRow, 2).Value = "システム設計"
        wsDest.Cells(destRow, 3).Value = wsSource.Cells(i, 6).Value
        destRow = destRow + 1
    Next i

    ' 終了メッセージ
    MsgBox "データの変換が完了しました。"
End Sub

2. 住所を分割するVBAコードの生成
  • 続いてこちらの住所を表示されている通り各列の項目ごとに分割するVBAコードを作成します。
    Image in a image block

  • まず、VBAで処理をしたい変更のExcelデータをスクリーンショットで撮ります。
    Image in a image block

  • 分割される前の状態にするため、B列以降のデータをクリアします。
    Image in a image block

  • 次に、VBAで処理をしたい変更のExcelデータをスクリーンショットで撮ります。
    Image in a image block

  • 2枚のスクリーンショットをChatGPTにアップロードし、プロンプトを記述します。
    🪄
    プロンプトの内容
    • 1枚目から2枚目の形式にする正規表現のVBAコードを教えてください。
      日本語でお願いいたします。
    Image in a image block
    📖
    正規表現とは?

    正規表現とは、文字列のパターンを表現するための記述方法です。正規表現を使用することで、文字列の検索や置換、抽出などを効率的に行うことができます。

    ※何も指示しない場合、英語で出力されることが多いため日本語で出力する指示をしています。

  • VBAコードが出力されました。
    Image in a image block

  • VBEに貼り付けてシート名を変更します。
    Image in a image block

  • F5キーでコードを実行します。
    Image in a image block

  • 分割の処理が完了しました。
    Image in a image block

  • 以上で、GPT-4oによるスクリーンショットの画面からVBAコード生成が完了しました。
    Image in a image block

住所を分割するVBAコード
Option Explicit

Sub SplitAddress()
    Dim ws As Worksheet
    Dim lastRow As Long
    Dim i As Long
    Dim address As String
    Dim pattern As String
    Dim regEx As Object
    Dim matches As Object
    
    ' 処理するシートを設定
    Set ws = ThisWorkbook.Sheets("住所") ' シート名を適宜変更してください
    
    ' 最終行を取得
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
    
    ' 正規表現パターンを設定
    pattern = "^(.{2,3}都|.{2,3}道|.{2,3}府|.{2,3}県)(.{2,3}市|.{2,3}区|.{2,3}町|.{2,3}村)(.+)$"
    
    ' 正規表現オブジェクトを作成
    Set regEx = CreateObject("VBScript.RegExp")
    regEx.Global = False
    regEx.IgnoreCase = False
    regEx.Pattern = pattern
    
    ' 住所を分割してセルに書き込み
    For i = 2 To lastRow
        address = ws.Cells(i, 1).Value
        If regEx.Test(address) Then
            Set matches = regEx.Execute(address)
            ws.Cells(i, 2).Value = matches(0).SubMatches(0) ' 都道府県
            ws.Cells(i, 3).Value = matches(0).SubMatches(1) ' 市区町村
            ws.Cells(i, 4).Value = matches(0).SubMatches(2) ' それ以降
        End If
    Next i
    
    ' メモリを解放
    Set regEx = Nothing
    Set matches = Nothing
End Sub
正規表現の参照設定についての補足
📎
以前公開したこちらの動画では、下記の手順でVBAで正規表現を利用するための設定を行いました。
  1. VBA エディタを開きます。
  2. [ツール] メニューをクリックし、[参照設定] を選択します。
  3. [参照設定] ダイアログボックスが表示されます。[参照] タブをクリックして、一覧から "Microsoft VBScript Regular Expressions 5.5" を選択します。
  4. ライブラリのチェックボックスをオンにして、[OK] ボタンをクリックします。
Image in a image block

今回はCreateObjectを利用し参照設定を不要としています。

CreateObjectを使用する場合(今回のコード)

参照設定は不要です。

Set regEx = CreateObject("VBScript.RegExp")
  • 参照設定をしない場合: 参照設定していないExcelブックでも利用可能ですが、開発中はコード補完が効かず、エラー検出が難しくなります。

Microsoft VBScript Regular Expressions 5.5ライブラリを直接使用する場合

参照設定が必要です。

Set regEx = New RegExp
  • 参照設定をする場合: エラー検出がしやすくなりますが、他の環境で使用する際に参照設定が必要で手間がかかります。

4️⃣ さいごに

  • 最後までお読みいただきありがとうございます!
  • この記事へのご質問やアドバイスがありましたら、ぜひコメントもお待ちしております。
  • またX(Twitter)でもVBA、Pythonに関するアウトプットをしていますので、🔽フォローいただけますと幸いです😆