ograkb
@ograkb (ogr akb)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

chatGPTに書いてもらったエクセルのマクロを修正希望

解決したいこと

chatGPTに書いてもらったエクセルのマクロにエラーが発生しております。
マクロ作成に詳しい方のアドバイスをお願いできますと幸いです:sob:

状況説明

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に修正依頼したのですが、
提案された修正コードもエラーが出てしまいました。

やはり最後の仕上げは、プロの方にご助言いただきたく思います。
お詳しい方のアドバイスを心よりお待ちしております。

よろしくお願いいたします:bow_tone1:

0

1Answer

部分的に削除するなり、コメントアウトするなりで動かしてみれば、原因がわかるのではないでしょうか?

取り急ぎ気付いた点は:

ws.Cells(cell.Row, "F").Value = Right(ws.Cells(cell.Row, "F").Value, Len(ws.Cells(cell.Row, "F").Value) - 224)

224文字未満の場合はRightの第2引数がマイナスになってしまうので、エラーになりそうです。

1Like

Comments

  1. @ograkb

    Questioner

    ご助言いただきありがとうございます!
    部分的に検証を行ってみたいと思います。

    また、ご指摘の点も検証時に修正を試みたいと思います。

    なにぶんVBAのいろはを理解していない為、
    勉強しながら取り組みたいと思います。

    他にも気になる点ございましたら、
    ご指摘いただけませんでしょうか。

  2. プロシージャを分ければ可読性、保守性はかなりマシになると思います。

  3. # 命令書:
    エクセルにおいて以下の処理を行う為のVBAコードを教えてください。
    
    # 処理:
    ・B列で「品|」の文言がない場合、F列のセル内の冒頭224文字は削除してください。
    

    こう、単独にわけて生成させてそれを順に実行したほうがいいと思う。

  4. @ograkb

    Questioner

    @imagou @culage
    おふたりともアドバイスありがとうございます。

    アドバイス通り、処理を1つずつ実行したところ、うまくいきました!
    これで業務の効率化が加速しそうです。

    アドバイスのおかげで解決する事ができました。
    深く感謝いたします:relaxed:

Your answer might help someone💌