質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

Q&A

解決済

3回答

1486閲覧

エクセルVBAでループ中のエラー処理に躓いています

ama178

総合スコア9

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

0グッド

0クリップ

投稿2022/10/27 06:02

前提

エクセルVBA初心者です。
アリエクスプレスというサイトの在庫管理ツールを作成しています。
複数商品のURLがA列にズラッと並んでいて、
それを一つずつブラウザで開き在庫があるかを判別するイメージです。
在庫がある場合はB列に「在庫あり」、ない場合は「在庫なし」と入力されます。

在庫があるかどうかは、商品ページの「今すぐ購入」というボタンが存在するかどうかで判別するようにしています。
在庫がない場合はエラーが起こり、エラーが起こった時に例外処理で「在庫なし」と入力されるようにしたいです。

質問はループの中でのエラー処理で躓いています。
該当のソースコードを動かすと、「在庫なし」と判断されるべきページでも「在庫あり」と記入されてしまいます。
試した範囲では全てのページで在庫ありと判断されてしまいました。

ソースコードの中のエラー処理の「Resume Next」をなくした場合は正確に在庫の有無を判定してくれたのですが、
在庫がなかった商品でツールの駆動が完了してしまいます。

参考までにサンプルの商品ページのURLも載せておきます。

在庫がある場合
https://ja.aliexpress.com/item/1005003128872927.html?spm=a2g0s.8937460.0.0.39be2e0ecoqFRv&gatewayAdapt=glo2jpn

在庫切れの場合
https://ja.aliexpress.com/item/1005003748083331.html?spm=a2g0s.8937460.0.0.39be2e0ecoqFRv&gatewayAdapt=glo2jpn

https://ja.aliexpress.com/item/32855501809.html?spm=a2g0s.8937460.0.0.39be2e0ecoqFRv&gatewayAdapt=glo2jpn

実現したいこと

在庫の有無を正確に判別したいです。

発生している問題・エラーメッセージ

エラーは特には出ていないです。

該当のソースコード

VBA

1Sub test() 2 3Dim driver As New Selenium.WebDriver 4Dim i As Long 5 6SafeOpen driver, Chrome 7 8With ThisWorkbook.Worksheets("アリエク在庫管理") 9 10For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row 11 12 driver.Get .Range("A2").Offset(i - 1, 0) 13 14 driver.FindElementByCss("#root > div > div.product-main > div > div.product-info > div.product-action > span.buy-now-wrap > button").Text 15 16 On Error GoTo myError 17 Worksheets("アリエク在庫管理").Cells(1 + i, 2) = "在庫あり" 18 19Next 20 21 Exit Sub 22myError: 23 Worksheets("アリエク在庫管理").Cells(1 + i, 2) = "在庫切れ" 24Resume Next 25 26End With 27End Sub

試したこと

VBAでループ時のエラー処理について調べましたが、なかなか思ったような情報にたどり着けなかったので質問させて頂きました。

補足情報(FW/ツールのバージョンなど)

Windows10
chrome

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

On Error Resume Nextはエラーが発生した次の行に進みます。 だから毎回エラー処理は走っているけども直後に在庫有りで上書きされてしまっているようです。

対応策として、エラー処理後にループに復帰するラベルを追加してあげましょう。ただし、ラベルの乱立は可読性を著しく下げるため最小限、かつ用途が明確な名前にしましょう。

VBA

1Sub test() 2 3Dim driver As New Selenium.WebDriver 4Dim i As Long 5 6SafeOpen driver, Chrome 7 8With ThisWorkbook.Worksheets("アリエク在庫管理") 9 10For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row 11 12 driver.Get .Range("A2").Offset(i - 1, 0) 13 14 driver.FindElementByCss("#root > div > div.product-main > div > div.product-info > div.product-action > span.buy-now-wrap > button").Text 15 16 On Error GoTo myError 17 Worksheets("アリエク在庫管理").Cells(1 + i, 2) = "在庫あり" 18Err_loop_Back: 19Next 20 21 Exit Sub 22myError: 23 Worksheets("アリエク在庫管理").Cells(1 + i, 2) = "在庫切れ" 24Resume Err_Loop_Back 25 26End With 27End Sub

投稿2022/10/27 07:31

pig_vba

総合スコア808

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ama178

2022/10/27 09:16

ありがとうございました。 まさに求めていた情報でした。
guest

0

Office TANAKA - エラーに負けない
エラーへの対応と分岐ということで、こちらの中段あたりにある「エラーの意味を調べる」の項目がやりたいことに近いのではないでしょうか。

投稿2022/10/27 07:31

Usirow

総合スコア364

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ama178

2022/10/27 09:17

情報源を教えて頂きありがとうございます。
guest

0

求められる方法とは違いますが「IsElementPresent」を使うと要素の有無を返してくれますのでこちらを使ってはどうでしょう。

Dim myBy As New By if driver.IsElementPresent(myBy.Class("クラス")) then Worksheets("アリエク在庫管理").Cells(1 + i, 2) = "在庫あり" else Worksheets("アリエク在庫管理").Cells(1 + i, 2) = "在庫切れ" end if

投稿2022/10/27 06:24

bebebe_

総合スコア520

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ama178

2022/10/27 09:16

こんなやり方もあるのですね。 勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問