Microsoft Copilotを使用したCSV生成マクロ作成

## はじめに
皆さんこんにちは。川副です。

最近対応した業務の一つとして、ユーザーから送られてきた申請書を確認し、対象のデータをまとめたCSVファイルを作成するという業務がありました。

その際に、Microsoft Copilotを活用してCSVファイルを生成するためのマクロを作成することになったため、どのように活用したのかを解説していきます。

## Microsoft Copilotとは
Microsoft Copilotは、ブラウザやスマホから利用することができるMicrosoftのAIアシスタントです。
生成AIによる会話・検索・コンテンツ制作が可能で、検索欄に質問を書き込むだけで利用することができます。
無料版と有料版があるのですが、今回は無料版を使用しました。

## 今回対応した作業
今回の作業対象となる申請書のイメージ画像が、下記になります。
※本記事のために作成した仮の申請書です。
![申請書.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629100/316d7dd9-8ccb-cba8-a0fb-1a2c34694e57.png)

「●」はそのユーザがメインで使うサイトを表しているため、
対象サイトに「●」と記載されている箇所が存在する場合、
CSVファイルには「ユーザID,MAINSITE」と表示する必要があります。

「〇」はそのユーザがサブで使うサイトを表しているため、
対象サイトに「〇」と記載されている箇所が存在する場合、
CSVファイルには「ユーザID,SUBSITE」と表示する必要があります。

それでは、さっそくCopilotにお願いしてみましょう。

この作業では、作ってもらったマクロに後からどんどん処理を足していってもらうことも可能なので、始めから完璧に作って貰おうとはせずに、最初はおおまかな要件だけを伝えましょう。

まず最初に、下記を伝えてみます。
①下記条件を満たすマクロを作成してほしいこと。
②ユーザID(B列)が記載されている時に動くこと。
③同じ行のC列を見て、「●」が記載されている場合、「B列の値,MAINSITE」と出力すること。
④同じ行のC列を見て、「〇」が記載されている場合、「B列の値,SUBSITE」と出力すること。
⑤上記の出力結果は、CSVファイルを新規作成してそこに出力すること。

![応答1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629100/1d956393-f8db-37f8-3b57-9832c8cf1ef1.png)
すると、このようなマクロが作成されました。

    ' アクティブなワークシートを設定
    Set ws = ActiveSheet
    
    ' 最終行を取得
    lastRow = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row
    
    ' 出力データ用の文字列を初期化
    outputData = ""
    
    ' 最終行までループ
    For i = 1 To lastRow
        If ws.Cells(i, 2).Value <> "" Then ' B列に値がある場合
            userID = ws.Cells(i, 2).Value
            If ws.Cells(i, 3).Value = "●" Then
                siteType = "MAINSITE"
                outputData = outputData & userID & "," & siteType & vbCrLf
            ElseIf ws.Cells(i, 3).Value = "〇" Then
                siteType = "SUBSITE"
                outputData = outputData & userID & "," & siteType & vbCrLf
            End If
        End If
    Next i
    
    ' CSVファイルを書き出すパスを指定
    filePath = Application.DefaultFilePath & "\output.csv"
    
    ' ファイルシステムオブジェクトを作成してCSVを書き出し
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set aFile = fs.CreateTextFile(filePath, True)
    aFile.WriteLine outputData
    aFile.Close
    
    ' 完了メッセージを表示
    MsgBox "データが " & filePath & " に書き出されました。", vbInformation


さっそく答えてくれたので、申請書でこのマクロを動かしてみます。

![マクロ1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629100/a8f1792a-1bf2-be9b-c53b-3f6cf004b8f0.png)
実行することで、下記「output.csv」が作成されました。
![CSV1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629100/28affe88-2cbe-2176-14ba-be2158e424af.png)

最初はC列の日本のみ対象にしてみましたが、うまく作成されています。

続けて、D列のアメリカとE列の中国も対象にしてもらいましょう。
続けてチャットすれば答えてくれます。

![応答2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629100/98c07583-99c3-a94c-2dc3-8ca869f6457e.png)
このように、かなり雑に依頼しても作ってくれます。
    
    ' アクティブなワークシートを設定
    Set ws = ActiveSheet
    
    ' 最終行を取得
    lastRow = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row
    
    ' 出力データ用の文字列を初期化
    outputData = ""
    
    ' 最終行までループ
    For i = 1 To lastRow
        If ws.Cells(i, 2).Value <> "" Then ' B列に値がある場合
            userID = ws.Cells(i, 2).Value
            ' C列の値を確認
            If ws.Cells(i, 3).Value = "●" Then
                siteType = "MAINSITE"
                outputData = outputData & userID & "," & siteType & vbCrLf
            ElseIf ws.Cells(i, 3).Value = "〇" Then
                siteType = "SUBSITE"
                outputData = outputData & userID & "," & siteType & vbCrLf
            End If
            
            ' D列の値を確認
            If ws.Cells(i, 4).Value = "●" Then
                siteType = "MAINSITE"
                outputData = outputData & userID & "," & siteType & vbCrLf
            ElseIf ws.Cells(i, 4).Value = "〇" Then
                siteType = "SUBSITE"
                outputData = outputData & userID & "," & siteType & vbCrLf
            End If
            
            ' E列の値を確認
            If ws.Cells(i, 5).Value = "●" Then
                siteType = "MAINSITE"
                outputData = outputData & userID & "," & siteType & vbCrLf
            ElseIf ws.Cells(i, 5).Value = "〇" Then
                siteType = "SUBSITE"
                outputData = outputData & userID & "," & siteType & vbCrLf
            End If
        End If
    Next i
    
    ' CSVファイルを書き出すパスを指定
    filePath = Application.DefaultFilePath & "\output.csv"
    
    ' ファイルシステムオブジェクトを作成してCSVを書き出し
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set aFile = fs.CreateTextFile(filePath, True)
    aFile.WriteLine outputData
    aFile.Close
    
    ' 完了メッセージを表示
    MsgBox "データが " & filePath & " に書き出されました。", vbInformation

このマクロを動かしてみたところ、下記が作成されました。

![CSV2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629100/8cfd6391-b43f-208c-5ef5-64a293499970.png)
申請書には●と〇が合計21件存在していましたが、全て出力されています。
これで対応完了となります。

## おわりに
CSVファイルの出力先や、出力するCSVファイルの名前などもCopilotにお願いすれば要望に合わせたマクロを生成してくれます。もしCopilotを使用する際は参考にしてみてください。

実際の作業では、申請書の項目はもっと多く、出力しなければならないCSVの種類も多かったのですが、Copilotへの質問は、指定する列などを変えることである程度使い回すことができました。
そのため、質問に使用した文章はメモ帳などに残しておくことをおすすめします。

以上、川副でした。