Site cover image

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

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

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

Featured image of the post

🔄 アップデート情報

2024年5月13日よりChatGPTのフラッグシップモデルとしてGPT-4oの提供が開始されました!
  • GPT-4o(オムニ)ではテキスト、音声、画像、映像をシームレスに扱い、自然なテンポでのリアルタイム音声会話が可能になりました。
  • 特に、視覚と音声の理解力が際立ち、多言語対応や複雑な対話の要素を理解できるようになったと言われています。
  • さらに、既存モデルや競合モデルを上回る性能でありながら、制限はありますが、無料ユーザーも利用可能となっています。
2024年4月1日よりChatGPTがログイン不要で利用できるようになりました!
  • 「まずはお試しください」をクリックすると利用できます。
Image in a image block
Image in a image block
  • 米OpenAIは4月1日、ログインやアカウント作成なしでもChatGPTが利用可能になったと発表しました。
  • これまでは、ChatGPTの利用にはアカウント作成が必須でしたが、今回の更新でアカウントを作成せずにChatGPTを試せるようになりました。ただし、モデルはGPT3.5、過去のチャット履歴の保存や確認、チャットの共有、音声対話やカスタム指示などの追加機能は利用できないようです。
  • 早速試してみましたが、GPT3.5モデルでも十分な精度だと感じました!
試しにマクロの記録をリファクタリングしてみました!
Image in a image block
Image in a image block
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 Plusの新機能として2023/9/25より提供が開始されたGPT-4Vを利用してスクショした画面からVBAコードを生成する方法を紹介していきます。
📖
GPT-4Vとは?

OpenAIが開発した最新のマルチモーダルAIモデルです。GPT-4Vの「V」は「ビジョン(Vision)」を意味し、テキストだけでなく画像も理解し、高度な認識や生成タスクを行えます。従来のGPT-4に画像解析と音声出力機能が追加され、テキスト、画像、音声の入力・出力が可能で、様々な活用が期待されています。

Image in a image block

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

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

  • GPT-4Vは現在は有料版であるChatGPT Plusのユーザーに提供されています。GPT-4のボタンからDefaultを選択して使用します。
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で処理をしたい変更前のExcelデータをスクリーンショットで撮り、スクリーンショットをアップロードし、プロンプトを記述します。
Image in a image block

🪄
プロンプトの内容
  • 添付のExcel画像の横持ちデータを縦持ちデータに、ピボット解除を行うための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 ConvertToVerticalData()
    Dim LastRow As Long
    Dim LastCol As Integer
    Dim OutputRow As Long
    Dim i As Long, j As Integer
    Dim ws As Worksheet
    Dim wsOutput As Worksheet

    ' 元のデータが存在するワークシートを設定
    Set ws = ThisWorkbook.Sheets("Sheet1") 'シート名を必要に応じて変更してください
    ' 出力用のワークシートを設定
    Set wsOutput = ThisWorkbook.Sheets.Add
    wsOutput.Name = "Output"

    ' 元データの最終行と最終列を取得
    LastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
    LastCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column

    ' 出力データのヘッダーを設定
    wsOutput.Cells(1, 1).Value = ws.Cells(1, 1).Value
    wsOutput.Cells(1, 2).Value = "カテゴリ"
    wsOutput.Cells(1, 3).Value = "値"

    ' 出力データの最初の行を設定
    OutputRow = 2

    ' 元データをループして出力データを作成
    For i = 2 To LastRow
        For j = 2 To LastCol
            wsOutput.Cells(OutputRow, 1).Value = ws.Cells(i, 1).Value
            wsOutput.Cells(OutputRow, 2).Value = ws.Cells(1, j).Value
            wsOutput.Cells(OutputRow, 3).Value = ws.Cells(i, j).Value
            OutputRow = OutputRow + 1
        Next j
    Next i

End Sub

2. 日付の表記ゆれを修正するVBAコードの生成
  • 続いて日付の表記ゆれのExcelデータを修正するVBAコードを作成します。
📖
日付の表記ゆれとは?

同じ日付を異なるフォーマットやスタイルで記述することを指します。日付の表記ゆれは、文書の整合性を低下させたり、データの解析や処理を困難にする原因となることがあります

Image in a image block

  • こちらのExcelデータを使用します。
Image in a image block

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

  • スクリーンショットをアップロードし、プロンプトを記述します。
🪄
プロンプトの内容
添付のExcel画像のA列の表記ゆれを修正し、B列に出力するためのVBAコードを記述してください。
Image in a image block

  • VBAコードが出力されていきます。
Image in a image block

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

  • B2セルだけうまく修正ができていないようです。
Image in a image block

  • ChatGPTに戻り再度修正の指示をします。
Image in a image block

  • 修正後のコードが出力されました。VBEに貼り付けて再度コードを実行します。
Image in a image block

  • 表記ゆれの修正が完了しました。
Image in a image block

📖
補足

日付の表記ゆれの修正で1回目「B2セル」が「1899/12/30」に変換されてしまい上手くいきませんでした。なぜ失敗してしまったのか、またどのような修正がされたのかを下記に示します。

① なぜ「1899/12/30」に変換されてしまったのか?

  • 1回目のコードは、「年月日」を含んだ文字列の「年」、「月」の文字を「/」に置き換えるだけで「日」という文字列が残ってしまうものとなっていました。
  • そのため「A2セル」の値は「日」という文字列が変換されず、「2023/10/7日」という文字列でDateValue関数の引数に渡されたため日付として認識されませんでした。
  • DateValue関数が日付として認識できない文字列を変換しようとすると「0」という値が返されます。そして、Excelでは、日付は内部的に連続する整数として表現されます。例えば「1900/1/1」は「1」、「1900/1/2」は「2」というように表されるため、今回の「0」は「1899/12/30」と表され、「B2セル」には「1899/12/30」と出力されることとなりました。

② どのような修正がされたのか?

  • 2回目のコードでは、まず「年」、「月」が含まれる文字列かどうかをチェックしています。もし含まれていれば、それらの文字を「/」に置き換える処理を行っています。
  • 次に、Split関数を使用して変換後の日付文字列を「/」で分割し、その結果を配列Arrに格納しています。
  • 最後にUBound(Arr)関数を使用して、配列に3つの要素(「年」、「月」、「日」)があるかどうかを確認しています。もし3つの要素があれば、日付の部分から日という文字を取り除いています。

上記のような変更を加えることで、「年」、「月」、「日」の文字を正しく取り扱い、日付の表記ゆれを正確に修正することができるようになりました。

日付の表記ゆれを修正するVBAコード
Option Explicit
Sub CorrectDateFormat()

    Dim LastRow As Long
    Dim i As Long
    Dim DateStr As String
    Dim CorrectedDate As Date
    Dim Arr() As String

    ' シート1をアクティブにします (必要に応じてシート名を変更してください)
    Sheets("Sheet1").Activate

    ' A列の最後の行を取得
    LastRow = Cells(Rows.Count, 1).End(xlUp).Row

    For i = 2 To LastRow ' 1行目はヘッダーなので、2行目から処理開始
        DateStr = Cells(i, 1).Value
        
        ' 年月日の文字を含む場合の変換
        If InStr(DateStr, "年") > 0 And InStr(DateStr, "月") > 0 Then
            DateStr = Replace(Replace(DateStr, "年", "/"), "月", "/")
            Arr = Split(DateStr, "/")
            If UBound(Arr) = 2 Then
                DateStr = Arr(0) & "/" & Arr(1) & "/" & Left(Arr(2), Len(Arr(2)) - 1) ' 日の後の「日」文字を除去
            End If
        End If
        
        On Error Resume Next
        CorrectedDate = DateValue(DateStr)
        On Error GoTo 0

        ' 日付が正しく変換された場合
        If IsDate(CorrectedDate) Then
            Cells(i, 2).Value = Format(CorrectedDate, "yyyy/mm/dd")
        Else
            ' 日付が変換できなかった場合、元の値をそのままB列にコピー
            Cells(i, 2).Value = DateStr
        End If
    Next i

End Sub

4️⃣ さいごに

  • 最後までお読みいただきありがとうございます!
  • スクショからVBAコード生成はサクッとマクロを作るには本当に便利な機能です!ぜひ皆様もご活用ください。
  • この記事へのご質問やアドバイスがありましたら、ぜひコメントもお待ちしております。
  • またX(Twitter)でもVBA、Pythonに関するアウトプットをしていますので、🔽フォローいただけますと幸いです😆