[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『ループ時に「オブジェクト変数または with ブロック変数が設定されていません。」というエラーが出てしまいます』(りくり)
こんにちは。
https://www.cosme.net/item/item_id/903/ranking/
のサイトから、ランキングの商品名、会社名、容量・価格、口コミ数を抽出するマクロを作っています。一度目は問題ないのですがループ時に「オブジェクト変数または with ブロック変数が設定されていません。」エラーが出てしまっており、原因が何か全く分かりません。なぜ1度目はOKで二度目にエラーが出てしまったのでしょうか?
そして、どのようにすれば改善できるでしょうか。
以下、わたしの書いたVBAです。
Sub ボタン1_Click()
Dim url As String
Dim http As Object
Dim WS As Worksheet
Dim check_row As Integer
Dim product_column As Integer
Dim price_column As Integer
Dim brand_column As Integer
Dim votes_column As Integer
Dim rank_column As Integer
Dim rank As Integer
Dim product As String
Dim brand As String
Dim price As String
Dim votes As String
Dim element As HTMLDDElement
Dim HtmlDoc As HTMLDocument
Dim HtmlBuf As Object
Set WS = ActiveSheet ' 現在のシートを退避 check_row = 7 ' 7行目から取得開始 rank_column = 2 ' 順位の列 product_column = 3 ' 製品名の列 brand_column = 4 ' ブランド名の列 price_column = 5 ' 価格の列 votes_column = 6 ' 口コミ数の列 rank = 0
url = "https://www.cosme.net/item/item_id/903/ranking/" Set http = CreateObject("MSXML2.XMLHTTP") http.Open "GET", url http.Send
Do While WS.Cells(check_row, rank_column) <> "" Do While http.readyState < 4 DoEvents Loop Set HtmlBuf = New HTMLDocument HtmlBuf.write http.responseText Set HtmlDoc = HtmlBuf Set element = HtmlDoc.getElementsByClassName("summary")(rank) product = element.getElementsByClassName("item")(rank).innerText '製品名 brand = element.getElementsByClassName("brand")(rank).innerText '会社名 price = element.getElementsByClassName("price")(rank).innerText '価格 votes = element.getElementsByClassName("votes")(rank).innerText '口コミ数
WS.Cells(check_row, product_column) = product WS.Cells(check_row, brand_column) = brand WS.Cells(check_row, price_column) = price WS.Cells(check_row, votes_column) = votes
Exist_out:
check_row = check_row + 1 rank = rank + 1 product = "" brand = "" price = "" votes = "" Loop
End Sub
< 使用 Excel:Excel2016、使用 OS:Windows10 >
(もこな2) 2019/09/23(月) 22:05
おそらくこれと同じ現象ではないでしょうか。
(黄色い循環参照) 2019/09/23(月) 22:15
1.ループさせる位置が少し変ですよ。
>Do While WS.Cells(check_row, rank_column) <> "" ↑ その一文は、もっと下にある この一文の直前に移動する ↓ >Set element = HtmlDoc.getElementsByClassName("summary")(rank)Set delement
2.配列の位置指定が変です。
以下4行の rank を 0 に変更する。(まぁ複数あったら、いつも0でいい訳じゃないですけど、今回は1個しかないので)
> product = element.getElementsByClassName("item")(rank).innerText '製品名 > brand = element.getElementsByClassName("brand")(rank).innerText '会社名 > price = element.getElementsByClassName("price")(rank).innerText '価格 > votes = element.getElementsByClassName("votes")(rank).innerText '口コミ数
(半平太) 2019/09/23(月) 22:42
Sub ボタン1_Click() Dim http As Object Dim WS As Worksheet Dim check_row As Integer Dim rank As Integer Dim element As HTMLDDElement Dim HtmlDoc As HTMLDocument Dim HtmlBuf As Object
Set WS = ActiveSheet '現在のシートを退避 check_row = 7 '7行目から取得開始 rank = 0
Set http = CreateObject("MSXML2.XMLHTTP") http.Open "GET", "https://www.cosme.net/item/item_id/903/ranking/" http.Send
Do While http.readyState < 4 DoEvents Loop Set HtmlBuf = New HTMLDocument HtmlBuf.write http.responseText Set HtmlDoc = HtmlBuf
For rank = 0 To HtmlDoc.getElementsByClassName("rank-num").Length - 1 Set element = HtmlDoc.getElementsByClassName("summary")(rank) WS.Cells(check_row, 3) = element.getElementsByClassName("item")(0).innerText '製品名 WS.Cells(check_row, 4) = element.getElementsByClassName("brand")(0).innerText '会社名 WS.Cells(check_row, 5) = element.getElementsByClassName("price")(0).innerText '価格 WS.Cells(check_row, 6) = element.getElementsByClassName("votes")(0).innerText '口コミ数 check_row = check_row + 1 Next rank End Sub (???) 2019/09/24(火) 10:38
(りくり) 2019/09/24(火) 10:53
・・と言われましても、こちらではノントラブルなので、当方サイドでのトラブルシュートはかなり手間です。
もう一つ回答案が出ていますので、そちらをお試しいただくのが先決です。(私は読んでいませんが)
さて、今回も2回目(Rankが1)でトラブるのでしょうか?
当初、1回目は「Rank」が同じ「0」なので、たまたま成功したという図式なんですけども。 兎に角、1回目が成功したと言うことは、ページ読み込みミスは原因ではなかったハズです。
もし今回から1回目もトラブったとすれば、原因が別ものになったと言うことになります。 通常は「ページ読み込みミス」が疑われます。 あと、URLを変更したなんてことは無いですね?(それだと話は全然別になります)
(半平太) 2019/09/24(火) 14:02
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.