話題のAI。ちょっとだけ勉強しました!
プログラミングは全く分からないデジタル初心者です。
ChatGPT
はコードも書いてくれると聞いて…!
色々チャレンジした挙句、私にはマクロが限界でした…(^^;)
Power Automate Desktopでのエクセル編集すごい!!!と思ったけどマクロもすごくない!?
— 紺 (@navy_blue919) August 16, 2023
こんな一瞬で終わるの…?
今までの手作業は何だったんだ!
ChatGPT先生様様です…!!!!#protoout #ChatGPT #マクロVBA #Excel pic.twitter.com/bodmWznFGw
Excel編集 時短チャレンジ!
こんにちは、小売業の総務部で事務作業に従事しております。
前回の記事でPower Automate Desktop
でExcel編集の自動化に挑戦しました。
少しでも自動化できる部分は自動化して、 人間にしかできない「書類のファイリング」や「考えて組み立てる業務」に費やす時間を増やしたい! というのが私のデジタル勉強の目標です!
なので、またまたExcel編集作業の時短大作戦です^^
今回使用するのも、請求状況の進捗管理のExcelです。
店舗改装などの際に、商品の陳列応援依頼を取引先にすることがあり、その費用支払いの請求書処理状況を確認するためのデータです。
37列3,000行のデータを編集して不要分を削除します。
今回は全体の作業の一部分だけなので慣れていれば5分ほどで終わる作業なんですが…
(この後も編集やメール、集計、確認の連絡など手間のかかることが続くので少しでも時短したい…)
マクロ実行だと一瞬で作業が終わってしまうんですね… すごすぎる…。
なぜ今回マクロに挑戦したかというと、 ChatGPT
にコードを書いてもらえると知ったからなんです。
過去、マクロに挑戦しようと色々調べたり本を読もうとしてみたりしたことがありましたが、さっぱり理解できず途中で諦めてしまいました💦
それなのに、ChatGPT
がコードを書いてくれるというじゃないですか!!
ちょうどPower Automate Desktop
でExcelの編集を行い、作業軽減としてやりたい方向性も定まってきたところ。
時短の手段は色々身に着けておいて損はない! と早速チャレンジしてみました。
ChatGPTとのお戯れ
とりあえず話しかけてみよう
VBAのコードは全く理解できなかった私。書いてもらうとはいえ本当に扱えるのか? と不安になりながら、とりあえずGPT先生に話しかけてみました。

マクロの記録方法を教えてくれました!
これは、記録を始めてから実際に操作したことをコードに書き起こしてくれる(?)みたいなのですが…
効率的な操作を知らない私の無駄な動きもすべて記録されてしまうし、あとから見返しても絶対何かわからないコードが完成しました…。
折りたたみの中身は見ないことをおすすめします(笑)
こんなに長いコード、絶対見たくない…。
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
ほら、GPT先生もこのように仰っています。
まぁ、つまり無駄が多いってことですね(笑) ありがとうございます。
全っっっ然うまく伝えられない!!!
やはり私では無理なので、GPT先生に頼ることにします。
できるだけ簡潔に、誤解のないように、順を追って説明をする必要があるようなので画像のようにお願いしてみました。
VBAのコードは書いてくれたものの、実行してみるとうまく動きません…。
意図しないところに列が挿入されていたり、置換してほしい列がずれていたり…。
エラーが出ている部分もあったので、「~~でエラーが出ています。修正してください」と何度かお願いしてみましたが、思ったような結果は得られず…。
本当は、GPT先生にコード書いてもらって、不具合あるところも修正してもらってパパッと完成!!
を思い描いていましたが、今の私には少し難しそう。
なので、確実に完成させるために1行ずつ私自身が意味を理解しながら進める方向に切り替えることにしました。
先生、一行ずつ教えてもらえますか…?
どこで何が起きているのかわからないので、1つずつ確認していきます。
VBAのエディタにコードを一行ずつ足していって実行を繰り返して自分のやりたいこととズレている部分を確認。
画像のように一つずつ意味ややりたいことを聞いたり伝えたりして、少しずつ進んでいきます。
対話型なので本当に先生に教えてもらっているような気分でした^^
何回質問しても、物分かりが悪くても、相手が気分を悪くする心配がないので心おきなく質問攻めにできました(笑)
地道な作業で、嫌になるかと思いましたが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
↓不要列削除のコード↓
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のエディタに貼り付けます。
マクロの実行にはボタンを使ってみました!
これで秒で毎月の編集作業が完了するようになりました!
(まだまだ、その先の編集もマクロにしていく予定です^^ まずは第一歩!)
「無理!」を「できるかも?」にしてくれた素敵ツール。
VBAの勉強を一度諦めていた私にマクロを作るなんて無理!と思っていましたが、ChatGPT
の力を借りることで実現することができました^^
ただ、知識がなさすぎるが故、「こうしてほしい!」とお願いすることがとても難しいと感じました。
意図した内容を誤解のないように正しく伝えることができなければ、望んだレスポンスは返ってきません…。
今回記事にしたVBAコードの作成については、会話しながらそれを探るのも楽しい作業でしたが、先にWebアプリを作成しようとChatGPT
にコードを書いてもらったときはエラーが出ていても修正が全くうまくいかずやり取りが堂々巡りになって諦めてしまいました💦
ただただ私の知識不足で指示をしっかり出せていなかったのだと思うので、懲りずにチャレンジを続けていきたいと思います!
こんな素敵な記事があったのですね!もっと調べなきゃいけなかった!!反省!!!
今回はこちらの記事を参考にさせていただきました。
ありがとうございます!
Power Automate Desktop
とChatGPTでVBA
使うならどっち?
当初の想定では「ChatGPT
でサクッとできた~♪」の予定だったのが、意外と苦戦してしまった今回。
じゃぁ、Power Automate Desktop
でフロー作るのと同じことじゃないの…?コードなんて勉強しなくても作れてしまいますもんね…。
マクロの利点は 「誰でも使用できること」 だと考えています。Power Automate Desktop
をダウンロードしているか否かというような環境によって左右されることはありません。現在の私のChatGPT
使用スキルではすぐに色々なコードを作成してバンバン時短していきます!!とはできませんが、少しずつでも使用スキルを上げて業務に活用できるようになればと考えています。
ここまでお付き合いいただきありがとうございました!