Site cover image

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

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

Post title iconChatGPT でコード変換!VBAコードをPythonコードに変換します!

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とGPT-4oの出力精度の違いを漫才ネタで比較してみました!

Post title icon in a page linkArrow icon of a page linkChatGPTの最新モデルOpenAI o1で漫才ネタを作ってみた!

2024年5月13日よりChatGPTのGPT-4oモデルの提供が開始されました!
  • GPT-4o(オムニ)ではテキスト、音声、画像、映像をシームレスに扱い、自然なテンポでのリアルタイム音声会話が可能になりました。
  • 特に、視覚と音声の理解力が際立ち、多言語対応や複雑な対話の要素を理解できるようになったと言われています。
  • さらに、既存モデルや競合モデルを上回る性能でありながら、制限はありますが、無料ユーザーも利用可能となっています。
Image in a image block

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を使用してVBAコードをPythonコードに変換する方法を解説していきます。
  • それでは早速、動画で生成方法を確認していきましょう!

2️⃣ VBAコードの確認

📖
ChatGPTとは?

OpenAIという人工知能研究所が開発した自然言語処理の人工知能モデルです。テキストで会話が可能なAIで、ユーザーと自然な会話形式で質問の受け答えができるのが特徴です。様々な分野の質問に対応し、プログラミングのコードを生成・変換することも可能です。

Image in a image block

  • 使用するコードは、以前の動画で紹介した総務省のデータ表記方法のチェック項目に従って作成したものをベースに実装していきます。総務省の統計表における機械判読可能なデータ作成に関する表記方法はこちらからダウンロード可能です。

  • 左上が修正前シートです。左下の修正後シートに転記処理を行います。こちらは同じExcelブックの別シートを整列表示させています。

    ※よく見たらVBAの修正前シートの「円」や「▲」が最初から修正されている…ChatGPTの凄さに感動しすぎてよく確認せずにアップしてしまいました…すみません^^;(コードの内容は正しく動くものです)

Image in a image block

  • 前回の動画を公開後にTwitterのフォロワー様よりアドバイスをいただきました。どうもありがとうございます!いただいたアドバイスをもとに一部コードに修正を加えます。
Image in a image block

Icon in a callout block
VBAコードの修正
  • 前回のコードではセル範囲を配列に格納していたのにもかかわらず、改めてWorksheetからデータを取得していました。
  • 今回は、すべて格納した配列内のデータで文字列操作するように修正を行います。
修正前
Option Explicit

Sub example_3()

    Dim ws_before As Worksheet: Set ws_before = Sheets("修正前3")
    Dim ws_after As Worksheet: Set ws_after = Sheets("修正後3")
    
    With ws_before
    
        Dim arr As Variant: arr = .Range("C4:E7").Value
        Dim r As Long
        
        For r = 4 To 7
        
            arr(r - 3, 1) = Replace(.Cells(r, 3).Value, "円", "")
            arr(r - 3, 2) = Replace(.Cells(r, 4).Value, "▲", "-")
            arr(r - 3, 3) = Replace(.Cells(r, 5).Value, ",", "")
            
        Next
        
        ws_after.Range("C4").Resize(UBound(arr, 1), UBound(arr, 2)) = arr
    
    End With

End Sub

修正後
Option Explicit

Sub example_3()

    Dim ws_before As Worksheet: Set ws_before = Sheets("修正前3")
    Dim ws_after As Worksheet: Set ws_after = Sheets("修正後3")
    
    With ws_before
    
        Dim arr As Variant: arr = .Range("C4:E7").Value
        Dim i As Long
        
        For i = LBound(arr) To UBound(arr)
        
            arr(i, 1) = Replace(arr(i, 1).Value, "円", "")
            arr(i, 2) = Replace(arr(i, 2).Value, "▲", "-")
            arr(i, 3) = Replace(arr(i, 3).Value, ",", "")
            
        Next
        
        ws_after.Range("C4").Resize(UBound(arr, 1), UBound(arr, 2)) = arr
    
    End With

End Sub

修正箇所

  • 配列内をループするためのカウンター変数iを宣言します。
  • For文の範囲は配列の下限から上限までとします。
  • 配列の下限はLbound関数、上限はUbound関数で記述できます。
  • イコールの右側で配列内の各値の文字列を置き換えて左側の配列の同じ位置に再代入しています。

  • F5キーで修正後のコードを実行します
Image in a image block

  • 無事修正が完了しましたので、この修正後のVBAコードをChatGPTを使ってPythonコードに変換していきます。

修正後のVBAコード
Option Explicit

Sub example_3()

    Dim ws_before As Worksheet: Set ws_before = Sheets("修正前3")
    Dim ws_after As Worksheet: Set ws_after = Sheets("修正後3")
    
    With ws_before
    
        Dim arr As Variant: arr = .Range("C4:E7").Value
        Dim i As Long
        
        For i = LBound(arr) To UBound(arr)
        
            arr(i, 1) = Replace(arr(i, 1).Value, "円", "")
            arr(i, 2) = Replace(arr(i, 2).Value, "▲", "-")
            arr(i, 3) = Replace(arr(i, 3).Value, ",", "")
            
        Next
        
        ws_after.Range("C4").Resize(UBound(arr, 1), UBound(arr, 2)) = arr
    
    End With

End Sub

3️⃣ Pythonコードへの変換

  • ChatGPTにVBAからPythonへの変換する指示とコードを貼り付けていきます。
🪄
「以下のVBAコードをPythonコードに変換してください」
Option Explicit

Sub example_3()

    Dim ws_before As Worksheet: Set ws_before = Sheets("修正前3")
    Dim ws_after As Worksheet: Set ws_after = Sheets("修正後3")
    
    With ws_before
    
        Dim arr As Variant: arr = .Range("C4:E7").Value
        Dim i As Long
        
        For i = LBound(arr) To UBound(arr)
        
            arr(i, 1) = Replace(arr(i, 1).Value, "円", "")
            arr(i, 2) = Replace(arr(i, 2).Value, "▲", "-")
            arr(i, 3) = Replace(arr(i, 3).Value, ",", "")
            
        Next
        
        ws_after.Range("C4").Resize(UBound(arr, 1), UBound(arr, 2)) = arr
    
    End With

End Sub

  • Pythonのopenpyxlで書かれたコードが生成されました。
Image in a image block

  • ChatGPTでは回答に対して、さらに深掘りすることや、求める回答になるまで対話を重ねることもできます。
🪄
「上記のコードで総務省.xlsxに読み込み、書き込みする方法で記述してください」
Image in a image block

  • コードが出力されました。元データに数値が入力されているセルもあり、数値に対してreplaceメソッドは使用できないため一度str型にキャストしてから処理をするように指示をします。
Image in a image block

  • 再度ChatGPTにプロンプトを記述します。
🪄
「セルの値を一度文字列にしてから置換してください。
Image in a image block

  • 置換後に処理を行い、ワークシートに出力する際は数値型にするように指示します。
🪄
「ワークシートに出力する際に数値型に変換してください」
Image in a image block

  • コードの変換が完了しました。
Image in a image block

生成されたPythonコード
import openpyxl

def example_3():
    wb = openpyxl.load_workbook('総務省.xlsx')
    ws_before = wb['修正前3']
    ws_after = wb['修正後3']
    
    arr = []
    for row in ws_before['C4:E7']:
        row_values = [cell.value for cell in row]
        arr.append(row_values)
        
    for i in range(len(arr)):
        for j in range(len(arr[0])):
            arr[i][j] = str(arr[i][j])
            arr[i][j] = arr[i][j].replace("円", "")
            arr[i][j] = arr[i][j].replace("▲", "-")
            arr[i][j] = arr[i][j].replace(",", "")
            arr[i][j] = float(arr[i][j])
        
    for i in range(len(arr)):
        for j in range(len(arr[0])):
            ws_after.cell(row=i+4, column=j+3).value = arr[i][j]
    wb.save('総務省.xlsx')

4️⃣ Pythonコードの実行

  • Jupyter Notebookに貼り付けてコードを実行します。
📖
Jupyter Notebookとは?
ウェブブラウザ上で動作するインタラクティブなコーディング環境です。コードの実行、データの分析、視覚化、文書化が一つの場所で行えます。主にデータサイエンスや学術研究で使用されます。
Image in a image block

  • Jupyter NotebookにPythonコードを貼り付けました。
Image in a image block

  • 生成されたコードは関数でまとめられていますので、example_3()関数の後ろに関数名()を記述し、実行できるようにします。
Image in a image block

  • Ctrl + Enterで実行した結果がこちらになります。
Image in a image block

  • 以上でChatGPTによるPythonコードへの変換処理が完了しました。
最終的なPythonコード
import openpyxl

def example_3():
    wb = openpyxl.load_workbook('総務省.xlsx')
    ws_before = wb['修正前3']
    ws_after = wb['修正後3']
    
    arr = []
    for row in ws_before['C4:E7']:
        row_values = [cell.value for cell in row]
        arr.append(row_values)
        
    for i in range(len(arr)):
        for j in range(len(arr[0])):
            arr[i][j] = str(arr[i][j])
            arr[i][j] = arr[i][j].replace("円", "")
            arr[i][j] = arr[i][j].replace("▲", "-")
            arr[i][j] = arr[i][j].replace(",", "")
            arr[i][j] = float(arr[i][j])
        
    for i in range(len(arr)):
        for j in range(len(arr[0])):
            ws_after.cell(row=i+4, column=j+3).value = arr[i][j]
    wb.save('総務省.xlsx')

example_3()

5️⃣ さいごに

  • 最後までお読みいただきありがとうございます!
  • VBAコードのPythonコード変換は業務の環境を見直しする際にも一役買ってくれるでしょう!ぜひ皆様もご活用ください!
  • この記事へのご質問やアドバイスがありましたら、ぜひコメントもお待ちしております。
  • またTwitterでもVBA、Pythonに関するアウトプットをしていますので、概要欄からフォローいただけますと幸いです。