プログラミングはわからない…?ChatGPTと一緒なら大丈夫！マクロde時短チャレンジ

## 話題のAI。ちょっとだけ勉強しました！
プログラミングは全く分からないデジタル初心者です。
`ChatGPT`はコードも書いてくれると聞いて…！
色々チャレンジした挙句、私にはマクロが限界でした…(^^;)

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Power Automate Desktopでのエクセル編集すごい！！！と思ったけどマクロもすごくない！？<br>こんな一瞬で終わるの…？<br>今までの手作業は何だったんだ！<br>ChatGPT先生様様です…！！！！<a href="https://twitter.com/hashtag/protoout?src=hash&amp;ref_src=twsrc%5Etfw">#protoout</a> <a href="https://twitter.com/hashtag/ChatGPT?src=hash&amp;ref_src=twsrc%5Etfw">#ChatGPT</a> <a href="https://twitter.com/hashtag/%E3%83%9E%E3%82%AF%E3%83%ADVBA?src=hash&amp;ref_src=twsrc%5Etfw">#マクロVBA</a> <a href="https://twitter.com/hashtag/Excel?src=hash&amp;ref_src=twsrc%5Etfw">#Excel</a> <a href="https://t.co/bodmWznFGw">pic.twitter.com/bodmWznFGw</a></p>&mdash; 紺 (@navy_blue919) <a href="https://twitter.com/navy_blue919/status/1691703523409560044?ref_src=twsrc%5Etfw">August 16, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

### Excel編集 時短チャレンジ！
こんにちは、小売業の総務部で事務作業に従事しております。
前回の記事で`Power Automate Desktop`でExcel編集の自動化に挑戦しました。

https://qiita.com/navy-blue919/items/6cb671baffd6ae51f35b

少しでも自動化できる部分は自動化して、 **人間にしかできない「書類のファイリング」や「考えて組み立てる業務」に費やす時間を増やしたい！** というのが私のデジタル勉強の目標です！
なので、またまたExcel編集作業の時短大作戦です^^
今回使用するのも、請求状況の進捗管理のExcelです。
店舗改装などの際に、商品の陳列応援依頼を取引先にすることがあり、その費用支払いの請求書処理状況を確認するためのデータです。
37列3,000行のデータを編集して不要分を削除します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3459210/cb46f996-33ad-0e62-0839-ac2f576c51f9.png)
今回は全体の作業の一部分だけなので慣れていれば5分ほどで終わる作業なんですが…
(この後も編集やメール、集計、確認の連絡など手間のかかることが続くので少しでも時短したい…)
マクロ実行だと**一瞬で作業が終わってしまうんですね…** すごすぎる…。

なぜ今回マクロに挑戦したかというと、 **`ChatGPT`にコードを書いてもらえると知ったから**なんです。
過去、マクロに挑戦しようと色々調べたり本を読もうとしてみたりしたことがありましたが、さっぱり理解できず途中で諦めてしまいました💦
それなのに、`ChatGPT`がコードを書いてくれるというじゃないですか！！
ちょうど`Power Automate Desktop`でExcelの編集を行い、作業軽減としてやりたい方向性も定まってきたところ。
**時短の手段は色々身に着けておいて損はない！** と早速チャレンジしてみました。
## ChatGPTとのお戯れ
### とりあえず話しかけてみよう
VBAのコードは全く理解できなかった私。書いてもらうとはいえ**本当に扱えるのか？** と不安になりながら、とりあえずGPT先生に話しかけてみました。

<img width="70%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3459210/044a4258-a910-955a-2c5f-2e152912b622.png">

マクロの記録方法を教えてくれました！
これは、記録を始めてから実際に操作したことをコードに書き起こしてくれる(？)みたいなのですが…
効率的な操作を知らない私の無駄な動きもすべて記録されてしまうし、あとから見返しても絶対何かわからないコードが完成しました…。
折りたたみの中身は見ないことをおすすめします(笑)
<details><summary>こんなに長いコード、絶対見たくない…。</summary>

```visualbasic:vba
Sub 不要行削除()
'
' 不要行削除 Macro
' 過年度、応援辞退、支払済を削除します
'

'
    ActiveWindow.ScrollColumn = 2
    ActiveWindow.ScrollColumn = 3
    ActiveWindow.ScrollColumn = 4
    ActiveWindow.ScrollColumn = 5
    ActiveWindow.ScrollColumn = 6
    ActiveWindow.ScrollColumn = 7
    ActiveWindow.ScrollColumn = 8
    ActiveWindow.ScrollColumn = 9
    ActiveWorkbook.Worksheets("元データ (2)").AutoFilter.Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("元データ (2)").AutoFilter.Sort.SortFields.Add2 Key:= _
        Range("R1:R2949"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption _
        :=xlSortNormal
    With ActiveWorkbook.Worksheets("元データ (2)").AutoFilter.Sort
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    Columns("S:S").Select
    Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
    Range("S2").Select
    ActiveCell.FormulaR1C1 = "=left(R2,10)"
    Range("S2").Select
    Selection.AutoFill Destination:=Range("S2:S2949")
    Range("S2:S2949").Select
    Columns("S:S").Select
    Selection.NumberFormatLocal = "yyyy/m/d"
    Range("S2937").Select
    ActiveCell.FormulaR1C1 = "=LEFT(R[-2935]C[-1],2945)"
    Range("S2799").Select
    ActiveCell.FormulaR1C1 = "=LEFT(R[-2797]C[-1],2807)"
    Range("S2797").Select
    ActiveWindow.SmallScroll Down:=-54
    Range("S2743").Select
    Selection.End(xlUp).Select
    ActiveWindow.SmallScroll Down:=-24
    Range("S2").Select
    ActiveCell.FormulaR1C1 = "=LEFT(RC[-1],10)"
    Range("S2").Select
    Selection.AutoFill Destination:=Range("S2:S2949")
    Range("S2:S2949").Select
    Columns("S:S").Select
    Selection.Replace What:="-", Replacement:="/", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
    Columns("S:S").Select
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Selection.Replace What:="-", Replacement:="/", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
    Range("S10").Select
    Application.CutCopyMode = False
    Range("S1").Select
    ActiveSheet.Range("$A$1:$AO$2949").AutoFilter Field:=19, Criteria1:= _
        "<2023/03/01", Operator:=xlAnd
    ActiveWindow.SmallScroll Down:=-18
    Rows("2:2").Select
    Range("I2").Activate
    Range(Selection, Selection.End(xlDown)).Select
    ActiveWindow.SmallScroll Down:=3
    Selection.Delete Shift:=xlUp
    ActiveSheet.Range("$A$1:$AO$1229").AutoFilter Field:=19
    Columns("S:S").Select
    Selection.Delete Shift:=xlToLeft
    Range("Q8").Select
    ActiveWindow.ScrollColumn = 8
    ActiveWindow.ScrollColumn = 9
    ActiveWindow.ScrollColumn = 10
    ActiveWindow.ScrollColumn = 11
    ActiveWindow.ScrollColumn = 12
    ActiveWindow.ScrollColumn = 13
    ActiveWindow.ScrollColumn = 14
    ActiveWindow.ScrollColumn = 15
    ActiveWindow.ScrollColumn = 16
    ActiveWindow.ScrollColumn = 17
    ActiveWindow.ScrollColumn = 18
    ActiveWindow.ScrollColumn = 19
    ActiveWindow.ScrollColumn = 20
    ActiveWindow.ScrollColumn = 21
    ActiveWindow.ScrollColumn = 22
    Range("AB1").Select
    ActiveSheet.Range("$A$1:$AN$1229").AutoFilter Field:=28, Criteria1:="\N"
    ActiveWindow.SmallScroll Down:=-21
    Rows("46:46").Select
    Range("V46").Activate
    Range(Selection, Selection.End(xlDown)).Select
    ActiveWindow.SmallScroll Down:=9
    Range(Selection, Selection.End(xlDown)).Select
    Range(Selection, Selection.End(xlDown)).Select
    Range(Selection, Selection.End(xlDown)).Select
    Range(Selection, Selection.End(xlDown)).Select
    Range(Selection, Selection.End(xlDown)).Select
    Range(Selection, Selection.End(xlDown)).Select
    Range(Selection, Selection.End(xlDown)).Select
    Range(Selection, Selection.End(xlDown)).Select
    Range(Selection, Selection.End(xlUp)).Select
    ActiveWindow.SmallScroll Down:=-21
    Selection.Delete Shift:=xlUp
    ActiveWindow.SmallScroll Down:=-18
    ActiveSheet.Range("$A$1:$AN$1103").AutoFilter Field:=28
    ActiveWindow.SmallScroll Down:=-21
    Range("AD1").Select
    ActiveSheet.Range("$A$1:$AN$1103").AutoFilter Field:=30, Criteria1:="1"
    ActiveWindow.SmallScroll Down:=-24
    Rows("2:2").Select
    Range("V2").Activate
    Range(Selection, Selection.End(xlDown)).Select
    ActiveWindow.SmallScroll Down:=6
    Selection.Delete Shift:=xlUp
    ActiveSheet.Range("$A$1:$AN$238").AutoFilter Field:=30
    Range("A1").Select
End Sub
```
</details>

ほら、GPT先生もこのように仰っています。
<img width="70%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3459210/774c589e-48b3-9b8a-b1b9-5443212326c1.png">
まぁ、つまり**無駄が多いってことですね(笑)** ありがとうございます。


### 全っっっ然うまく伝えられない！！！
やはり私では無理なので、GPT先生に頼ることにします。
できるだけ簡潔に、誤解のないように、順を追って説明をする必要があるようなので画像のようにお願いしてみました。
<img width="60%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3459210/fb6787d4-cb0c-3306-5f3e-bd5a50c1fcb8.png">
<img width="60%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3459210/14c30116-be2d-9b83-0bd4-7a2ab031f7e1.png">

VBAのコードは書いてくれたものの、**実行してみるとうまく動きません…。**
意図しないところに列が挿入されていたり、置換してほしい列がずれていたり…。
エラーが出ている部分もあったので、「～～でエラーが出ています。修正してください」と何度かお願いしてみましたが、思ったような結果は得られず…。

本当は、GPT先生にコード書いてもらって、不具合あるところも修正してもらってパパッと完成！！
を思い描いていましたが、今の私には少し難しそう。
なので、**確実に完成させるために1行ずつ私自身が意味を理解しながら進める方向に**切り替えることにしました。
### 先生、一行ずつ教えてもらえますか…？
どこで何が起きているのかわからないので、1つずつ確認していきます。
VBAのエディタにコードを一行ずつ足していって実行を繰り返して自分のやりたいこととズレている部分を確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3459210/932bb8e0-f977-4988-14eb-f857674e5cfd.png)
画像のように一つずつ意味ややりたいことを聞いたり伝えたりして、少しずつ進んでいきます。
対話型なので本当に先生に教えてもらっているような気分でした^^
**何回質問しても、物分かりが悪くても、相手が気分を悪くする心配がないので心おきなく質問攻めにできました(笑)**
地道な作業で、嫌になるかと思いましたがVBAのコードを勉強できているのでワクワク。
繰り返すうちに、ここはこういう意味では？これはこうすればうまくいくのでは？とわかってきて楽しく作業できました！

### 完成したコードがこちら！
本当なら**もっとスマートなコードができるのかも**しれませんが…今の私の精一杯です^^;

↓不要行削除のコード↓
```visualbasic:vba
Sub データ編集マクロ()
    Dim ws As Worksheet
    Dim lastRow As Long
    Dim i As Long
    
    ' 元データ (3) シートを指定
    Set ws = ThisWorkbook.Worksheets("元データ (3)")
    
    ' 最終行を取得
    lastRow = ws.Cells(ws.Rows.Count, "R").End(xlUp).Row
    
    ' R列の後ろに1列挿入
    ws.Columns("S:S").Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
    
    ' 挿入した列の書式をyyyy/mm/ddに変更
    ws.Columns("S:S").NumberFormatLocal = "yyyy/mm/dd"
    
    ' 挿入した列にLEFT関数の式を入力して値貼り
    ws.Range("S2:S" & lastRow).FormulaR1C1 = "=LEFT(RC[1], 10)"
    ws.Range("S2:S" & lastRow).Value = ws.Range("S2:S" & lastRow).Value
    
    ' 挿入した列の値にフィルターを設定
    ws.Range("$A$1:$S$" & lastRow).AutoFilter Field:=19, Criteria1:="<2023/03/01"
    
    ' 表示された行を削除
    ws.UsedRange.Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow.Delete
       
    ' すべてのデータを選択してフィルターを解除
    ws.ShowAllData
    
     ' S列を削除
    ws.Columns("S:S").Delete
    
    ' AB列にフィルターをかけて特定のテキストを持つ行を削除
    ws.Range("$A$1:$S$" & lastRow).AutoFilter Field:=28, Criteria1:="=*N*"
    ws.UsedRange.Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow.Delete
        
    ' すべてのデータを選択してフィルターを解除
    ws.ShowAllData
    
     ' AD列にフィルターをかけて特定の値を持つ行を削除
    ws.Range("$A$1:$S$" & lastRow).AutoFilter Field:=30, Criteria1:="1"
    ws.UsedRange.Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow.Delete
        
    ' すべてのデータを選択してフィルターを解除
    ws.ShowAllData
     
     ' Z列にフィルターをかけて特定の値を持つ行を削除
    ws.Range("$A$1:$S$" & lastRow).AutoFilter Field:=26, Criteria1:="1"
    ws.UsedRange.Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow.Delete
        
    ' すべてのデータを選択してフィルターを解除
    ws.ShowAllData
    
End Sub
```

↓不要列削除のコード↓
```visualbasic:vba
Sub 不要列の削除()
   Dim ws As Worksheet
    Dim lastCol As Long
    Dim colIndex As Long
    
    ' 元データ (3) シートを指定
    Set ws = ThisWorkbook.Worksheets("元データ (3)")
    
    ' 最終列を取得
    lastCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column
    
    ' 列削除
    For colIndex = lastCol To 1 Step -1
        Select Case ws.Cells(1, colIndex).Value
            Case "店code", "店名", "グループ名", "応援者ID", "応援開始日(実績)", _
                 "応援依頼出した取引先", "実際に来た取引先", "応援者名", "支払フラグ"
                ' 指定した列を残す
            Case Else
                ws.Columns(colIndex).Delete
        End Select
    Next colIndex
End Sub

```

このコードをVBAのエディタに貼り付けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3459210/50732724-eab2-1b33-07fa-578f1206235a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3459210/1a711492-1e5d-4b51-1329-f5c8459efe83.png)
マクロの実行にはボタンを使ってみました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3459210/57484ff4-1907-5c8c-1bc6-598d20e40982.png)
これで秒で毎月の編集作業が完了するようになりました！
(まだまだ、その先の編集もマクロにしていく予定です^^　まずは第一歩！)
## 「無理！」を「できるかも？」にしてくれた素敵ツール。
**VBAの勉強を一度諦めていた私にマクロを作るなんて無理！と思っていましたが、`ChatGPT`の力を借りることで実現することができました^^**
ただ、知識がなさすぎるが故、「こうしてほしい！」とお願いすることがとても難しいと感じました。
意図した内容を誤解のないように**正しく伝えることができなければ、望んだレスポンスは返ってきません…。**
今回記事にしたVBAコードの作成については、会話しながらそれを探るのも楽しい作業でしたが、先にWebアプリを作成しようと`ChatGPT`にコードを書いてもらったときはエラーが出ていても修正が全くうまくいかずやり取りが堂々巡りになって諦めてしまいました💦
ただただ私の知識不足で**指示をしっかり出せていなかった**のだと思うので、**懲りずにチャレンジを続けていきたいと思います！**

こんな素敵な記事があったのですね！もっと調べなきゃいけなかった！！反省！！！

https://zenn.dev/manabuyasuda/articles/67d281d0f4594e


今回はこちらの記事を参考にさせていただきました。
ありがとうございます！

https://qiita.com/gushisushi/items/650bfc46fe0e1d3b452c

### `Power Automate Desktop`と`ChatGPTでVBA`使うならどっち？
当初の想定では「`ChatGPT`でサクッとできた～♪」の予定だったのが、意外と苦戦してしまった今回。
じゃぁ、`Power Automate Desktop`でフロー作るのと同じことじゃないの…？コードなんて勉強しなくても作れてしまいますもんね…。
マクロの利点は **「誰でも使用できること」** だと考えています。`Power Automate Desktop`をダウンロードしているか否かというような環境によって左右されることはありません。現在の**私の`ChatGPT`使用スキルではすぐに色々なコードを作成してバンバン時短していきます！！とはできませんが、少しずつでも使用スキルを上げて業務に活用できるようになればと考えています**。

ここまでお付き合いいただきありがとうございました！