chatGPTに書いてもらったエクセルのマクロを修正希望
解決したいこと
chatGPTに書いてもらったエクセルのマクロにエラーが発生しております。
マクロ作成に詳しい方のアドバイスをお願いできますと幸いです
状況説明
chatGPTに下記のプロンプトを投げました。
# 命令書:
エクセルにおいて以下の処理を行う為のVBAコードを教えてください。
# 処理:
・A列で「::」を「:」に置換処理してください。
・B列で「|」を削除してください。ただし、「|」の前に「品」がある場合は削除しないでください。
・B列で「Sランク 」、「Aランク 」、「Bランク 」、「Cランク 」、「Dランク 」、「Eランク 」を削除してください。
・B列で「品|」の文言がない場合、F列のセル内の冒頭224文字は削除してください。
・B列で「品|」の文言がない場合、W列、X列、Y列、Z列、AA列、AB列のセル内は削除してください。
・P列とAA列でセルの書式設定を数値にしてください。
・B列で「品|」の文言がある場合、Q列のセル内は削除してください。
・B列で「品|」の文言はあり「γ」がない場合、F列のセル内の「<div style="margin:2% 0 4%;"><a href="https://re-camera-shop.com/category/detail/?pid=」を「<div style="margin:2% 0 4%;"><a href="https://www.akiba-r.com/category/cat/detail/index.jsp?pid=」に置換処理し、「&stid=5"><img src="https://shopping.c.yimg.jp/lib/akiba-ryutsu/yahoo-recamera-banner.png" alt="アールイーカメラはこちら" width="100%"></a></div>」を「&stid=5"><img src="https://shopping.c.yimg.jp/lib/akiba-ryutsu/yahoo-akibar-banner.png" alt="アキバ流通はこちら" width="100%"></a></div>」に置換処理してください。
・K列で「20」の数字がある場合、I列で「茨城」の文言以降を「・栃木・群馬・埼玉・千葉・東京・神奈川・岐阜・静岡・愛知・三重・新潟・山梨・長野・富山・石川・福井<br> 1,100円<br> <br> 青森・岩手・宮城・秋田・山形・福島・滋賀・京都・大阪・兵庫・奈良・和歌山<br> 1,200円<br> <br> 鳥取・島根・岡山・広島・山口・徳島・香川・愛媛・高知<br> 1,300円<br> <br> 北海道・福岡・佐賀・長崎・熊本・大分・宮崎・鹿児島<br> 1,500円<br> <br> 沖縄・離島<br> 1,900円<br><br><br></div>」に置換処理してください。
・K列で「30」の数字がある場合、I列で「茨城」の文言以降を「・栃木・群馬・埼玉・千葉・東京・神奈川・岐阜・静岡・愛知・三重・新潟・山梨・長野・富山・石川・福井<br> 1,300円<br> <br> 青森・岩手・宮城・秋田・山形・福島・滋賀・京都・大阪・兵庫・奈良・和歌山<br> 1,400円<br> <br> 鳥取・島根・岡山・広島・山口・徳島・香川・愛媛・高知<br> 1,600円<br> <br> 北海道・福岡・佐賀・長崎・熊本・大分・宮崎・鹿児島<br> 1,800円<br> <br> 沖縄・離島<br> 2,400円<br><br><br></div>」に置換処理してください。
・K列で「40」の数字がある場合、I列で「茨城」の文言以降を「・栃木・群馬・埼玉・千葉・東京・神奈川・岐阜・静岡・愛知・三重・新潟・山梨・長野・富山・石川・福井<br> 2,000円<br> <br> 青森・岩手・宮城・秋田・山形・福島・滋賀・京都・大阪・兵庫・奈良・和歌山<br> 2,100円<br> <br> 鳥取・島根・岡山・広島・山口・徳島・香川・愛媛・高知<br> 2,200円<br> <br> 北海道・福岡・佐賀・長崎・熊本・大分・宮崎・鹿児島<br> 2,500円<br> <br> 沖縄・離島<br> 4,000円<br><br><br></div>」に置換処理してください。
・K列で「50」の数字がある場合、I列で「茨城」の文言以降を「・栃木・群馬・埼玉・千葉・東京・神奈川・岐阜・静岡・愛知・三重・新潟・山梨・長野・富山・石川・福井<br> 2,600円<br> <br> 青森・岩手・宮城・秋田・山形・福島・滋賀・京都・大阪・兵庫・奈良・和歌山<br> 2,700円<br> <br> 鳥取・島根・岡山・広島・山口・徳島・香川・愛媛・高知<br> 2,800円<br> <br> 北海道・福岡・佐賀・長崎・熊本・大分・宮崎・鹿児島<br> 3,100円<br> <br> 沖縄・離島<br> 5,000円<br><br><br></div>」に置換処理してください。
・K列で「60」の数字がある場合、I列で「茨城」の文言以降を「・栃木・群馬・埼玉・千葉・東京・神奈川・岐阜・静岡・愛知・三重・新潟・山梨・長野・富山・石川・福井<br> 5,300円<br> <br> 青森・岩手・宮城・秋田・山形・福島・滋賀・京都・大阪・兵庫・奈良・和歌山<br> 5,500円<br> <br> 鳥取・島根・岡山・広島・山口・徳島・香川・愛媛・高知<br> 5,700円<br> <br> 北海道・福岡・佐賀・長崎・熊本・大分・宮崎・鹿児島<br> 6,300円<br> <br> 沖縄・離島<br> 9,700円<br><br><br></div>」に置換処理してください。
chatGPTより3回に分けてコードが生成されました。
生成されたコードをつなぎ合わせたものが下記の通りです。
マクロ
Sub ProcessData()
Dim ws As Worksheet
Dim cell As Range
Set ws = ActiveSheet
' A列で「::」を「:」に置換
ws.Columns("A").Replace What:="::", Replacement:=":", LookAt:=xlPart
' B列の処理
For Each cell In ws.Range("B1:B" & ws.Cells(ws.Rows.Count, "B").End(xlUp).Row)
' 「|」を削除(「品|」以外)
cell.Value = Replace(cell.Value, "|", IIf(InStr(cell.Value, "品|") > 0, "|", ""))
' ランクの削除
cell.Value = Replace(cell.Value, "Sランク ", "")
cell.Value = Replace(cell.Value, "Aランク ", "")
cell.Value = Replace(cell.Value, "Bランク ", "")
cell.Value = Replace(cell.Value, "Cランク ", "")
cell.Value = Replace(cell.Value, "Dランク ", "")
cell.Value = Replace(cell.Value, "Eランク ", "")
' 「品|」がない場合の処理
If InStr(cell.Value, "品|") = 0 Then
ws.Cells(cell.Row, "F").Value = Right(ws.Cells(cell.Row, "F").Value, Len(ws.Cells(cell.Row, "F").Value) - 224)
ws.Cells(cell.Row, "W").Value = ""
ws.Cells(cell.Row, "X").Value = ""
ws.Cells(cell.Row, "Y").Value = ""
ws.Cells(cell.Row, "Z").Value = ""
ws.Cells(cell.Row, "AA").Value = ""
ws.Cells(cell.Row, "AB").Value = ""
' 「γ」がない場合の処理
If InStr(cell.Value, "γ") = 0 Then
ws.Cells(cell.Row, "F").Value = Replace(ws.Cells(cell.Row, "F").Value, "<div style=""margin:2% 0 4%;""><a href=""https://re-camera-shop.com/category/detail/?pid=", "<div style=""margin:2% 0 4%;""><a href=""https://www.akiba-r.com/category/cat/detail/index.jsp?pid=")
ws.Cells(cell.Row, "F").Value = Replace(ws.Cells(cell.Row, "F").Value, "&stid=5""><img src=""https://shopping.c.yimg.jp/lib/akiba-ryutsu/yahoo-recamera-banner.png"" alt=""アールイーカメラはこちら"" width=""100%""></a></div>", "&stid=5""><img src=""https://shopping.c.yimg.jp/lib/akiba-ryutsu/yahoo-akibar-banner.png"" alt=""アキバ流通はこちら"" width=""100%""></a></div>")
End If
Else
' 「品|」がある場合、Q列を削除
ws.Cells(cell.Row, "Q").Value = ""
End If
Next cell
' P列とAA列の書式設定を数値に
ws.Columns("P").NumberFormat = "General"
ws.Columns("AA").NumberFormat = "General"
' K列の処理
For Each cell In ws.Range("K1:K" & ws.Cells(ws.Rows.Count, "K").End(xlUp).Row)
' K列の値に応じて、I列の「茨城」以降の文言を置換
Select Case cell.Value
Case "20"
ws.Cells(cell.Row, "I").Value = Replace(ws.Cells(cell.Row, "I").Value, Mid(ws.Cells(cell.Row, "I").Value, InStr(ws.Cells(cell.Row, "I").Value, "茨城")), "・栃木・群馬・埼玉・千葉・東京・神奈川・岐阜・静岡・愛知・三重・新潟・山梨・長野・富山・石川・福井<br> 1,100円<br> <br> 青森・岩手・宮城・秋田・山形・福島・滋賀・京都・大阪・兵庫・奈良・和歌山<br> 1,200円<br> <br> 鳥取・島根・岡山・広島・山口・徳島・香川・愛媛・高知<br> 1,300円<br> <br> 北海道・福岡・佐賀・長崎・熊本・大分・宮崎・鹿児島<br> 1,500円<br> <br> 沖縄・離島<br> 1,900円<br><br><br></div>")
Case "30"
ws.Cells(cell.Row, "I").Value = Replace(ws.Cells(cell.Row, "I").Value, Mid(ws.Cells(cell.Row, "I").Value, InStr(ws.Cells(cell.Row, "I").Value, "茨城")), "・栃木・群馬・埼玉・千葉・東京・神奈川・岐阜・静岡・愛知・三重・新潟・山梨・長野・富山・石川・福井<br> 1,300円<br> <br> 青森・岩手・宮城・秋田・山形・福島・滋賀・京都・大阪・兵庫・奈良・和歌山<br> 1,400円<br> <br> 鳥取・島根・岡山・広島・山口・徳島・香川・愛媛・高知<br> 1,600円<br> <br> 北海道・福岡・佐賀・長崎・熊本・大分・宮崎・鹿児島<br> 1,800円<br> <br> 沖縄・離島<br> 2,400円<br><br><br></div>")
Case "40"
ws.Cells(cell.Row, "I").Value = Replace(ws.Cells(cell.Row, "I").Value, Mid(ws.Cells(cell.Row, "I").Value, InStr(ws.Cells(cell.Row, "I").Value, "茨城")), "・栃木・群馬・埼玉・千葉・東京・神奈川・岐阜・静岡・愛知・三重・新潟・山梨・長野・富山・石川・福井<br> 2,000円<br> <br> 青森・岩手・宮城・秋田・山形・福島・滋賀・京都・大阪・兵庫・奈良・和歌山<br> 2,100円<br> <br> 鳥取・島根・岡山・広島・山口・徳島・香川・愛媛・高知<br> 2,200円<br> <br> 北海道・福岡・佐賀・長崎・熊本・大分・宮崎・鹿児島<br> 2,500円<br> <br> 沖縄・離島<br> 4,000円<br><br><br></div>")
Case "50"
ws.Cells(cell.Row, "I").Value = Replace(ws.Cells(cell.Row, "I").Value, Mid(ws.Cells(cell.Row, "I").Value, InStr(ws.Cells(cell.Row, "I").Value, "茨城")), "・栃木・群馬・埼玉・千葉・東京・神奈川・岐阜・静岡・愛知・三重・新潟・山梨・長野・富山・石川・福井<br> 2,600円<br> <br> 青森・岩手・宮城・秋田・山形・福島・滋賀・京都・大阪・兵庫・奈良・和歌山<br> 2,700円<br> <br> 鳥取・島根・岡山・広島・山口・徳島・香川・愛媛・高知<br> 2,800円<br> <br> 北海道・福岡・佐賀・長崎・熊本・大分・宮崎・鹿児島<br> 3,100円<br> <br> 沖縄・離島<br> 5,000円<br><br><br></div>")
Case "60"
ws.Cells(cell.Row, "I").Value = Replace(ws.Cells(cell.Row, "I").Value, Mid(ws.Cells(cell.Row, "I").Value, InStr(ws.Cells(cell.Row, "I").Value, "茨城")), "・栃木・群馬・埼玉・千葉・東京・神奈川・岐阜・静岡・愛知・三重・新潟・山梨・長野・富山・石川・福井<br> 5,300円<br> <br> 青森・岩手・宮城・秋田・山形・福島・滋賀・京都・大阪・兵庫・奈良・和歌山<br> 5,500円<br> <br> 鳥取・島根・岡山・広島・山口・徳島・香川・愛媛・高知<br> 5,700円<br> <br> 北海道・福岡・佐賀・長崎・熊本・大分・宮崎・鹿児島<br> 6,300円<br> <br> 沖縄・離島<br> 9,700円<br><br><br></div>")
End Select
Next cell
End Sub
早速CSVファイルに上記マクロを実行したところ、
エラー2箇所が出力されました。
エラー①
※該当箇所が私にはわかりませんでした。
---------------------------
Microsoft Visual Basic for Applications
---------------------------
実行時エラー '5':
プロシージャの呼び出し、または引数が不正です。
---------------------------
OK ヘルプ
---------------------------
エラー②
' 「品|」がある場合、Q列を削除
ws.Cells(cell.Row, "Q").Value = ""
End If
Next cell
---------------------------
Microsoft Visual Basic for Applications
---------------------------
コンパイル エラー:
Next に対応する For がありません。
---------------------------
OK ヘルプ
---------------------------
自分で試したこと
エラーが出た部分をchaGPTに修正依頼したのですが、
提案された修正コードもエラーが出てしまいました。
やはり最後の仕上げは、プロの方にご助言いただきたく思います。
お詳しい方のアドバイスを心よりお待ちしております。
よろしくお願いいたします