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

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

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

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

selenium

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

Q&A

解決済

2回答

1014閲覧

エラーがでた時にエラーが出る「前」まで戻るようなコードを書くことはできますか?

ama178

総合スコア9

VBA

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

selenium

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

0グッド

0クリップ

投稿2022/10/22 16:24

前提

エクセルのVBAについてです。
セレニウムを使ってアリエクスプレスというサイトにログインしたいのですが、なぜかログインできる時とできない時があります。
ログインできていない状態で次の動作をするとエラーになります。

ここで、エラーがでた時にエラーが出る「前」まで戻るようなコードを書くことはできますか?
エラーがでたときはログインをもう一度繰り返したいです。エラーが出なくなるまで繰り返したいです。
エラーが出なくなったらそのループを抜けるような動きを実装したいのですが、そういうことが可能なのでしょうか?

「On Error GoTo ErrorHandler」よりも前に「ErrorHandler:」を置いて、エラーが出た時にそこに飛びたいです。

このやり方が不可能なのであれば、違うやり方を教えて頂きたいです。

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

エラーメッセージの問題と言うよりはエラーの処理の仕方の問題です 下記のコードを実行すると、エラーが出ていない状況でも「ErrorHandler:」を実行してしまいます・・・

該当のソースコード

VBA

1Sub test() 2 3Dim Driver As New Selenium.WebDriver 4Dim i As Long 5 6SafeOpen Driver, Chrome 7 8Driver.Get ("https://login.aliexpress.com/?spm=a2g0o.cart.0.0.699938daanKXzt&return_url=https://www.aliexpress.com/p/shoppingcart/index.html") 9Driver.Wait 2000 10 11'ログイン作業 12Driver.FindElementByXPath("//*[@id=""fm-login-id""]").SendKeys "inaba.dangan@gmail.com" 13Driver.Wait 3000 14Driver.FindElementByXPath("//*[@id=""fm-login-password""]").SendKeys "inaba178" 15Driver.Wait 3000 16Driver.FindElementByXPath("//*[@id=""root""]/div/div/div/div[2]/div/div/button[2]").Click 17Driver.Wait 2000 18 19'エラーがでた時の再ログイン作業 20ErrorHandler: 21 Driver.FindElementByXPath("//*[@id=""root""]/div[1]/div[1]/div/div/div[2]/a[2]").Click 22 Driver.FindElementByXPath("//*[@id=""fm-login-id""]").SendKeys "inaba.dangan@gmail.com" 23 Driver.Wait 3000 24 Driver.FindElementByXPath("//*[@id=""fm-login-password""]").SendKeys "inaba178" 25 Driver.Wait 3000 26 Driver.FindElementByXPath("//*[@id=""root""]/div/div/div/div[2]/div/div/button[2]").Click 27 Driver.Wait 2000 28 29 30'カート画面遷移 31Driver.Get ("https://www.aliexpress.com/p/shoppingcart/index.html") 32Driver.Wait 1000 33 34'チェックボックス入れて支払い画面へ 35 36On Error GoTo ErrorHandler 37 Driver.FindElementByXPath("//*[@id=""root""]/div[1]/div[1]/div[1]/div[3]/div/div/div/div[2]/div/div[1]/label/span").Click 38Driver.Wait 1000 39 40Driver.FindElementByXPath("//*[@id=""root""]/div[1]/div[1]/div[2]/div[1]/button").Click 41Driver.Wait 1000

試したこと

試すアイデアが思いつきませんでした。

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

Windows10
chrome

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

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

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

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

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

guest

回答2

0

エラーが出たときに戻る、んではなく、
ログイン操作を繰り返し実行するようにループさせておき、ログインが成功したときにそのループを抜ける、と考えればどうでしょうか

投稿2022/10/23 01:26

編集2022/10/23 01:26
y_waiwai

総合スコア87774

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

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

ama178

2022/10/23 05:06

一言でまとめてくださりありがとうございます! そういうことなんですね。
guest

0

ベストアンサー

エラーが出た場合は、Err.Number が0以外になるのでそれで判断できます。
Do Loop で Err.Number = 0 になるまで繰り返すようにコーディングすればいいでしょう。
無限ループになるのを避けるために、トライ回数の上限を決めておくことをお勧めします。
下記のような感じになります。

vba

1Sub test() 2 3'略 4 5'ログイン作業 6 7'略 8On Error Resume Next 9 10'カート画面遷移 11 12'略 13 Dim tryCnt As Long 14 Do Until Err.Number = 0 Or tryCnt > 10 15 Err.Clear 16 17 'エラーがでた時の再ログイン作業 18 '略 19 20 tryCnt = tryCnt + 1 21 Loop 22 On Error GoTo 0 23 24 If tryCnt > 10 Then 25 MsgBox "ログインできませんでした。時間をおいて再実行してください。" 26 '終了処理 27 Exit Sub 28 End If 29 30'チェックボックス入れて支払い画面へ 31 32'略 33

投稿2022/10/22 17:15

編集2022/10/22 17:35
hatena19

総合スコア33715

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

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

ama178

2022/10/23 05:05

素晴らしいです。サンプルコードまで書いていただきホントにありがとうございます! 非常に勉強になりました。 最後に一つだけ確認をさせて頂きたいのですが、「tryCnt」は「i」に変えても問題ないですかね?
hatena19

2022/10/23 06:17

問題無いです。ただ、しばらく経ってから読み返したとき、意味が理解しやすい名前にしてくのがおすすめです。
ama178

2022/10/23 08:22

そうなんですね。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問