VBAのWEBクエリが中断されます

このQ&Aのポイント
  • VBAを使ってgoogleのキーワード検索結果に表示される10文字程度の文字列を取得する作業を行いたい。
  • 具体的には、検索キーワードを変化させて200件ほど取得しようと考えているが、40件前後でエラーが発生し中断される。
  • VBAを終了させてしばらく待った後は再度動作するが、同じエラーが再発する。この作業はVBAに向かないのか、コードに問題があるかを教えて欲しい。
回答を見る
  • ベストアンサー

VBAのWEBクエリが中断されます

VBAを使ってgoogleのキーワード検索結果に表示される10文字程度の文字列を取得する作業を 検索キーワードを変化させて200件ほど取得しようと考えております。 (当然200回googleへのアクセスとなります) 以下のコードをdo untilで実行し、 変数"hogehoge"には"URL;https://www.google.co.jp/search?q=(任意のキーワード)"を代入します。 (任意のキーワード部分は200種類あります。) ------------------------------------- With Sheets("web").QueryTables.Add( _ Connection:=hogehoge, _ Destination:=web.Cells(1, 1)) .WebSelectionType = xlEntirePage .Refresh BackgroundQuery:=False .Parent.Names(.Name).Delete .Delete End With ------------------------------------- Destinationであるweb.Cells(1, 1))には検索結果ページが丸ごと入るので、 ここから欲しい文字列を正規表現で抜き取り、別のセルに移し替えます。 これにより別のセルに欲しい文字列(10文字程度)がどんどん追加されるのですが、 40件前後の取得を実行すると様々な理解不能なエラー文が出てきて停止してしまいます。 エラー文の例 --------------------------------------------------- エラー1004 サイトへのリクエストが正しくありません --------------------------------------------------- 実行時エラー 91 オブジェクト変数またはwithブロック変数が設定されていません --------------------------------------------------- エラーで止まった直後に再度実行しても同じエラーが出て動きませんが VBAを完全に終了させて、2~30分放置した後何気なく開始してみるとまた動き始めて、 40件程度取得し始めますが、再度同じエラーで停止します。 何が何だかさっぱりです、、、 このような作業はVBAに向かないという事なのでしょうか? それとも上記のコードになにかおかしな点があるのでしょうか? apiを使うべきだとも考えておりますが是非この方法でなんとかしたいと考えております。 大変お手数ですがお分かりになる方ご教示願いませんでしょうか? よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

サーバー(google)側で、接続拒否されているのでは。 1)リクエスト間隔を大きくする。 2)例外発生のときは、リトライする。 3)検索文字列をOr検索に切り替えて、リクエスト回数を減らす。 ――ようにしてみるとか。

master817199
質問者

お礼

見事改善されました ありがとうございます。

関連するQ&A

  • VBAのUserformのボタンからwebクエリ

    VBAのUserformのボタンを押すことによってwebクエリを取得という形を希望しているのですが、 以下のようにコードを設定した場合、Button1をクリックしただけではずっと”取得中”という文字が表示されるだけで何も動きはありません。 そこで、フォーム自体を×ボタンで消すと、その直後にwebクエリのデータが指定のシートに反映されます。 Private Sub CommandButton1_Click() 'Webクエリ作成 'WebSelectionType = xlAllTables With ActiveSheet.QueryTables.Add( _ Connection:="URL;http://www.yahoo.co.jp", _ Destination:=Worksheets("abc").Cells(1, 1)) .WebSelectionType = xlAllTables '既定値 .Refresh End With End Sub なぜフォームを消さないとシートに反映されないのでしょうか? ボタンを押すだけで即座に反映され、その後も作業を続けられるようにしたいので、方法を教えてください。 よろしくお願いします。

  • VBA Webクエリについて

    VBA初心者です。 VBAを使い、下記「やりたいこと」をしたいのですが、 「質問内容」にありますように、上手くできません…。 基礎がわかっていない為、お粗末な内容かもしれませんが、 教えてください。何卒よろしくお願い致します。 ■やりたいこと シート「1」にあるURLアドレスのリスト(C列)に沿って WEBクエリを実行し、シート「2」に取得したデータを 連続して末行に入力したいです。 ■質問内容 見よう見真似で、下記VBAを作成しました。(1To3は仮の回数です) WEBクエリが実行され、末行に取得データが入力されますが、 1回目、2回目の取得データは消え(長い空白行ができ)、 ラストの3回目のデータのみが残るかたちになります。 取得したデータが消えず、連続してWEBクエリを実行できるよう 下記を添削して頂けませんでしょうか。 ---------------------------------------------------------------- Sub Macro2() Dim Lrow As Long For カウンタ = 1 To 3 Lrow = Worksheets("2").Range("A" & CStr(Rows.Count)).End(xlUp).Row セル範囲 = "C" & カウンタ With ActiveSheet.QueryTables.Add(Connection:= _ "URL;" & Worksheets("1").Range(セル範囲).Value, Destination:=Worksheets("2").Range("A" & Lrow)) .Name = Worksheets("1").Range(セル範囲).Value .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 Next End Sub

  • VBAのInstrについて

    webページのソースコードを変数に代入し、 その中から<td class="abc">という文字列の位置を取得したいので hogehoge = Instr(baf,"<td class="abc">")と指定すると""の部分でエラーになってしまいますので ""をutf-8にあらかじめ変換し、%22で囲ってみました hogehoge = Instr(baf,"<td class=%22abc%22>") これでエラーはでませんが、これではソースコードから該当の文字列が探せません。 Instrで指定の文字の位置を取得したいが、その文字列内に「"」が含まれている場合、 どのようにすれば正常に取得できるでしょうか? よろしくお願いします。

  • 実行時エラー’13’ 型が一致しません VBA

    セルに以下の文字列が入っています。 A1=10(451 A2=452 そしてVBAにて、以下のプログラムを実行すると、「実行時エラー’13’ 型が一致しません」というエラーになってしまいました。 原因はA1に「( 」があるので文字列だからだと思うのですが、「IF 条件文」が成立しないことは満たすのでElse以下を実行されるのを期待していたのですが。 アドバイスをお願いします。 また、そもそも変数を宣言してないので「型が一致しない」というエラーの意味がわからないのですが。 If Cells(1, 1) - Cells(2, 1) = 1 Then Cells(3, 1) = 1 Else Cells(3, 1)="c" End If

  • エクセルVBAとWEBクエリに関する質問です

    まったくの初心者ですが、エクセルのVBAとWebクエリを駆使して、 大量(1000強)のWebページから商品情報を エクセルへ入力していくプログラムを作成したいと考えています。 やりたいことは (1)エクセルのA列にurlを1000個並べ (2)プログラムを実行すると、上から順にurlへ自動でアクセス (3)各ページの商品情報を取得(テーブルデータ)し、エクセルに入力していく 例)B列:商品名、C列:商品番号、D列:通常価格、E列:カラー展開、F列:サイズ展開 という具合に、次々と自動で商品情報を入力していくプログラムです。 エクセルのVBAとWebクエリを活用して以上のようなことをするのは可能でしょうか? VBAにてLinkの取得や、Webクエリにてテーブルデータの取得ができるのは わかったのですが、自動でアクセスして、表ではなく区切り線ごとにデータを並べたいのです。 もし可能でしたらどのようにすれば可能になるか教えていただけないでしょうか。 不可能だとした場合は、何か可能になる方法をご教唆いただけないでしょうか。 お手数ですが、ご回答よろしくお願いいたします。

  • VBAでWebに値を入力

    VBAでWebに値を入力する操作を考えています。 エクセルシートのA1に入っている値をWeb上に入力する操作なのですが、 以下のコードを実行すると「AllLog.keyword.Value = t」の部分でエラーになります。 googleではkeywordのところを「q」、yahooではkeywordのところを「p」にすれば問題ないのですが、 神奈川中央交通のページではエラーになってしまいます。 なぜですか?? Sub google() Dim objIE As InternetExplorer '参照設定:Microsoft Shell Controls and Automation Dim objShell As Shell Dim WinFlg As Boolean Dim objWin As Object Dim AllLog As Object On Error GoTo EndProcess Set objShell = New Shell For Each objWin In objShell.Windows If TypeName(objWin) = "IWebBrowser2" Then WinFlg = True Set objIE = objWin Exit For End If Next Set objShell = Nothing If WinFlg = False Then MsgBox "IEオブジェクトが取得できません", vbCritical Exit Sub End If EndProcess: If Err() > 0 Then MsgBox Err.Description End If With objIE Set AllLog = .Document.all t = Cells(1, 1) AllLog.keyword.Value = t End With Set objIE = Nothing End Sub

  • VBAの変数の型について

    VBAの変数の型について VBA初心者です。 下記のようにして背景に色を付けようと思ったのですが、 文字列型の変数名では、型が違うとエラーが出ます。 ただ、事情により、文字列型でしか色情報を取得できないため、 VBA内部で型の変更をして、上手く処理出来ないかと考えています。 文字列型から色名に対応する型への変更は、出来るのでしょうか? --------------------------------------- .BackgroundPatternColor = 文字列型変数名 --------------------------------------- 現在は、諦めて、下記のようにして対応しています。 --------------------------------------- If (bgColor = "黄") Then .BackgroundPatternColor = wdColorYellow End If --------------------------------------- よろしくお願い致します。

  • Excel VBAにて特定のサイトからのWebクエリ取得に失敗します。

    こんにちは。 現在、http://www.oanda.com/convert/fxhistory というサイトから為替レートを取得してチャートを 自動作成するマクロを使っているのですが、 2,3日前からWebクエリの取得に失敗するようになりました。 (ソース引用)---------------------------------------     With ActiveSheet.QueryTables.Add(Connection:= _ "URL;" + url _ , Destination:=Range("A1")) RefreshStyle = xlOverwriteCells .AdjustColumnWidth = False .WebSelectionType = xlSpecifiedTables .WebFormatting = xlWebFormattingNone .WebTables = "5" .Refresh BackgroundQuery:=False End With (ソース引用 終)------------------------------------ .Refresh~の部分で --------------------------------------------- 実行時エラー 1004 ファイルにアクセスできませんでした。次のいずれかを行ってみてください。 ?指定したフォルダがあるか ?読み取り専用になっていないか ?次の文字が含まれていないか<>?[]:|* ?ファイル名、パス名が半角218文字より長くないか --------------------------------------------- (?以降のエラーメッセージは編集していますが、このような内容です) というエラーが出ます。 しかも 自宅の環境(WinXP Pro SP2,Office2003)ではエラーが出て 会社の環境(Win2000,Office2000)では問題なく動いたりします。 あと、マクロからではなく、 エクセル上から直接「データ→外部データの取り込み」で Webクエリを取得しようとしても同様のエラーが出ます。 サイトで何か対策されているのか、 こちら側での問題なのか・・・ 何かご存知の方がいらっしゃいましたら、 回答よろしくお願いいたします。

  • VBAで別モジュールへの変数の受け渡し方法

    初歩的な質問で申し訳ありません、 googleでもどのように検索してよいのかわからないので教えてください。 Userformにて作成したコード内にhogehogeという変数を宣言したとします。 これをPublic Sub CommandButton1_Click()内でhogehogeに文字列abcを代入します。 そしてcall を使ってmodule1の処理を行うのですが、 module1内で変数hogehogeに文字列abcが既に代入されているものとして hogehogeを使いつつ、処理を続けるにはどのようにすればよいのでしょうか? callで呼ぶ際に変数hogehogeの受け渡しなどが必要なのでしょうか? (ちなみに全てPublic Subで書いております) 初心者なので質問がおかしいかもしれませんが よろしくお願いします。

  • エラーになってないのにVBAが中断される

    エラーになってないし、止めてもいないのに、VBAが中断される エクセル2010なのですが、マクロを実行すると、一定の間隔でマクロが中断してしまいます。 中断箇所は ・End With ・Set WSH = Nothing ・If tmp Like "*文字*" Then などです。 「コードの実行が中断されました」と表示されます。 中断キーは押していません。 再起動すると治るのですが、どうしてこのような現象が発生するのでしょうか?

専門家に質問してみよう