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

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

新規登録して質問してみよう
ただいま回答率
85.35%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

VBA

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

解決済

1回答

900閲覧

If InStr… と End If の間のコードが実行されずシートに内容が反映されない

VPA

総合スコア6

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

VBA

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

0クリップ

投稿2020/02/18 12:13

こちらと同じコードで同じことを実行しようとしています
https://rabbitfoot.xyz/vba-automation-ws3/

エラーなくF5でコードが実行されます
しかし、エクセルシートに内容が反映されないままプログラムが終了します

F8で確認したところ
If InStr(sClassName, "list-rst is-blocklink js-bookmark js-open-newtab-rd") > 0 Then

End If
の間がスキップされているようなのですがなぜかわかりません

指定のクラス名が含まれていないということなのでしょうか?

Option Explicit Const READYSTATE_COMPLETE = 4 Const ROW_RESTAURANT_NAME = 1 Const ROW_FOOD_KIND = 2 Const ROW_SEARCH_KEYWORD = 3 Sub main() Dim objIE As InternetExplorer Dim objLITags As Object Dim objLI As Object Dim objLIChildTags As Object Dim objLIChild As Object 'Dim objAnchorTags As Object 'Dim objAnchor As Object Dim sClassName As String Dim sRestaurantName As String Dim sFoodKind As String Dim sKeyword As String Dim IRow As Long IRow = 1 'IE??N?? Set objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True objIE.Navigate2 "https://tabelog.com/tokyo/" '?J???????@ Do While objIE.Busy Or objIE.readyState <> READYSTATE_COMPLETE DoEvents Loop Set objLITags = objIE.document.getElementsByTagName("li") For Each objLI In objLITags '?N???X????擾 sClassName = "" On Error Resume Next sClassName = objLI.className On Error GoTo 0 '?w???N???X????????????????擾??????s?? If InStr(sClassName, "list-rst is-blocklink js-bookmark js-open-newtab-rd") > 0 Then sRestaurantName = "" sFoodKind = "" sKeyword = "" '?X?????擾 sRestaurantName = Trim(objLI.getElementsByTagName("a")(0).innerText) '????????擾 sFoodKind = Trim(objLI.getElementsByTagName("span")(0).innerText) '?????L?[???[?h??擾 Set objLIChildTags = objLI.getElementsByTagName("li") For Each objLIChild In objLIChild sClassName = "" On Error Resume Next sClassName = objLIChild.className On Error GoTo 0 '?L?[???[?h??J???}?????i?[ If InStr(sClassName, "list-rst_search-word-item") > 0 Then sKeyword = IIf(sKeyword = "", Trim(objLIChild.innerText), sKeyword & " , " & Trim(objLIChild.innerText)) End If Next '?V?[?g???o?? Cells(IRow, 1).Value = sRestaurantName Cells(IRow, 2).Value = sFoodKind Cells(IRow, 3).Value = sKeyword IRow = IRow + 1 End If Next MsgBox objIE.document.Title End Sub

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

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

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

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

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

meg_

2020/02/18 12:58

変数sClassNameの中身をローカルウィンドウで確認しましょう。
VPA

2020/02/18 13:29

sClassName    ””    string     となっています
meg_

2020/02/18 13:55

「スキップされているようなのですがなぜかわかりません」とのことですが、その変数に値がないのが原因です。タグの内容についてはサイトのHTMLを確認されるのが良いかと思います。※yuuskecchoさんの回答にもあるようにサイトの改変があったのかもしれませんね。
VPA

2020/02/18 14:29

list-rst is-blocklink js-bookmark js-open-newtab-rd のから list-rst js-bookmark js-rst-cassette-wrap js-is-need-redirect js-done に変更になってました 該当箇所を修正したらシートに反映されました ありがとうございました
guest

回答1

0

ベストアンサー

指定のクラス名が含まれていないということなのでしょうか?

クラス名かどうかは分かりませんが、InStr関数は文字列の中から指定の文字位置を返す関数です。
文字が含まれていなければ、0を返します。

あと、URL元にも

※食べログサイトの仕様変更などにより、そのままコピーしても使用出来ない場合があります。その場合は現在のサイトを参考に適宜修正を行って下さい。

と、記載されています。
サイトの仕様が変わったのではないでしょうか?

投稿2020/02/18 12:56

yuuskeccho

総合スコア97

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

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

VPA

2020/02/18 14:30

サイトの仕様が変わっていました ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問