ChatGPTを活用してコードを書けない私がマクロをつくる！

こんにちは。私は地方のスーパーの商品部に所属し「地域商品」の仕入や売場管理の仕事をしている女性会社員です。
デジタルの勉強を始めて早1か月半がたちました。

今の業務はパソコンを使った事務作業が多いのですが、どちらかというと個々の対応が多いためアナログな動きをしていることが多いです。

その中で**売上実績の業者さんへの報告業務**は毎月の定型業務として必須です。
こちらは過去のバイヤーが作成してくれたマクロを使っていますが、手順が複雑で1回あたり仕分けだけで約30分かかっています。

今回はChatGPTを活用してこの**売上実績の報告業務**の時短をめざして`Exelのマクロ`を作成してみたいと思います。

実は2週間前にも同じことを挑戦したのですが、ChatGPTへの質問がうまくいかずで約6時間かけてもマクロ・`PowerAutomateDesktop`も全く動かすことができず、断念してしまいました。
今回は再挑戦です！

## １．ひとつのExelブックから取引先名を抽出して、新しいExelブックに内容をコピーして貼り付ける

＜制作の背景＞
月度の定型業務として実績データを取引先様ごとにわける作業があります。現在は昔の担当者が作ってくれたマクロにデータをはめ込んで作成していますが、そのデータ作成までに非常に手数がかかります。
これをもっと簡単な方法で自分でも作成できないかと思いやってみました。
データとしては簡略版を作って試してみます。

ChatGPTにはこんな質問をしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3656954/410c30e3-55d5-63da-ab1a-7f09f062f026.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3656954/d9a35b97-42ce-63c8-8ad4-b0d7f7d78545.png)


これでは1行目の項目がカットされたファイルができてしまったので、さらに細かく指示をだしてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3656954/10576229-9e83-bb12-26a9-0e9cfe071959.png)


上記の質問でだしてもらったコードでやりたいことがちゃんと動きました。

最終的に貼り付けたコードはこちら

```Visual Basic
Sub CopyDataAndSaveAsNewWorkbooks()
    Dim sourceWorkbook As Workbook
    Dim newWorkbook As Workbook
    Dim sourceSheet As Worksheet
    Dim newSheet As Worksheet
    Dim lastRow As Long
    Dim extractStrings As Object
    Dim extractString As Variant
    Dim desktopPath As String
    
    ' Define the path to the desktop
    desktopPath = CreateObject("WScript.Shell").SpecialFolders("Desktop")
    
    ' Assuming the source workbook is already opened
    Set sourceWorkbook = ThisWorkbook ' Change ThisWorkbook to the appropriate workbook if needed
    
    ' Set the source sheet
    Set sourceSheet = sourceWorkbook.Sheets("Sheet1")
    
    ' Find the last row in column C of the source sheet
    lastRow = sourceSheet.Cells(sourceSheet.Rows.Count, "C").End(xlUp).Row
    
    ' Extract unique strings from column C
    Set extractStrings = CreateObject("Scripting.Dictionary")
    For i = 2 To lastRow
        extractStrings(sourceSheet.Cells(i, "C").Value) = 1
    Next i
    
    ' Loop through unique strings
    For Each extractString In extractStrings.keys()
        ' Create a new workbook and sheet
        Set newWorkbook = Workbooks.Add
        Set newSheet = newWorkbook.Sheets(1)
        
        ' Copy the first row from source to new workbook
        sourceSheet.Rows(1).Copy newSheet.Rows(1)
        
        ' Set the extract string as the name for the new workbook
        newWorkbook.SaveAs desktopPath & "\" & extractString & ".xlsx"
        
        ' Loop through column C from row 2 to the last row
        For i = 2 To lastRow
            If sourceSheet.Cells(i, "C").Value = extractString Then
                ' Copy the row from source to new workbook
                sourceSheet.Rows(i).Copy newSheet.Rows(newSheet.Cells(newSheet.Rows.Count, "A").End(xlUp).Row + 1)
            End If
        Next i
        
        ' Close the new workbook
        newWorkbook.Close True
    Next extractString
    
    ' Clean up
    Set newWorkbook = Nothing
    Set newSheet = Nothing
    
    MsgBox "Data copied and new workbooks saved successfully!", vbInformation
End Sub
```

動作はこちら

https://twitter.com/CHI032121/status/1761167358687957143



## ２．Exelブックから不要な行を削除する
＜制作背景＞
生データには私の部署に関係のないデータも多数含まれており、そちらのデータの削除が必要になります。現在は手動で取引先名などをフィルタにかけて削除しています。
こちらもマクロで簡単にできないか試してみました。

ChatGPTにはこんな質問をしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3656954/6668e33f-afcc-7d9f-cb0e-765fb48d5a84.png)


何回か聞き直しましたが上記の質問で、B列に取引先番号の218と2128を削除するマクロを聞き出すことができました。

コードはこちら

```Visual Basic
Sub RemoveColumnsBasedOnValue()
    Dim ws As Worksheet
    Dim lastRow As Long
    Dim searchRange As Range, cel As Range
    Dim searchValue1 As String, searchValue2 As String
    Dim delRange As Range
    
    ' シート1を設定します
    Set ws = ThisWorkbook.Sheets("Sheet1")
    
    ' 検索範囲の最終行を取得します
    lastRow = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row
    
    ' 検索する値を指定します
    searchValue1 = "218"
    searchValue2 = "2128"
    
    ' 削除する範囲を初期化します
    Set delRange = Nothing
    
    ' 指定された値を含むセルを検索し、該当する行のA列からS列を削除する範囲を取得します
    For Each cel In ws.Range("B2:B" & lastRow)
        If cel.Value = searchValue1 Or cel.Value = searchValue2 Then
            If delRange Is Nothing Then
                Set delRange = cel.EntireRow
            Else
                Set delRange = Union(delRange, cel.EntireRow)
            End If
        End If
    Next cel
    
    ' 削除する範囲がある場合は、A列からS列を削除します
    If Not delRange Is Nothing Then
        delRange.Delete Shift:=xlUp
    End If
End Sub
```

<details>
<summary>それまでの質問はこちら</summary>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3656954/fbc7c1a7-8fea-c378-6517-687d3b1b38d6.png)

どのエクセルを開くかの指示が明確ではなく動きません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3656954/f346cdaf-9b1f-778e-11b3-5c5a456420d8.png)

指定したファイルではなく開いたファイルにしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3656954/95719924-040c-28d1-3e4a-e66efeb98b5b.png)

指定した値`218,2128`の言い方がだめなようです。
`218 or 2128`と書き直したらできました。

</details>

質問のコツをつかんだのもあり、こちらは比較的スムーズにできました。
実際は削除したい取引先が100個程度あるかと思うので、今回のように**不要な個所の削除**がいいのか**必要な部分を取り出す**方がいいのか検討が必要です。

## ３．PowerAutomateDesktopのメール送信自動化に挑戦
＜制作背景＞
`VBA`がスムーズにできたので、ChatGPTを使って`PowerAutomateDesktop`を使えるようになりたいと思いました。
今までうまく動いた経験はがないため、自信がありませんでした。まずはChatGPTに`PowerAutomateDesktop`の複数相手に対するメール送信の方法を聞いてみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3656954/56a2300b-85a8-6253-f939-34d44fe9fcf7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3656954/66f6360c-be88-1eeb-f25a-1add6bc7d31d.png)

7.送信するメールの詳細を設定する　→　ここが知りたいのに、なかなかいい答えが出てこず。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3656954/bad8026c-b2da-f1e9-eb57-78a88c64da4c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3656954/214ec2b0-c828-1d5d-4acb-6a88343f4124.png)


具体的な操作手順は提供できないとのこと。ChatGPTは`PowerAutomateDesktop`の使い方については苦手なのかもしれないです。

<br>

### 補足
結局ChatGPTではなく以下の記事を参考に作成しました。

https://qiita.com/ikeuchi-kota/items/13bb181facf41f21a3ca

<details>
<summary>ChatGPTが活用できなかったので詳細は省かせてもらいます</summary>

![スクリーンショット (85).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3656954/96a7c0fe-1f05-d184-405b-3cdb322ada10.png)


![PADエクセル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3656954/b0a0c508-3f44-22c2-9035-d3c35d5b52b5.png)

![PAD受信メール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3656954/4db26b2c-9858-d94f-4b34-505c2c5bdf27.png)

</details>

<br>

**ChatGPTのおかげで`VBA`がスムーズにできたので、その時間で`PowerAutomateDesktop`の勉強に時間が使えました。**


## ４．まとめ
`Exelのマクロ`に関してはChatGPTへの質問を丁寧に繰り返せば動くことがわかりました。
コードを教えてくれる点でChatGPTと`VBA`は相性がいいかと思います。

反対に`PowerAutomateDesktop`ついては手順の流れは教えてくれますが、細部の設定についてはきちんと教えてもらえなかったので、相性が悪いかと思います。

### 最後に、実際のデータでやってみたところ…
**１.「取引先名を抽出して、新しいExelブックに内容をコピーして貼り付ける」**
今回つくったコードを応用して実際に私の業務で使っているデータに実行してみました。

![VBA実践.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3656954/555bed19-22df-022d-98d0-923df21cb84a.png)


すると30分たっても完成しませんでした。原因は13万行ほどデータがあるため検索に時間がかかるのではないかと思います。
先にフィルターをかけてからコピーするなど、さらに改良が必要だと感じました。

最後まで読んでいただきありがとうございました。