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

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

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

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

Q&A

解決済

1回答

2979閲覧

VBA-処理がだんだん遅くなる

m-nm0n

総合スコア15

VBA

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

0グッド

0クリップ

投稿2021/08/22 07:08

VBAでChromeをSeleniumで自動操作するプログラムを書いております。

下にあるループ処理を2,000回程度繰り返したいのですが、
500回目あたりからだんだんと1ループにかかる時間が長くなり、最後には止まってしまいます。

調べてみたのですが、IE操作での解決策ばかりで解決には至りませんでした。
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14224808844

Set driver = Nothing というのが有効そうとわかったのですが、こちらも使い方がわかりませんでした。

わかる方、ご教授いただけますとありがたいです。

VBA

1'ループ処理 2 3 Dim i As Integer 4 Dim tim As Integer 5 6 i = 2 7 tim = i 8 9 10 Do While tim = i 11 12 time = 1500 13 Sleep time 14 15 '新規作成 16 17 driver.FindElementByCss("body > div.container > div > button").Click 18 19 'キーワード 20 21 driver.FindElementByCss("#inputKws").SendKeys Cells(i, 2) 22 23 24 '除外ワード 25 26 driver.FindElementByCss("#inputKwes").SendKeys Cells(i, 3) 27 28 29 '送料無料のみ 30 31 If Not Cells(i, 4) = "" Then 32 33 driver.FindElementByCss("body > div.container > div > form > div:nth-child(5) > div > label > input").Click 34 35 End If 36 37 38 39 '=============================== 40 41 42 '商品状態 43 44 45 '新品、未使用 46 47 If Cells(i, 5) = "" Then 48 49 driver.FindElementByCss("body > div.container > div > form > div:nth-child(6) > div:nth-child(2) > label > input").Click 50 51 End If 52 53 54 '未使用に近い 55 56 If Cells(i, 6) = "" Then 57 58 driver.FindElementByCss("body > div.container > div > form > div:nth-child(6) > div:nth-child(3) > label > input").Click 59 60 End If 61 62 63 '目立った傷や汚れなし 64 65 If Cells(i, 7) = "" Then 66 67 driver.FindElementByCss("body > div.container > div > form > div:nth-child(6) > div:nth-child(4) > label > input").Click 68 69 End If 70 71 72 'やや傷や汚れあり 73 74 If Cells(i, 8) = "" Then 75 76 driver.FindElementByCss("body > div.container > div > form > div:nth-child(6) > div:nth-child(5) > label > input").Click 77 78 End If 79 80 81 '傷や汚れあり 82 83 If Cells(i, 9) = "" Then 84 85 driver.FindElementByCss("body > div.container > div > form > div:nth-child(6) > div:nth-child(6) > label > input").Click 86 87 End If 88 89 90 '全体的に状態が悪い 91 92 If Cells(i, 10) = "" Then 93 94 driver.FindElementByCss("body > div.container > div > form > div:nth-child(6) > div:nth-child(7) > label > input").Click 95 96 End If 97 98 99 100 '=============================== 101 102 103 'フリマ 104 105 106 'メルカリ 107 108 If Cells(i, 11) = "" Then 109 110 driver.FindElementByCss("body > div.container > div > form > div:nth-child(7) > div:nth-child(2) > label > input").Click 111 112 End If 113 114 115 'ラクマ 116 117 If Cells(i, 12) = "" Then 118 119 driver.FindElementByCss("body > div.container > div > form > div:nth-child(7) > div:nth-child(3) > label > input").Click 120 121 End If 122 123 124 'オタマート 125 126 If Cells(i, 13) = "" Then 127 128 driver.FindElementByCss("body > div.container > div > form > div:nth-child(7) > div:nth-child(4) > label > input").Click 129 130 End If 131 132 133 'ヤフオク 134 135 If Cells(i, 14) = "" Then 136 137 driver.FindElementByCss("body > div.container > div > form > div:nth-child(7) > div:nth-child(5) > label > input").Click 138 139 End If 140 141 142 'PayPayフリマ 143 144 If Cells(i, 15) = "" Then 145 146 driver.FindElementByCss("body > div.container > div > form > div:nth-child(7) > div:nth-child(6) > label > input").Click 147 148 End If 149 150 151 '=============================== 152 153 154 155 156 '下限価格 157 158 driver.FindElementByCss("#inputPmin").SendKeys Cells(i, 16) 159 160 161 '上限価格 162 163 driver.FindElementByCss("#inputPmax").SendKeys Cells(i, 17) 164 165 'アラート名 166 167 If Not Cells(i, 18) = "" Then 168 169 driver.FindElementByCss("body > div.container > div > form > div:nth-child(10) > div > label > input").Click 170 driver.FindElementByCss("#inputName").SendKeys Cells(i, 18) 171 172 End If 173 174 175 'アラートのプレビュー 176 177 driver.FindElementByCss("body > div.container > div > form > button").Click 178 179 '登録確定 180 181 time = 1500 182 Sleep time 183 184 driver.FindElementByCss("body > div.container > div > div:nth-child(3) > button").Click 185 186 187 188 '判定 189 190 i = i + 1 191 192 If Cells(i, 2) = "" And Cells(i, 23) = "" And Cells(i, 24) = "" Then 193 194 tim = i - 1 195 196 Else 197 198 tim = i 199 200 End If 201 202 203 time = 3000 204 Sleep time 205 206 207 208 209 Loop

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

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

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

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

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

meg_

2021/08/22 08:28

> だんだんと1ループにかかる時間が長くなり、最後には止まってしまいます。 「止まる」とはどういうことでしょうか?Windowsがクラッシュするという意味ですか?他の意味ですか? そしてこのVBAコードはどのアプリケーションに書いているのでしょうか?
ikapy

2021/08/22 09:15

当該プログラムを実行中、タスクマネージャーを見ていますか。 タスクマネージャーでCPU、メモリなどの動きを見てください。 メモリーがいっぱいになるとスワップが発生して遅くなります。そうであれば1回に2000回のループでなく、100回のループするアプリケーションを20回実行しては。ケースバイケースですので一概には言えませんが。
m-nm0n

2021/08/23 01:24

ikapy様 回答が遅くなり申し訳ございません。 確かに、遅くなっているときはCPUが100%近くになっています。 ”1回に2000回のループでなく、100回のループするアプリケーションを20回実行しては。” >>お手数ですが、このやり方を簡単にでいいのでご教授願えないでしょうか? 方法がどうしてもわかりませんでした…
m-nm0n

2021/08/23 01:26

mag様 回答が遅くなり申し訳ございません。 段々と処理が遅くなり、最後はWebページの読み込みが追いつかずNoSuchElementErrorが出て止まってしまう、という意味でした。 言葉足らずですみません。
meg_

2021/08/23 04:00

> 確かに、遅くなっているときはCPUが100%近くになっています。 それは普通ではないでしょうか?(VBAを実行中においては) > 最後はWebページの読み込みが追いつかずNoSuchElementErrorが出て止まってしまう、という意味でした。 そのことを質問に書きましょう。 エラーについては読み込みが完了してから次の操作をするようにしましょう。 >> そしてこのVBAコードはどのアプリケーションに書いているのでしょうか? 私の2つ目の質問にもお答えいただけないでしょうか?
m-nm0n

2021/08/23 12:30

>> そしてこのVBAコードはどのアプリケーションに書いているのでしょうか? 私の2つ目の質問にもお答えいただけないでしょうか? すみません、 Excel→Visual Basic→標準モジュール に書いております!
meg_

2021/08/23 13:09

> Excel→Visual Basic→標準モジュールに書いております! 了解しました。 スクレイピング先のサイトがスクレイピング禁止でなければ実際のコード(実行可能なコード)を掲載いただくと実際の挙動を検証できるかもしれません。
guest

回答1

0

ベストアンサー

段々と処理が遅くなり、最後はWebページの読み込みが追いつかずNoSuchElementErrorが出て止まってしまう、という意味でした。

下記コードは【Selenium×VBA】Webブラウザをロード待ちする方法【コード有】からの抜粋です。
試してみてはどうでしょうか?

vba

1FWFlag = False  2Do 3  FWFlag = driver.IsElementPresent(myBy. XPath(" [HTML-XPath要素] ")) '本コードだけでもいけそうですが、安定しないため、後述の wait1000で1秒待つ設定を入れています。 4  driver.Wait 1000 5Loop Until FWFlag = True

投稿2021/08/23 04:19

meg_

総合スコア10607

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

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

m-nm0n

2021/08/23 09:05

ありがとうございます。 ですが、本来1ループ3秒程度で終わるのが、遅くなると1分以上でかかるようになり、 いくらこのコードで処理を待機させても使い物にならないです…
meg_

2021/08/23 10:46

ikapyさんからも質問がありましたが、VBA実行中のPCのメモリの使用状況はどうなっていますか?(メモリ不足の可能性が疑われます) アクセス先URL先が不明なため実際の挙動は分かりませんが、もしもブラウザのタグを大量に開く場合は遅くなるかもしれません。
meg_

2021/08/23 10:48

> いくらこのコードで処理を待機させても使い物にならないです… 回答のコードで「最後はWebページの読み込みが追いつかずNoSuchElementErrorが出て止まってしまう」現状は解消できましたか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問