メルカリ物販を自動化するツール(エクセルVBAマクロ)

副業

FIRE実現のために、メルカリで副業を実践しているものの、手間がかかって思うように捗らないという方、多いのではないかと思います。

そこで、エクセルマクロ(VBA)でメルカリの物販作業を自動化・効率化するツールを作成しましたので、シェアします。

自動出品する機能や、amazonから市場価格を取得する機能など、色々な機能を実装しました。

参考になれば幸いです。

エクセルブックの紹介

エクセルにて、以下のような管理台帳シートを作って、当該シートを用いて、出品から取引完了までを管理します。

メルカリ物販を効率化するツール(エクセルVBAマクロ)

実際のマクロ入りブックは以下です。

本マクロブックのサポートやカスタマイズについては、条件によって、有償にて対応受付しております。

以下、クラウドワークスないしココナラのアカウントよりご依頼いただければ幸いです。

FIRE太郎さん(その他)に依頼・外注する | 簡単ネット発注なら【クラウドワークス】
日本最大のクラウドソーシング「クラウドワークス」にご登録いただいているFIRE太郎さんのプロフィールです。その他のスキルを持つプロフェッショナルに1時間から仕事を気軽に発注!発注者は手数料無料。
FIRE太郎さん(会社員)のプロフィール | ココナラ
Excelマクロ(VBA)による自動化ツールの作成が得意です。|ブログ「FIRE(早期リタイア)研究所」運営中

メルカリ物販用 VBAマクロの紹介

マクロの初期設定

まず、初期設定が必要です。

まず、以下記事を参考に、Seleniumの設定をします。

出品から取引終了までの基本機能

メルカリ出品ID取得

マクロを実行する前に、まず、スマホ版のメルカリアプリを使って手動で出品します。

この際の出品は仮状態でよいです。成約されないような高額な売価でとりあえず出品します。

その後、本項のマクロを動かすと、上記した新規出品IDをすべて取得し、エクセルのシートにレコード行を追加します。

メルカリ物販を自動化するツール(エクセルVBAマクロ)/メルカリ出品ID取得
メルカリの出品ページのIDを、新着順に取得
メルカリ物販を自動化するツール(エクセルVBAマクロ)/メルカリ出品ID取得
エクセルに対し、新着順にIDと関連情報を追加。登録済みのIDが管理表に存在した段階で、動作停止

行追加の際には、該当出品IDの、タイトルや説明文も取得します。手動出品時に、メルカリによって自動提案されたテキスト情報があれば、当該テキストが取得できます。

なお、説明文の取得に際しては、私が使っている定型文を冒頭に付加します(「中古品なので、多少のキズはご承知おき下さい~」を、メルカリ自動提案の説明文の冒頭に付加した上で、エクセルに取得)。

メルカリ物販を自動化するツール(エクセルVBAマクロ)/メルカリ出品ID取得
定型文を冒頭に追加した上で、エクセルにメルカリ出品データの値を取得

Sub メルカリ出品ID取得(PROFILE_PATH As String, Text As String)


    If Workbooks("物販管理.xlsm").Sheets("リスト").FilterMode = True Then
    
        Workbooks("物販管理.xlsm").Sheets("リスト").ShowAllData
    Else
        Workbooks("物販管理.xlsm").Sheets("リスト").Rows(2).AutoFilter
    
    End If
    
    driver.AddArgument ("user-data-dir=" & PROFILE_PATH)
    
    driver.Start "chrome"
    Application.Wait Now + TimeSerial(0, 0, 3)
    
    driver.Window.Maximize
    
    n = 1
    
    For n = 1 To 5
    
        driver.Get "https://jp.mercari.com/mypage/listings"
    
        driver.ExecuteScript "window.scrollTo(0, 0);"
        
        driver.FindElementByXPath("//*[@id='currentListing']/mer-list/mer-list-item[" & n & "]").Click
    
    
        Do Until Mid(driver.Url, 29, 1) = "m"
    
            Application.Wait Now + TimeSerial(0, 0, 1)
    
        Loop
    
        If WorksheetFunction.CountIf(Workbooks("物販管理.xlsm").Sheets("リスト").Columns(2), Mid(driver.Url, 29, 30)) < 1 Then
    
            Workbooks("物販管理.xlsm").Sheets("リスト").Cells(Workbooks("物販管理.xlsm").Sheets("リスト").Cells(Rows.Count, 2).End(xlUp).Row + 1, 1) = 1
            Workbooks("物販管理.xlsm").Sheets("リスト").Cells(Workbooks("物販管理.xlsm").Sheets("リスト").Cells(Rows.Count, 2).End(xlUp).Row + 1, 2) = Mid(driver.Url, 29, 30)
    
            Workbooks("物販管理.xlsm").Sheets("リスト").Cells(Workbooks("物販管理.xlsm").Sheets("リスト").Cells(Rows.Count, 2).End(xlUp).Row, 3) = "出品中"
            Workbooks("物販管理.xlsm").Sheets("リスト").Cells(Workbooks("物販管理.xlsm").Sheets("リスト").Cells(Rows.Count, 2).End(xlUp).Row, 4) = driver.FindElementByCss("#item-info > section:nth-child(1) > div > mer-heading").Text 'タイトル
    
            Workbooks("物販管理.xlsm").Sheets("リスト").Cells(Workbooks("物販管理.xlsm").Sheets("リスト").Cells(Rows.Count, 2).End(xlUp).Row, 6) = Text & driver.FindElementByXPath("//*[@id='item-info']/section[2]/mer-show-more/mer-text").Text 'コメント
    
            Workbooks("物販管理.xlsm").Sheets("リスト").Cells(Workbooks("物販管理.xlsm").Sheets("リスト").Cells(Rows.Count, 2).End(xlUp).Row, 8) = Mid(driver.FindElementByXPath("/html/body/div/div[1]/div/div/div/main/article/div[2]/section[1]/section[1]/div/mer-price").Text, 2, 40)  '価格
            Workbooks("物販管理.xlsm").Sheets("リスト").Cells(Workbooks("物販管理.xlsm").Sheets("リスト").Cells(Rows.Count, 2).End(xlUp).Row, 21) = Mid(driver.FindElementByXPath("/html/body/div/div[1]/div/div/div/main/article/div[2]/section[1]/section[1]/div/mer-price").Text, 2, 40)  '価格
            
        Else
        
            Exit For
    
        End If

    Next n
    
    If n > 5 Then

        driver.Get "https://jp.mercari.com/mypage/listings"
    
        driver.ExecuteScript "window.scrollTo(0, 0);"

        Err.Number = 0
            
        
        On Error Resume Next
        
        Do Until Err.Number <> 0
        
            Application.Wait Now + TimeSerial(0, 0, 2)
          
            driver.FindElementByXPath("//*[@id='currentListing']/div/mer-button/button").Click
        
        
        Loop
        
        
        On Error GoTo 0
        
        driver.ExecuteScript "window.scrollTo(0, 0);"
        
        EndRow = Workbooks("物販管理.xlsm").Sheets("リスト").Cells(Rows.Count, 2).End(xlUp).Row + 1
        
        Dim LinkURL As Variant 'As HTMLAnchorElement
         
        For Each LinkURL In driver.FindElementsByTag("a").Attribute("href")
            If InStr(LinkURL, "/item/m") <> 0 And WorksheetFunction.CountIf(Workbooks("物販管理.xlsm").Sheets("リスト").Columns(2), Mid(LinkURL, 7, 30)) = 0 Then
                Workbooks("物販管理.xlsm").Sheets("リスト").Cells(Workbooks("物販管理.xlsm").Sheets("リスト").Cells(Rows.Count, 2).End(xlUp).Row + 1, 2) = Mid(LinkURL, 7, 30)
            End If
        Next LinkURL
        
        Endrow2 = Workbooks("物販管理.xlsm").Sheets("リスト").Cells(Rows.Count, 2).End(xlUp).Row
        
        
        For i = EndRow To Endrow2
        
        
10:
            On Error GoTo ERR10
        
            driver.Get "https://jp.mercari.com/item/" & Workbooks("物販管理.xlsm").Sheets("リスト").Cells(i, 2)
            
            Workbooks("物販管理.xlsm").Sheets("リスト").Cells(i, 1) = 1
            Workbooks("物販管理.xlsm").Sheets("リスト").Cells(i, 3) = "出品中"
            
            Workbooks("物販管理.xlsm").Sheets("リスト").Cells(i, 4) = driver.FindElementByCss("#item-info > section:nth-child(1) > div > mer-heading").Text 'タイトル
        
            Workbooks("物販管理.xlsm").Sheets("リスト").Cells(i, 6) = Text & driver.FindElementByXPath("//*[@id='item-info']/section[2]/mer-show-more/mer-text").Text 'コメント
        
            Workbooks("物販管理.xlsm").Sheets("リスト").Cells(i, 8) = Mid(driver.FindElementByXPath("/html/body/div/div[1]/div/div/div/main/article/div[2]/section[1]/section[1]/div/mer-price").Text, 2, 40)   '価格
            Workbooks("物販管理.xlsm").Sheets("リスト").Cells(i, 21) = Mid(driver.FindElementByXPath("/html/body/div/div[1]/div/div/div/main/article/div[2]/section[1]/section[1]/div/mer-price").Text, 2, 40)   '価格
        
            
        
            On Error GoTo 0
        
        Next i
    End If
    
    Set driver = Nothing
    
    Workbooks("物販管理.xlsm").Sheets("リスト").Rows(2).AutoFilter Field:=3, Criteria1:="<>取引終了", Operator:=xlFilterValues
    Workbooks("物販管理.xlsm").Sheets("リスト").Cells(Workbooks("物販管理.xlsm").Sheets("リスト").Cells(Rows.Count, 2).End(xlUp).Row + 1, 1).Select

    Exit Sub

ERR10:
    Resume 10


End Sub

amazon価格情報更新

出品する商品がamazonで取り扱いのある商品であれば、手動でamazonの商品URLを取得し、該当の出品レコード行の該当列に当該URLを手入力します。

その後、本項のマクロを動かすことで、新品の価格と、マーケットプレイスの最安値を取得します。

check欄に1を入れていると、該当行のみ、取得します。

check欄に1 が一つも入っていないと、ステータスが出品中の行すべての最新データを取得します。

amazonはスクレイピングが禁止されているため、実行時にはログオフしておくほうがよいでしょう。


Sub メルカリ_amazon価格更新(PROFILE_PATH As String)

If Workbooks("物販管理.xlsm").Sheets("リスト").FilterMode = True Then

    Workbooks("物販管理.xlsm").Sheets("リスト").ShowAllData
Else
    Workbooks("物販管理.xlsm").Sheets("リスト").Rows(2).AutoFilter

End If


driver.AddArgument ("user-data-dir=" & PROFILE_PATH)


For i = 3 To Workbooks("物販管理.xlsm").Sheets("リスト").Cells(Rows.Count, 2).End(xlUp).Row

    If (WorksheetFunction.CountIf(Workbooks("物販管理.xlsm").Sheets("リスト").Columns(1), "1") >= 1 And Workbooks("物販管理.xlsm").Sheets("リスト").Cells(i, 1) = "1") Or WorksheetFunction.CountIf(Workbooks("物販管理.xlsm").Sheets("リスト").Columns(1), "1") < 1 And (Workbooks("物販管理.xlsm").Sheets("リスト").Cells(i, 3) = "出品中" Or Workbooks("物販管理.xlsm").Sheets("リスト").Cells(i, 3) = "") And Workbooks("物販管理.xlsm").Sheets("リスト").Cells(i, 10) <> "" Then

        driver.Get Workbooks("物販管理.xlsm").Sheets("リスト").Cells(i, 10)

        On Error Resume Next
   
        Workbooks("物販管理.xlsm").Sheets("リスト").Cells(i, 12) = ""
        Workbooks("物販管理.xlsm").Sheets("リスト").Cells(i, 12) = Mid(driver.FindElementByCss("#corePrice_feature_div > div > span > span:nth-child(2)").Text, 2, 99)
        'タイトル

        driver.Get Workbooks("物販管理.xlsm").Sheets("リスト").Cells(i, 11)
        
        Workbooks("物販管理.xlsm").Sheets("リスト").Cells(i, 13) = ""
        Workbooks("物販管理.xlsm").Sheets("リスト").Cells(i, 14) = ""
        
        Workbooks("物販管理.xlsm").Sheets("リスト").Cells(i, 13) = driver.FindElementByCss("#aod-price-1 > span > span:nth-child(2) > span.a-price-whole").Text 'タイトル
        Workbooks("物販管理.xlsm").Sheets("リスト").Cells(i, 14) = driver.FindElementByCss("#unified-delivery-message-0").Text 'タイトル
        
        On Error GoTo 0
    
        Application.Wait Now + TimeSerial(0, 0, 2)
        
    End If
    


Next i


Set driver = Nothing

Workbooks("物販管理.xlsm").Sheets("リスト").Rows(2).AutoFilter Field:=3, Criteria1:="<>取引終了", Operator:=xlFilterValues

End Sub

メルカリ出品

エクセル上で、タイトル、説明文を編集し、さらに、上記で取得したamazonの価格を参考にして売価を編集します。

タイトルは、メルカリで自動設定された場合、文字数オーバーの部分はカットされていますが、エクセル上では、全文入力しておきます。宣伝tweetに使用します。

また、タイトルの冒頭17文字は、らくらくメルカリ便の伝票印字に流用しますので、冒頭17文字で取引品目が判別できるようなタイトルにしておきます。

編集後、本項のマクロを実行します。これにより、メルカリWEBサイト上のタイトル、説明文、価格が更新されます。

あわせて、マクロがTwitterで宣伝tweetをtweetします。

さらに、マクロがTwitter用のbotに 宣伝tweetを追加します。

check列に1を入れた行を対象に動きます。


Sub メルカリ出品(PROFILE_PATH As String, tweet_text As String, tweet_post As String, USER_ID_1 As String, USER_PAS1 As String)

If Workbooks("物販管理.xlsm").Sheets("リスト").FilterMode = True Then

    Workbooks("物販管理.xlsm").Sheets("リスト").ShowAllData
Else
    Workbooks("物販管理.xlsm").Sheets("リスト").Rows(2).AutoFilter

End If

driver.AddArgument ("user-data-dir=" & PROFILE_PATH)


For i = 3 To Workbooks("物販管理.xlsm").Sheets("リスト").Cells(Rows.Count, 2).End(xlUp).Row

    If Workbooks("物販管理.xlsm").Sheets("リスト").Cells(i, 1) <> "" Then

        driver.Get "https://jp.mercari.com/sell/edit/" & Workbooks("物販管理.xlsm").Sheets("リスト").Cells(i, 2)


        'タイトル
        driver.FindElementByCss("#main > form > section:nth-child(3) > mer-text-input > div > label > div.mer-text-input-container > input").SendKeys ks.Control, "a"
        driver.FindElementByCss("#main > form > section:nth-child(3) > mer-text-input > div > label > div.mer-text-input-container > input").SendKeys ks.Delete
        driver.FindElementByCss("#main > form > section:nth-child(3) > mer-text-input > div > label > div.mer-text-input-container > input").SendKeys Mid(Workbooks("物販管理.xlsm").Sheets("リスト").Cells(i, 4), 1, 40)
        

        'コメント
        driver.FindElementByCss("#main > form > section:nth-child(3) > mer-textarea > div > label > textarea.input-node").SendKeys ks.Control, "a"
        driver.FindElementByCss("#main > form > section:nth-child(3) > mer-textarea > div > label > textarea.input-node").SendKeys ks.Delete
        driver.FindElementByCss("#main > form > section:nth-child(3) > mer-textarea > div > label > textarea.input-node").SendKeys Replace(Workbooks("物販管理.xlsm").Sheets("リスト").Cells(i, 6), vbTab, " ")

        '売価
        driver.FindElementByCss("#main > form > section:nth-child(5) > div:nth-child(2) > mer-text-input > div > label > div.mer-text-input-container > input").SendKeys ks.Control, "a"
        driver.FindElementByCss("#main > form > section:nth-child(5) > div:nth-child(2) > mer-text-input > div > label > div.mer-text-input-container > input").SendKeys ks.Delete

        If Workbooks("物販管理.xlsm").Sheets("リスト").Cells(Workbooks("物販管理.xlsm").Sheets("リスト").Cells(Rows.Count, 2).End(xlUp).Row, 8) = "" Then
            driver.FindElementByCss("#main > form > section:nth-child(5) > div:nth-child(2) > mer-text-input > div > label > div.mer-text-input-container > input").SendKeys Workbooks("物販管理.xlsm").Sheets("リスト").Cells(i, 16) - 100
        Else
            driver.FindElementByCss("#main > form > section:nth-child(5) > div:nth-child(2) > mer-text-input > div > label > div.mer-text-input-container > input").SendKeys Workbooks("物販管理.xlsm").Sheets("リスト").Cells(i, 8)
        End If

        Application.Wait Now + TimeSerial(0, 0, 3)
        
        driver.FindElementByXPath("//*[@id='main']/form/div[2]/mer-button[1]/button").Click

        driver.Get "https://twitter.com/compose/tweet"
        
        driver.FindElementByXPath(tweet_text).SendKeys Workbooks("物販管理.xlsm").Sheets("リスト").Cells(i, 18)
        driver.FindElementByXPath("/html/body/div[1]/div/div/div[1]/div[2]/div/div/div/div/div/div[2]/div[2]/div/div/div/div[3]/div/div[1]/div/div/div/div/div[2]/div[3]/div/div/div[2]/div[4]/div/span/span").Click


        driver.Get "https://metabirds.net/admin/login.php?lh=bot_top&language=ja&service_type=meta&lid=&emsg="
        
        driver.FindElementByCss("#default_login_form > form > div:nth-child(1) > label > input").SendKeys USER_ID_1
        driver.FindElementByCss("#default_login_form > form > div:nth-child(2) > label > input").SendKeys USER_PAS1
        Application.Wait Now + TimeSerial(0, 0, 2)
        driver.FindElementByCss("#default_login_form > form > div:nth-child(3) > input.button").Click

        Application.Wait Now + TimeSerial(0, 0, 3)
        
        driver.Get "https://metabirds.net/admin/bot_random.php"
        driver.FindElementByCss("#message_new").SendKeys Workbooks("物販管理.xlsm").Sheets("リスト").Cells(i, 18)
        Application.Wait Now + TimeSerial(0, 0, 6)
        driver.FindElementByCss("#app > div > article > section:nth-child(6) > div.form_wrap > form > div:nth-child(6) > div > button").Click
        




        Workbooks("物販管理.xlsm").Sheets("リスト").Cells(i, 21) = Workbooks("物販管理.xlsm").Sheets("リスト").Cells(i, 8)

        Workbooks("物販管理.xlsm").Sheets("リスト").Cells(i, 1) = ""

    End If
    


Next i


Set driver = Nothing

Workbooks("物販管理.xlsm").Sheets("リスト").Rows(2).AutoFilter Field:=3, Criteria1:="<>取引終了", Operator:=xlFilterValues

End Sub

コードの中の、「tweet_text, tweet_post」にセットする値は以下記事を参照ください。

メルカリ_購入お礼

商品が売れた際に、お礼のコメントを入力するマクロです。

check列に1を入れた行を対象に動きます。

購入日時を取得し、購入日時の7日後に出荷予定である旨コメントに付記する機能をつけています。

また、宣伝tweet用のbotを削除する機能をつけています。


Sub メルカリ_購入お礼(PROFILE_PATH As String, USER_ID_1 As String, USER_PAS1 As String)

If Workbooks("物販管理.xlsm").Sheets("リスト").FilterMode = True Then

    Workbooks("物販管理.xlsm").Sheets("リスト").ShowAllData
Else
    Workbooks("物販管理.xlsm").Sheets("リスト").Rows(2).AutoFilter

End If

driver.AddArgument ("user-data-dir=" & PROFILE_PATH)

driver.Start "chrome"
Application.Wait Now + TimeSerial(0, 0, 3)
driver.Window.Maximize


For i = 3 To Workbooks("物販管理.xlsm").Sheets("リスト").Cells(Rows.Count, 2).End(xlUp).Row

    If Workbooks("物販管理.xlsm").Sheets("リスト").Cells(i, 1) <> "" And Workbooks("物販管理.xlsm").Sheets("リスト").Cells(i, 3) = "出品中" Then



        driver.Get "https://jp.mercari.com/transaction/" & Workbooks("物販管理.xlsm").Sheets("リスト").Cells(i, 2)

        Application.Wait Now + TimeSerial(0, 0, 2)

        Workbooks("物販管理.xlsm").Sheets("リスト").Cells(i, 20) = CDate(Mid(driver.FindElementByXPath("//*[@id='main']/div/div[1]/div/div/div/mer-display-row[5]/span[2]").Text, 1, InStr(driver.FindElementByXPath("//*[@id='main']/div/div[1]/div/div/div/mer-display-row[5]/span[2]").Text, "日"))) + 7


        driver.FindElementByXPath("//*[@id='main']/div/div[2]/div[3]/form/mer-textarea/div/label/textarea[1]").SendKeys "お世話になります。この度はご購入いただきありがとうございます。出品者のFIRE太郎と申します。短い間ですが、お取引終了までよろしくお願いいたします。" & Format(Workbooks("物販管理.xlsm").Sheets("リスト").Cells(i, 20), "yy/mm/dd(aaa)") & "の発送を予定しております。発送まで、今しばらくお待ちください"

        driver.FindElementByXPath("//*[@id='main']/div/div[2]/div[3]/form/mer-button/button").Click
        
        driver.Get "https://metabirds.net/admin/login.php?lh=bot_top&language=ja&service_type=meta&lid=&emsg="

        driver.FindElementByCss("#default_login_form > form > div:nth-child(1) > label > input").SendKeys USER_ID_1
        driver.FindElementByCss("#default_login_form > form > div:nth-child(2) > label > input").SendKeys USER_PAS1
        Application.Wait Now + TimeSerial(0, 0, 2)
        driver.FindElementByCss("#default_login_form > form > div:nth-child(3) > input.button").Click

        Application.Wait Now + TimeSerial(0, 0, 2)
        driver.Get "https://metabirds.net/admin/bot_random.php"
        driver.FindElementByCss("#app > div > article > section:nth-child(7) > div.form_wrap > form:nth-child(1) > div:nth-child(1) > div > div > input[type=text]").SendKeys Workbooks("物販管理.xlsm").Sheets("リスト").Cells(i, 2)
        driver.FindElementByCss("#app > div > article > section:nth-child(7) > div.form_wrap > form:nth-child(1) > div:nth-child(1) > div > button").Click
        driver.FindElementByCss("#app > div > article > section:nth-child(7) > div.form_wrap > form:nth-child(3) > div > div.msg_list__item > div:nth-child(3) > div > div > label").Click
        driver.FindElementByCss("#app > div > article > section:nth-child(7) > div.form_wrap > form:nth-child(3) > div > div.msg_list__item > div:nth-child(3) > div > button").Click

        Workbooks("物販管理.xlsm").Sheets("リスト").Cells(i, 3) = "取引中"
        
        Workbooks("物販管理.xlsm").Sheets("リスト").Cells(i, 1) = ""


    End If

Next i

Application.Wait Now + TimeSerial(0, 0, 3)


Set driver = Nothing

Workbooks("物販管理.xlsm").Sheets("リスト").Rows(2).AutoFilter Field:=3, Criteria1:="<>取引終了", Operator:=xlFilterValues

End Sub

メルカリ発送準備

発送準備用のマクロです。

check列に1を入れた行を対象に動きます。

発送方法が、ファミリーマート&ネコポスの場合と、 セブンイレブン&ネコポスにのみ対応しています。

QRコード取得までを実行します。

商品名は、エクセルシート上の「メルカリ件名」から取得します。(文字数オーバー分はカットします)

<商品名についての補足>

商品名には商品概要(CD,Blu-rayなど)の記載が必要です。記載していないと航空輸送可能な安全な貨物か否かの判断が出来なくなるため、航空便に乗りません。

航空便に乗らないと、北海道など、航空便の選択が適切な送付先に対し、陸路・船便で輸送されてしまい、到着にとても時間がかかってしまいます。

それから商品名には、商品固有名を記載したほうがよいです。

複数コンビニに持ち込んだ場合に、添付する出荷票に商品固有名が印字されるため、どの現物商品に、どの出荷票を添付すればよいか判別できるようになるためです。

よって、商品名はまじめに記載したほうがよいのですが、スマホで作業すると地味に面倒くさいため、自動的に設定する機能を作りました。


Sub メルカリ_発送準備_ファミマ_ネコポス(PROFILE_PATH As String)

If Workbooks("物販管理.xlsm").Sheets("リスト").FilterMode = True Then

    Workbooks("物販管理.xlsm").Sheets("リスト").ShowAllData
Else
    Workbooks("物販管理.xlsm").Sheets("リスト").Rows(2).AutoFilter

End If

driver.AddArgument ("user-data-dir=" & PROFILE_PATH)

driver.Start "chrome"
driver.Window.Maximize
        Application.Wait Now + TimeSerial(0, 0, 3)

For i = 3 To Workbooks("物販管理.xlsm").Sheets("リスト").Cells(Rows.Count, 2).End(xlUp).Row

    If Workbooks("物販管理.xlsm").Sheets("リスト").Cells(i, 1) <> "" Then

        driver.Get "https://jp.mercari.com/transaction/" & Workbooks("物販管理.xlsm").Sheets("リスト").Cells(i, 2)
        Application.Wait Now + TimeSerial(0, 0, 3)
        
        If driver.FindElementByXPath("/html/body/div/div[1]/div/div/div/div/main/div/div[2]/mer-button[1]/button").Text = "コンビニ・宅配便ロッカーから発送" Then
            driver.FindElementByXPath("/html/body/div/div[1]/div/div/div/div/main/div/div[2]/mer-button[1]/button").Click
        Else
            Stop
        End If
        
        driver.FindElementByXPath("//*[@id='main']/div/div[2]/mer-button[2]/button").Click
        
        driver.FindElementByXPath("//*[@id='main']/div/div[2]/form/mer-select/div/label/div[2]/select").AsSelect.SelectByValue 1
        Application.Wait Now + TimeSerial(0, 0, 1)
        driver.FindElementByXPath("//*[@id='main']/div/div[2]/form/mer-text-input/div/label/div[2]/input").SendKeys ks.Control, "a"
        driver.FindElementByXPath("//*[@id='main']/div/div[2]/form/mer-text-input/div/label/div[2]/input").SendKeys ks.Control, Delete
        Application.Wait Now + TimeSerial(0, 0, 1)
        driver.FindElementByXPath("//*[@id='main']/div/div[2]/form/mer-text-input/div/label/div[2]/input").SendKeys Mid(Workbooks("物販管理.xlsm").Sheets("リスト").Cells(i, 4), 1, 17)

        driver.FindElementByXPath("//*[@id='main']/div/div[2]/form/mer-button/button").Click
        
        Workbooks("物販管理.xlsm").Sheets("リスト").Cells(i, 1) = ""
        
    End If
    


Next i

Application.Wait Now + TimeSerial(0, 0, 3)


Set driver = Nothing

Workbooks("物販管理.xlsm").Sheets("リスト").Rows(2).AutoFilter Field:=3, Criteria1:="<>取引終了", Operator:=xlFilterValues

End Sub

Sub メルカリ_発送準備_セブン_ネコポス(PROFILE_PATH As String)

If Workbooks("物販管理.xlsm").Sheets("リスト").FilterMode = True Then

    Workbooks("物販管理.xlsm").Sheets("リスト").ShowAllData
Else
    Workbooks("物販管理.xlsm").Sheets("リスト").Rows(2).AutoFilter

End If

driver.AddArgument ("user-data-dir=" & PROFILE_PATH)

driver.Start "chrome"
driver.Window.Maximize

For i = 3 To Workbooks("物販管理.xlsm").Sheets("リスト").Cells(Rows.Count, 2).End(xlUp).Row

    If Workbooks("物販管理.xlsm").Sheets("リスト").Cells(i, 1) <> "" Then

        driver.Get "https://jp.mercari.com/transaction/" & Workbooks("物販管理.xlsm").Sheets("リスト").Cells(i, 2)
        Application.Wait Now + TimeSerial(0, 0, 3)
        If driver.FindElementByXPath("/html/body/div/div[1]/div/div/div/div/main/div/div[2]/mer-button[1]/button").Text = "コンビニ・宅配便ロッカーから発送" Then
            driver.FindElementByXPath("/html/body/div/div[1]/div/div/div/div/main/div/div[2]/mer-button[1]/button").Click
        Else
            Stop
        End If
        
        driver.FindElementByXPath("//*[@id='main']/div/div[2]/mer-button[3]/button").Click
        
        driver.FindElementByXPath("//*[@id='main']/div/div[2]/form/mer-select/div/label/div[2]/select").AsSelect.SelectByValue 1
        Application.Wait Now + TimeSerial(0, 0, 1)
        driver.FindElementByXPath("//*[@id='main']/div/div[2]/form/mer-text-input/div/label/div[2]/input").SendKeys ks.Control, "a"
        driver.FindElementByXPath("//*[@id='main']/div/div[2]/form/mer-text-input/div/label/div[2]/input").SendKeys ks.Control, Delete
        Application.Wait Now + TimeSerial(0, 0, 1)
        driver.FindElementByXPath("//*[@id='main']/div/div[2]/form/mer-text-input/div/label/div[2]/input").SendKeys Mid(Workbooks("物販管理.xlsm").Sheets("リスト").Cells(i, 4), 1, 17)

        driver.FindElementByXPath("//*[@id='main']/div/div[2]/form/mer-button/button").Click

        
        Workbooks("物販管理.xlsm").Sheets("リスト").Cells(i, 1) = ""
        
    End If
    


Next i

Application.Wait Now + TimeSerial(0, 0, 3)


Set driver = Nothing

Workbooks("物販管理.xlsm").Sheets("リスト").Rows(2).AutoFilter Field:=3, Criteria1:="<>取引終了", Operator:=xlFilterValues

End Sub

メルカリ出荷通知

出荷通知と出荷した旨のコメントを入力するマクロです。

check列に1を入れた行を対象に動きます。

ネコポスに対応しています。

Sub メルカリ_出荷通知(PROFILE_PATH As String)

If Workbooks("物販管理.xlsm").Sheets("リスト").FilterMode = True Then

    Workbooks("物販管理.xlsm").Sheets("リスト").ShowAllData
Else
    Workbooks("物販管理.xlsm").Sheets("リスト").Rows(2).AutoFilter

End If

driver.AddArgument ("user-data-dir=" & PROFILE_PATH)

driver.Start "chrome"
driver.Window.Maximize

For i = 3 To Workbooks("物販管理.xlsm").Sheets("リスト").Cells(Rows.Count, 2).End(xlUp).Row

    If Workbooks("物販管理.xlsm").Sheets("リスト").Cells(i, 1) <> "" And Workbooks("物販管理.xlsm").Sheets("リスト").Cells(i, 3) = "取引中" And Workbooks("物販管理.xlsm").Sheets("リスト").Cells(i, 20) <> "" Then

        driver.Get "https://jp.mercari.com/transaction/" & Workbooks("物販管理.xlsm").Sheets("リスト").Cells(i, 2)
        
        Application.Wait Now + TimeSerial(0, 0, 2)
        
        driver.FindElementByXPath("//*[@id='main']/div/div[2]/form/mer-button/button").Click

        driver.FindElementByCss("body > mer-dialog > div:nth-child(2) > mer-button:nth-child(2) > button").Click

        Application.Wait Now + TimeSerial(0, 0, 2)

        driver.FindElementByXPath("//*[@id='main']/div/div[2]/div[2]/form/mer-textarea/div/label/textarea[1]").SendKeys "お世話になります。先ほど発送手続を完了しました。お手数ですが商品が到着しましたら、受け取り評価をお願いします。"

        driver.FindElementByXPath("//*[@id='main']/div/div[2]/div[2]/form/mer-button/button").Click

        Workbooks("物販管理.xlsm").Sheets("リスト").Cells(i, 3) = "出荷済"
        
        Workbooks("物販管理.xlsm").Sheets("リスト").Cells(i, 1) = ""


    End If

Next i

Application.Wait Now + TimeSerial(0, 0, 3)


Set driver = Nothing

Workbooks("物販管理.xlsm").Sheets("リスト").Rows(2).AutoFilter Field:=3, Criteria1:="<>取引終了", Operator:=xlFilterValues

End Sub

メルカリ_評価

商品が受取評価された際に、購入者の評価を実施するマクロです。

あわせて、取引結果をエクセル管理台帳に取得する機能を設けています。購入日時・販売価格・手数料・送料等を取得します。

check列に1を入れた行を対象に動きます。

評価の確定操作はブラウザ上で手動で実施するような仕様にしています。(評価はやり直しできないので、仕様変更などにより意図しない誤操作をしてしまわないように、その部分のみ、自動化しない仕様としています)


Sub メルカリ_評価(PROFILE_PATH As String)

If Workbooks("物販管理.xlsm").Sheets("リスト").FilterMode = True Then

    Workbooks("物販管理.xlsm").Sheets("リスト").ShowAllData
Else
    Workbooks("物販管理.xlsm").Sheets("リスト").Rows(2).AutoFilter

End If

driver.AddArgument ("user-data-dir=" & PROFILE_PATH)

driver.Start "chrome"
Application.Wait Now + TimeSerial(0, 0, 2)
driver.Window.Maximize

For i = 3 To Workbooks("物販管理.xlsm").Sheets("リスト").Cells(Rows.Count, 2).End(xlUp).Row

    If Workbooks("物販管理.xlsm").Sheets("リスト").Cells(i, 1) <> "" Then

        driver.Get "https://jp.mercari.com/transaction/" & Workbooks("物販管理.xlsm").Sheets("リスト").Cells(i, 2)
        Application.Wait Now + TimeSerial(0, 0, 2)

        driver.FindElementByXPath("//*[@id='main']/div/div[2]/div[1]/form/mer-textarea/div/label/textarea[1]").SendKeys "このたびは購入ありがとうございました。スムーズな取引をしていただいて感謝しています。また機会がありましたらよろしくお願いいたします。"


        driver.FindElementByXPath("//*[@id='main']/div/div[2]/div[1]/form/mer-button/button").Click


        Stop

        driver.Get "https://jp.mercari.com/transaction/" & Workbooks("物販管理.xlsm").Sheets("リスト").Cells(i, 2)
        
        Workbooks("物販管理.xlsm").Sheets("リスト").Cells(i, 22) = CDate(Mid(driver.FindElementByXPath("/html/body/div/div[1]/div/div/div/div/main/div/div[1]/div/div/div/mer-display-row[6]/span[2]").Text, 1, InStr(driver.FindElementByXPath("/html/body/div/div[1]/div/div/div/div/main/div/div[1]/div/div/div/mer-display-row[6]/span[2]").Text, "日")))
        Workbooks("物販管理.xlsm").Sheets("リスト").Cells(i, 23) = Mid(driver.FindElementByXPath("/html/body/div/div[1]/div/div/div/div/main/div/div[1]/div/div/div/mer-display-row[1]/span[2]/mer-price").Text, 2, 100)
        Workbooks("物販管理.xlsm").Sheets("リスト").Cells(i, 24) = Mid(driver.FindElementByXPath("/html/body/div/div[1]/div/div/div/div/main/div/div[1]/div/div/div/mer-display-row[2]/span[2]/mer-price").Text, 2, 100)
        Workbooks("物販管理.xlsm").Sheets("リスト").Cells(i, 25) = Mid(driver.FindElementByXPath("/html/body/div/div[1]/div/div/div/div/main/div/div[1]/div/div/div/mer-display-row[3]/span[2]/mer-price").Text, 2, 100)
        Workbooks("物販管理.xlsm").Sheets("リスト").Cells(i, 26) = Mid(driver.FindElementByXPath("/html/body/div/div[1]/div/div/div/div/main/div/div[1]/div/div/div/mer-display-row[4]/span[2]/mer-price").Text, 2, 100)
        Workbooks("物販管理.xlsm").Sheets("リスト").Cells(i, 27) = driver.FindElementByXPath("/html/body/div/div[1]/div/div/div/div/main/div/div[1]/div/div/div/mer-display-row[5]/span[2]").Text
        Workbooks("物販管理.xlsm").Sheets("リスト").Cells(i, 28) = Mid(driver.FindElementByXPath("/html/body/div/div[1]/div/div/div/div/main/div/div[2]/mer-list/mer-list-item/a/mer-user-object").Text, 1, InStr(driver.FindElementByXPath("/html/body/div/div[1]/div/div/div/div/main/div/div[2]/mer-list/mer-list-item/a/mer-user-object").Text, vbLf) - 1)
        Workbooks("物販管理.xlsm").Sheets("リスト").Cells(i, 29) = Date

        
        Workbooks("物販管理.xlsm").Sheets("リスト").Cells(i, 3) = "取引終了"
        
        Workbooks("物販管理.xlsm").Sheets("リスト").Cells(i, 1) = ""

    End If
    


Next i

Application.Wait Now + TimeSerial(0, 0, 3)


Set driver = Nothing

Workbooks("物販管理.xlsm").Sheets("リスト").Rows(2).AutoFilter Field:=3, Criteria1:="<>取引終了", Operator:=xlFilterValues

End Sub

その他機能

メルカリ過去の取引履歴取得

メルカリの、過去の取引履歴を一括でエクセルに取得します。

マクロの動画状況の動画は以下の通り。

この機能は以下リンク先のココナラで販売しています。

メルカリの販売履歴をエクセルに取得します メルカリの販売履歴をエクセルに取得するマクロ | 作業自動化・効率化 | ココナラ
メルカリの販売履歴をエクセルに取得するマクロです。...

メルカリ販売価格更新

メルカリの販売価格をエクセル上で編集後、一括でメルカリに反映するマクロです。

check列に1を入れた行を対象に動きます。

check列に1が一つも入っていない場合は、売値が変更された全ての行を対象に動きます。

この機能は以下リンク先のココナラで販売しています。

メルカリの販売価格を一括で更新します メルカリの販売価格を一括で更新するVBAマクロ | 作業自動化・効率化 | ココナラ
メルカリの販売価格を一括で更新するVBAマクロです。まず、マクロが、エクセル上に出品リストを取得します。商品名、現販売価格など。(無料公開している機能です。本ペ...

フィルター(出品中)機能

ステータスが出品中と空白の行のみにフィルターをかける機能です。

よく使うので、エクセルシートに該当のマクロボタンを設置しています。

Sub フィルタ_出品中()

If Workbooks("物販管理.xlsm").Sheets("リスト").FilterMode = True Then

    Workbooks("物販管理.xlsm").Sheets("リスト").ShowAllData
Else
    Workbooks("物販管理.xlsm").Sheets("リスト").Rows(2).AutoFilter

End If

strCell = ActiveCell.Address

Range(Workbooks("物販管理.xlsm").Sheets("リスト").Cells(3, 1), Cells(Workbooks("物販管理.xlsm").Sheets("リスト").Cells(Rows.Count, 1).End(xlUp).Row, 1)).ClearContents

Workbooks("物販管理.xlsm").Sheets("リスト").Cells(2, 1) = "チェック"

Range(strCell).Select

Workbooks("物販管理.xlsm").Sheets("リスト").Rows(2).AutoFilter Field:=3, Criteria1:="出品中", Operator:=xlOr, Criteria2:=""

ActiveWindow.SmallScroll Down:=-5000

フィルター(取引中)機能

ステータスが取引中と出荷済の出品IDにフィルターをかける機能です。

よく使うので、エクセルシートに該当のマクロボタンを設置しています。

Sub フィルタ_取引中()

If Workbooks("物販管理.xlsm").Sheets("リスト").FilterMode = True Then

    Workbooks("物販管理.xlsm").Sheets("リスト").ShowAllData
Else
    Workbooks("物販管理.xlsm").Sheets("リスト").Rows(2).AutoFilter

End If

strCell = ActiveCell.Address

Range(Workbooks("物販管理.xlsm").Sheets("リスト").Cells(3, 1), Cells(Workbooks("物販管理.xlsm").Sheets("リスト").Cells(Rows.Count, 1).End(xlUp).Row, 1)).ClearContents

Workbooks("物販管理.xlsm").Sheets("リスト").Cells(2, 1) = "チェック"

Range(strCell).Select

Workbooks("物販管理.xlsm").Sheets("リスト").Rows(2).AutoFilter Field:=3, Criteria1:="取引中", Operator:=xlOr, Criteria2:="出荷済"

ActiveWindow.SmallScroll Down:=-5000

End Sub

まとめ

いかがでしたでしょうか?

参考になれば幸いです。

本マクロブックのサポートやカスタマイズについては、条件によって、有償にて対応受付しております。

以下、クラウドワークスないしココナラのアカウントよりご依頼いただければ幸いです。

FIRE太郎さん(その他)に依頼・外注する | 簡単ネット発注なら【クラウドワークス】
日本最大のクラウドソーシング「クラウドワークス」にご登録いただいているFIRE太郎さんのプロフィールです。その他のスキルを持つプロフェッショナルに1時間から仕事を気軽に発注!発注者は手数料無料。
FIRE太郎さん(会社員)のプロフィール | ココナラ
Excelマクロ(VBA)による自動化ツールの作成が得意です。|ブログ「FIRE(早期リタイア)研究所」運営中

また、メルカリについては、以下の記事を書いていますので、こちらも参考になれば幸いです。

コメント

  1. リク より:

    商品件数が多いと、もっと見るボタンが何回も出てきて、物販管理を修正したのてすが、何故か2回目のもっと見るボタンをfindしても見つからず、悩んでおります。物販管理にもっと見るボタン対応があるといいのですが。何か定形のやり方はあるのでしょうか。

    • FIRE太郎FIRE太郎 より:

      コメントありがとうございます。
      Sub メルカリ出品ID取得(PROFILE_PATH As String)
      にかかるお問い合わせでしょうか。
      修正してみましたのでご確認ください。

  2. りく より:

    早速の修正ありがとうございます。
    今日は最後まで確認する時間が有りませんでしたので、明後日に確認致します。ソースを確認させていただきまして、もっと見るボタンが複数作られる場合、全てのもっと見るボタンをclickして全商品の配列を作ってから
    出品IDを取得していると拝読いたしました。凄いですね、そのような発想が全然わいてきませんでした。
    ありがとうございます。

タイトルとURLをコピーしました