[[20160927191006]] 『VBAでのWebクエリーの制御について』(ぴーすー) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『VBAでのWebクエリーの制御について』(ぴーすー)

初投稿です。お世話になります。

ExcelマクロでのWebクエリーの動作について、質問させてください。
詳細は下記の通りです。

【事象】
Amazonの売り上げランキングのページ(https://www.amazon.co.jp/gp/bestsellers/baby/ref=zg_bs_nav_0 など)を読み込み、Excel上にDLしたい。
1ページ目は正しく読み込めるが、2ページ目以降(上記URLの末尾に「#2」を付与)の結果が1ページ目と同じになってしまう。

【原因】
2ページ目の読み込みの際、一旦1ページ目を表示させてから2ページ目の結果を表示する仕様になっているため、画面読み込みが完了しないままWebクエリが走ってしまい、同事象が発生していると推定される。

【対応案】
WEBクエリーで、IEのページ読み込みまでクエリへのDL処理をWaitさせる、もしくは5秒程度waitさせることで、同事象を回避したい。以下は、現在のWebクエリのソースです。

With Sheets("Download").QueryTables.Add(Connection:=s, Destination:=Worksheets("Download").Cells(1, c))

            .Name = c
            .FieldNames = True
            .RowNumbers = False
            .FillAdjacentFormulas = False
            .PreserveFormatting = True
            .RefreshOnFileOpen = False
            .BackgroundQuery = True
            .RefreshStyle = xlInsertDeleteCells
            .SavePassword = False
            .SaveData = True
            .AdjustColumnWidth = True
            .RefreshPeriod = 0
            .WebSelectionType = xlEntirePage
            .WebFormatting = xlWebFormattingNone    '書式なし
            .WebPreFormattedTextToColumns = True
            .WebConsecutiveDelimitersAsOne = True
            .WebSingleBlockTextImport = False
            .WebDisableDateRecognition = False
            .WebDisableRedirections = False
            .Refresh BackgroundQuery:=False '読み込み完了を待つ
        End With

【補足】
本来であれば、Amazonのランキング取得にはAPIを通して実行するのが望ましいが、今回はAPIは使用しないでランキング取得したい。
APIを用いないRSSフィードだと、10位までしか取得できないという制約がある状況。

長文申し訳ありませんが、有識者の方にアドバイスをいただきたく思っております。
以上、よろしくお願いします。

< 使用 Excel:Excel2016、使用 OS:Windows10 >


ためしてないですが、2頁は別のurl(最後のpg=○)のようですが、
肝心のところが、単に s となっているので、分かりません。
トライしてみられたのでしょうか。

追記:ためしたけれど上手くいかないいようですね。
just a moment.

追追記:
上手くいくようです。

(γ) 2016/09/27(火) 19:53


γ様、回答ありがとうございます。

肝心のところが、単に s となっているので、分かりません。

すみません。上記sは変数として定義しているものになります。
プログラム全体は下記の通りです(長くてすみません。。。)

Sub Home_額縁1_Click()

'Loop処理変数の宣言

    Dim r As Long   '<== 行数をカウントアップするための変数
    Dim c As Long   '<== 列数をカウントアップするための変数
    Dim s As String '<== URLを格納するための変数

    r = 20          '<== まずは変数rの初期値を設定しておきます(20行目の意)
    c = 1           '<== まずは変数cの初期値を設定しておきます(1列目の意)

'Downloadシートの全てのセルの内容を削除
'SheetClear

    '↓ここからループのスタートです
    Do While Cells(r, 1) <> "URL;" '<== 1列目(A列)が【「URL;」でない間】ループ処理を続行します(Whileキーワードで判定)

        ' URLの格納
        s = Worksheets("Home").Cells(r, 1).Value

        With Sheets("Download").QueryTables.Add(Connection:=s, Destination:=Worksheets("Download").Cells(1, c))
            .Name = c
            .FieldNames = True
            .RowNumbers = False
            .FillAdjacentFormulas = False
            .PreserveFormatting = True
            .RefreshOnFileOpen = False
            .BackgroundQuery = True
            .RefreshStyle = xlInsertDeleteCells
            .SavePassword = False
            .SaveData = True
            .AdjustColumnWidth = True
            .RefreshPeriod = 0
            .WebSelectionType = xlEntirePage
            .WebFormatting = xlWebFormattingNone    '書式なし
            .WebPreFormattedTextToColumns = True
            .WebConsecutiveDelimitersAsOne = True
            .WebSingleBlockTextImport = False
            .WebDisableDateRecognition = False
            .WebDisableRedirections = False
            .Refresh BackgroundQuery:=False '読み込み完了を待つ
        End With

        '変数rとcを1つ繰り上げ
        r = r + 1           '<== これを忘れると永久ループになってしまいます
        c = c + 1           '<== これを忘れると永久ループになってしまいます

    Loop

    'メッセージボックスで処理終了を表示
    MsgBox "データのDL・加工が完了しました。"

End Sub

(ぴーすー) 2016/09/27(火) 21:35


すみません、それ、頁がカウントアップしてるんですか?

(γ) 2016/09/27(火) 22:16


ブラウザのアドレス欄は#2になっていますがそれではダメです。
21-40などのリンク先のアドレスを指定してください。
(cai) 2016/09/27(火) 22:27

ご指摘ありがとうございます。
そして言葉足らずですみません。

Excel上に下記の様にURLをセットする欄がありまして、そこに下記の様に設定しています。

URL;https://www.amazon.co.jp/gp/bestsellers/baby/ref=zg_bs_nav_0
URL;https://www.amazon.co.jp/gp/bestsellers/baby/ref=zg_bs_nav_0#2
URL;https://www.amazon.co.jp/gp/bestsellers/baby/ref=zg_bs_nav_0#3

VBでそれを見に行って、変数sに格納する様にしています。

以上、よろしくお願いします。
(ぴーすー) 2016/09/27(火) 23:06


ページネーションの部分にあるリンクをそのまま使いました。
https://www.amazon.co.jp/gp/bestsellers/baby/ref=zg_bs_baby_pg_1?ie=UTF8&pg=1
https://www.amazon.co.jp/gp/bestsellers/baby/ref=zg_bs_baby_pg_2?ie=UTF8&pg=2
https://www.amazon.co.jp/gp/bestsellers/baby/ref=zg_bs_baby_pg_3?ie=UTF8&pg=3
https://www.amazon.co.jp/gp/bestsellers/baby/ref=zg_bs_baby_pg_4?ie=UTF8&pg=4
https://www.amazon.co.jp/gp/bestsellers/baby/ref=zg_bs_baby_pg_5?ie=UTF8&pg=5

私にとっては、#2といったページ内リンクを使う根拠がわかりませんでした。
(γ) 2016/09/28(水) 05:41


いつもお世話になっております。
また、コメントありがとうございました。事象が解消しました。

#2を使用した根拠としては、1ページ目URL(https://www.amazon.co.jp/gp/bestsellers/baby/ref=zg_bs_baby_pg_1?ie=UTF8&pg=1)の下部にある21〜40位をクリックすると出てきたのが「#」つきのリンク(https://www.amazon.co.jp/gp/bestsellers/baby/ref=zg_bs_baby_pg_1?ie=UTF8&pg=1#2)だったので、そのまま使用したからになります。

pg=1#2など、ページ数 # ページ数の場合はページ内リンクなのですね。
私の勉強不足でした。ありがとうございます。
(ぴーすー) 2016/09/28(水) 10:52


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.