Chat GPT × Excel VBA

 

やっと長く続けていた「画像編集」の勉強がひと段落したので、これからは最近すごく気になっている「Chat GPT」を使っていろいろやっていきたいと思っていいます。

 

まずは私自身がある程度認知のある「Excel VBA」を復習も兼ねて「Chat GPT」を使ってプログラムを作成していきたいと思います。

 

 

 

 ファイル操作 1(ファイル、フォルダの作成)

 

今回は「ファイル操作 1」として、ファイルやフォルダの作成をしていきたいと思います。

 

  ファイルの作成

 

ファイル作成のプログラムを作成する

 

①デスクトップにフォルダーを作成。

※作成したファイルを保存する場所を作成。他の任意の場所でもOKです。

 

 

②保存先のパスを取得する。

作成したファイルを、①で作成したフォルダに保存しますが、VBAでも保存先の指定が必要なので、フォルダのパスを取得します。

 

・フォルダアイコンの上で右クリック⇒「パスのコピー」をクリック。

これで、クリップボードにパスが保存されます。

 

 

③VBAを実行するエクセルファイルを作成する。

 

※ファイルを保存する場合は拡張子を「"Excelマクロ有効ブック(*.xlsm)"」で保存してください。

 

下のように

・1行目に作成したファイルを保存するパスを貼り付け。

  先ほど「パスのコピー」したので、そのままセルB1に貼り付けでOKです。

・作成するファイル名をセルA4からA8に記入しました。

 

 

④ChatGPTを実行する。

今回は下のように

 

「エクセルVBAで下のプログラムを作成してください。

セルB1に記載されたパスに、セルA4からA8までの名前のエクセルファイルを作成してください」

 

と依頼。

 

 

・すると下のようにウインドウでVBAプログラムが作成され、その下に注意点等も教えてくれました。

 

また、このプログラムをコピペする場合は、ウインドウの右上に「Copy code」と記載されているので、ここをクリックするとプログラムが簡単にコピーできます。

 

 

⑤VBE(VisualBasicEditor)にChatGPTで作成してもらったプログラムをコピペする。

 

・まず、新しいエクセルファイルなので、

メニューバー⇒「挿入」⇒「標準モジュール」をクリックして「標準モジュール」を作成。

 

 

・作成した標準モジュールに「Copy code」でコピーしたプログラムを貼り付ける。

 

 

⑥何も考えずにそのまま「実行」。

実行はVBE上で、三角の実行アイコンで実施しました。

 

 

「Excelファイルが保存されました」のメッセージが表示されました。

また、フォルダ内を見るときちんとエクセルファイルが作成されました。

 

 

 

A列に記載した最終行を自動取得する

①ChatGPTに追加でファイル名の最終行を自動取得してもらうように依頼。

 

先ほどのプログラムではファイル名を「A4からA8に記載された名前」と指定しましたが、次は範囲を指定せずに「A4からA列の文字が記入されている最終行を取得して・・・」と追加で依頼。

 

※ChatGPTでは会話中の内容であれば、少し前の内容についても追加でチャットすることができます。

 

先ほどのプログラムに今回依頼した「最終行を取得」という項目を追加したプログラムが作成されました。

 

 

【実際のプログラム】

 

Sub CreateExcelFiles()
    Dim path As String
    Dim name As String
    Dim lastRow As Long
    Dim i As Long
    
    '保存先のパスを取得
    path = Range("B1").Value
    
    '最終行を取得
    lastRow = Cells(Rows.Count, "A").End(xlUp).Row

👆ここに「最終行の取得」のプログラムが追加されました。
    
    '各ファイルを作成
    For i = 4 To lastRow
        name = Range("A" & i).Value & ".xlsx"
        ThisWorkbook.SaveCopyAs path & "\" & name
    Next i
    
    MsgBox "Excelファイルが保存されました。"
End Sub

 

②プログラムを実行。

・先ほどと同じようにVBEにプログラムをコピペ。

※フォルダ内に先ほど作成したファイルが残っているので、削除しておきました。

 

・VBAを実行。

※先ほどはセルA8まででしたが、A10まで名前を増やして実行。

 

 

問題なく、フォルダ内にセルA10「見積書7」のファイルまで作成されました。

 

 

 

空きセル時のスキップを追加

①ファイル名のセルに空白セルがある場合を確認。

 

上のプログラムを見ると「最終行の取得」コマンドが、

    lastRow = Cells(Rows.Count, "A").End(xlUp).Row

なので、

A列の最大行から"xlup"で上に最初に文字が入力されたセルを「最終行」としています。

なので、途中のセル(A8)を空白にしてVBAを実行してみました。

 

 

下のように空白セルはファイル名無しで「.xlsx」だけでファイル保存されてしまいました。

 

 

②ChatGPTに追加で依頼。

今度はChatGPTに「ファイル名が空白の場合はスキップ」するように依頼。

 

 

またまた、同じプログラムに下の「空白の場合はスキップ」の内容が追加されたプログラムが出力されました。

 

【追加部分を抜粋】


    '各ファイルを作成
    For i = 4 To lastRow
        name = Range("A" & i).Value & ".xlsx"
        If name <> ".xlsx" Then

            ThisWorkbook.SaveCopyAs path & "\" & name
        End If
    Next i


👆赤字の部分で".xlsx"になっているものは次の処理がされないようにif文が追加されてます。

 

実行結果は下のようになり、空白セルがスキップされました。

 


 

パスが存在しない(間違っているとき)の処理を追加

 

①パス名を間違えた場合を想定する。

 

次は、パスが間違っている時(フォルダーが無いとき等)にエラーが出ないように依頼しました。

 

先ほどのプログラムで、パス名を間違えていると下のようにVBAのエラーが発生します。

※パスのフォルダ名の「\ChatGPT_ExcelVBA練習フォルダ」で、最後の「フォルダ」を「フォルダ」と最後に伸ばし棒「-」を追加しました。

 

下のようにVBAのエラーが表示されました。

 

 

②もう一度ChatGPTに「パスが無いときなどのエラーが発生した時のプログラムを追加してください」と依頼。

 

 

③やはり、先ほどまでと同じプログラムを使用して、下のプログラムが追加されました。

 

【追加部分を抜粋】

   
    'パスが存在しない場合はエラー処理
    If Dir(path, vbDirectory) = "" Then

👆パスのフォルダを取得しようとしたが ""で取得できなかった時に下の処理を実行。


        MsgBox "指定されたパスが存在しません。"
        Exit Sub
    End If

 

これで、パスが取得できなかった時に"指定されたパスが存在しません"というメッセージが出て、「End Sub」で処理終了になります。

 

 

きちんとメッセージが表示されました。

 

 

エラー処理とクレンジングのプログラムを追加してもらう

上では個別で、空白セルやパスの間違い時の対応を依頼しましたが、今度はまとめて

「エラー対応とクレンジングのプログラムを追加してください」

と依頼しました。

 

 

【実際のプログラム】

 

Sub CreateFiles()
    Dim path As String
    Dim fileName As String
    Dim lastRow As Long
    Dim i As Long
    
    '保存先のパスを取得
    path = Trim(Range("B1").Value)
    
    'パスが存在しない場合はエラー処理
    If Len(path) = 0 Then
        MsgBox "保存先のパスが入力されていません。"

        Exit Sub
    ElseIf Dir(path, vbDirectory) = "" Then
        MsgBox "指定されたパスが存在しません。"
        Exit Sub
    End If
    
    '最終行を取得
    lastRow = Cells(Rows.Count, "A").End(xlUp).Row
    
    '各ファイルを作成
    For i = 4 To lastRow
        fileName = Trim(Range("A" & i).Value)
        If Len(fileName) > 0 Then
            fileName = Replace(fileName, "/", "")
            fileName = Replace(fileName, "\", "")
            fileName = Replace(fileName, ":", "")
            fileName = Replace(fileName, "*", "")
            fileName = Replace(fileName, "?", "")
            fileName = Replace(fileName, "<", "")
            fileName = Replace(fileName, ">", "")
            fileName = Replace(fileName, "|", "")

            
            On Error Resume Next
            ThisWorkbook.SaveCopyAs path & "\" & fileName & ".xlsx"
            If Err.Number <> 0 Then
                MsgBox "ファイル " & fileName & " の作成に失敗しました。"
            End If
            On Error GoTo 0
        End If
    Next i
    
    MsgBox "ファイルが作成されました。"
End Sub

 

 

青文字が変更された箇所ですが、下の内容が反映されています。

 

・パスが未入力時のメッセージ追加。

・ファイル名に使用不可文字があった場合はその文字を削除。

・「空白セルのスキップ」については、ファイル名の長さが「0(空白)」以外の時だけ処理を続けるように変更。

・あと「パス名」と「ファイル名」の変数入力に「Trim」を追加して名前の先頭と末尾に半角スペースがあった場合は削除するように変更されてます。

 

 

 

  フォルダの作成

 

今度は、エクセルファイルではなく、フォルダを作成できるかを確認しました。

 

①下のようにエクセルのセルC4からC8にフォルダ名を追記しました。

 

 

②ChatGPTに依頼する。

 

ChatGPTにはその前の会話も反映されるため、最初から依頼するのではなく、今までのチャットに続けて下のように

 

「同じように今度はセルC4からC列に記載された名前でフォルダを作成してください」

 

と依頼しました。

 

※「同じように」ということで、パス名を記載したセルの位置や、最終行などの言葉は入れていません。

 

 

③VBAをコピペ。

先ほどファイル作成で作成したVBA(プロシージャ)の下に今回のプログラムをコピペしました。

 

※「Sub ****()」 のプロシージャー名から「End Sub」まで記載してくれているので そのままコピペするだけで下のように、ファイル作成プロシージャとフォルダ作成プロシージャが分けられます。

 

 

【実際のプログラム】

 

Sub CreateFolders()
    Dim path As String
    Dim folderName As String
    Dim lastRow As Long
    Dim i As Long
    
    '保存先のパスを取得
    path = Range("B1").Value
    
    'パスが存在しない場合はエラー処理
    If Dir(path, vbDirectory) = "" Then
        MsgBox "指定されたパスが存在しません。"
        Exit Sub
    End If
    
    '最終行を取得
    lastRow = Cells(Rows.Count, "C").End(xlUp).Row
    
    '各フォルダを作成
    For i = 4 To lastRow
        folderName = Range("C" & i).Value
        If folderName <> "" Then    👈ここで空白セルを判断


            On Error Resume Next     👈ここでエラーを無効に設定


            MkDir path & "\" & folderName 

          👆フォルダ名が空白だとエラー発生・・・でも無視して次の行へ


            If Err.Number <> 0 Then    👈エラー発生時の処理追加
                MsgBox "フォルダ " & folderName & " の作成に失敗しました。"
            End If


            On Error GoTo 0    👈エラーを有効設定に戻す
        End If
    Next i
    
    MsgBox "フォルダが作成されました。"
End Sub

 

上のように、

1.「最終行の取得」

 

2.「空白セルのスキップ」 というか、「エラー無効設定」⇒「フォルダ名が無いためエラー発生」⇒「青字部分 でエラー処理」というプログラムのようです。

 

3.「パス名の間違い」

 

の全てが対応されています

 

④プログラム実行。

 

 

「フォルダが作成されました」のメッセージが表示され、下のようにフォルダも問題なく作成できました。

 

 

 

 

エラー処理とクレンジングのプログラムを追加してもらう

こちらも同様に

「エラー処理とクレンジングのプラグラム」

も追加してもらうように依頼しました。

 

【実際のプログラム】

 

Sub CreateFolders()
    Dim path As String
    Dim folderName As String
    Dim lastRow As Long
    Dim i As Long
    
    '保存先のパスを取得
    path = Trim(Range("B1").Value)
    
    'パスが存在しない場合はエラー処理
    If Len(path) = 0 Then
        MsgBox "保存先のパスが入力されていません。"
        Exit Sub

    ElseIf Dir(path, vbDirectory) = "" Then
        MsgBox "指定されたパスが存在しません。"
        Exit Sub
    End If
    
    '最終行を取得
    lastRow = Cells(Rows.Count, "C").End(xlUp).Row
    
    '各フォルダを作成
    For i = 4 To lastRow
        folderName = Trim(Range("C" & i).Value)
        If Len(folderName) > 0 Then
            folderName = Replace(folderName, "/", "")
            folderName = Replace(folderName, "\", "")
            folderName = Replace(folderName, ":", "")
            folderName = Replace(folderName, "*", "")
            folderName = Replace(folderName, "?", "")
            folderName = Replace(folderName, "<", "")
            folderName = Replace(folderName, ">", "")
            folderName = Replace(folderName, "|", "")

            
            On Error Resume Next
            MkDir path & "\" & folderName
            If Err.Number <> 0 Then
                MsgBox "フォルダ " & folderName & " の作成に失敗しました。"
            End If
            On Error GoTo 0
        End If
    Next i
    
    MsgBox "フォルダが作成されました。"
End Sub
 

 

こちらも青文字が変更された箇所ですが、下の内容が反映されています。

・パスが未入力時のメッセージ追加

・ファイル名に使用不可文字があった場合はその文字を削除

・あと「パス名」と「ファイル名」の変数入力に「Trim」を追加して名前の先頭と末尾に半角スペースがあった場合は削除するように変更されてます。

 

 

マクロ付エクセルファイル保存時の注意点

 

注意点として、せっかく上記で作成したVBAを含むエクセルファイルを保存する場合は、必ず拡張子を"Excelマクロ有効ブック(*.xlsm)"で保存しないとプログラムが消えてしまいますので要注意です。

 

作成したVBA付きエクセルファイルは、拡張子を"Excelマクロ有効ブック(*.xlsm)"で保存しないとプログラムが消えるのでご注意ください。

 

 

あとがき

 

今回は、

「Chat GPT×エクセルVBA _ファイル操作 1(ファイル、フォルダの作成)」

として、ChatGPTでファイル作成、フォルダ作成のプログラムを作成しました。

 

結果として、依頼内容をきちんと伝えれば、問題なくVBAプログラムが作成できました。

 

今回のファイル作成は空のエクセルファイルなので、

次は「ファイル操作 2」として

 

・ダミーの在庫表フォームを作成

・月度ごとにファイル名を付けて保存する

 

ような処理ができるか試していきたいと思います。