プロが教えるわが家の防犯対策術!

Internet Explorer を立ち上げて、あるサイトを開き、そのサイトの画面をコピーしてこれをエクセルのシートに貼り付けようとしているのですが、ステップバイステップで各行をチェックして行くと、下記に提示したマクロの後方の ActiveSheet~ で始まる貼り付けの行で標記のようなエラーメッセージが表示されてしまい、それ以降のデバッグが困難になってしまいます。
 この時に現れるエラーダイアログの「デバッグ」ボタンがグレーアウトしている為に、「継続」か「終了」のボタンを押すしかないのですが、いずれの場合もマクロを終了してしまい、その後、ステップインでの各行の確認ができません(なお、上記エラーメッセージが出ている状態で既に貼り付けそのものは実行されています)。
 又、エラー行を以下のようにしてもエラーとなります。
ActiveSheet.Paste
 なお、エラー行を以下のようにするとエラーは発生しません。
ActiveSheet.PasteSpecial Format:="テキスト"
 このエラー有無の違いは、画像を含んでいるか否かのようにも思われます。
 但し、どちらの場合でもステップバイステップを行わずにマクロを一気に実行すればエラーダイアログは表示されません。
 因みに、環境としては
Windows7(SP1無し)+ Excel 2010
Windows10 + Excel 2016
であり、いずれの環境でも同じ状態を呈します。

 この件について詳しい方、教えて頂ければ幸いです。
 -------------------------------------
Sub SiteCopy()

'■IEの立ち上げ
Dim IE As InternetExplorer
Set IE = New InternetExplorer
IE.Visible = True
IE.navigate "https://www.google.com/"
Do While IE.Busy = True Or IE.readyState < READYSTATE_COMPLETE
DoEvents
Loop
'■サイトコピー & 貼り付け
IE.ExecWB 17, 0 '全選択
IE.ExecWB 12, 0 'コピー
Worksheets("sheetA").Select
Range("A1").Select
ActiveSheet.PasteSpecial Format:="HTML" ' ←エラー行
'■IE終了
IE.Quit
Set IE = Nothing

End Sub
-------------------------------------

質問者からの補足コメント

  • 訂正:No.1 のお礼の文章で、以下の2点について訂正します。
    1. 「"HTML" モードでは画像貼り付けはしない」と書きましたが、これは質問で提示したマクロとは別の方法で実施したマクロの場合で、思い違いでした。失礼しました。
    2. 紹介されたサイトのマクロではエラーが無かったと書きましたが、このマクロでは別ブックを新規に立ち上げてその新規シートに貼り付けている為にエラーが出ないようで、自ブックのシートに貼り付ける場合はNGした。
    従って、問題は未解決のままです。
    一応、御報告まで。

    No.1の回答に寄せられた補足コメントです。 補足日時:2019/10/07 09:24
  • Qchan1962 さん、この欄ではマクロが文字数オーバーで掲載できません。
    宜しければ、何らかの質問なりコメントとを下さい。

    No.2の回答に寄せられた補足コメントです。 補足日時:2019/10/12 11:33

A 回答 (7件)

>これについては全く理解できていないのですが、


私の指摘表現が悪かったのでしょう。改めて、Rangeオブジェクトは、明らかにない(必ずエラーになる)行や列、アドレスを指定する
可能性のある書き方は、問題ありませんか、という指摘です。
r = 0
c = 0
If Doc.all(i).tagName = "TH" Or Doc.all(i).tagName = "TD" Then >>THタグもしくはTDタグがあったら 
Cells(r, c) = Doc.all(i).innerText  >>この時、先にTRタグを見つけていなければ、Cells(0, 0) = Doc.all(i).innerText

>>Cells(0,0)なんて存在しないので必ずエラー

c = c + 1
ElseIf Doc.all(i).tagName = "TR" Then
r = r + 1
c = 1
End If

つまり、r=1 c=1 にしなくていいの?と言う事です。

また、Stopステートメントについては、#6に書きましたが、挿入位置を変えて試してみてはと言う事です。

私は、プログラムをプロとして書いたこともないので、完全に趣味の範疇を超えない独学のなんちゃってなので、デバッグは必須です。

ycjk2001さんが、どのように、デバッグを行っているか分かりませんが、

私は、変数や配列の中の確認などは、Stop ローカルウィンドウで確認する事が多いです。
イミディエイトウィンドウやローカルウィンドウ、Debug.PrintやStopなどは無くてはならないものです。
デバッグには関係ないけど、Ctrl+スペースも(WW)

実行コードや参考コードは沢山転がっていますが、基本的な事を覚えないと思わぬつまずきになると思います。
私自身、そうですが、、。

DOMのチャレンジ健闘を祈ります。
    • good
    • 0
この回答へのお礼

Qchan1962さん、度々恐縮です。
 
>Cells(0,0)なんて存在しないので必ずエラー
→ これは先にも書いたように、教本からのパクリなので全く理解していないのですが、現在のところ、特定サイト以外からはデータを正常に取り込めているので基本的には問題はない筈です。
 その辺がよく分からない為に DOMを勉強する必要を実感しているところです。

>また、Stopステートメントについては、#6に書きましたが、挿入位置を変えて試してみてはと言う事です。
→ これは散々試していますが、エラー行以降ではステップイン操作ができないので Stopさせる事ができませんし、エラー行前に Stopを挿入しても意味がありません。

>ycjk2001さんが、どのように、デバッグを行っているか分かりませんが、
→ これ迄作成したマクロはそれ程複雑なものでは無い為に、ステップインや MsgBox とローカルウィンドウの使用で済んでいました。なので、イミディエイトウィンドウを使わずに来れた次第です。
 Ctrl+スペース も滅多に使っていません。
 
>DOMのチャレンジ健闘を祈ります。
→ 有り難うございます!

お礼日時:2019/10/14 11:20

あまり考えず読み飛ばしましたが、


>Stop (文字数オーバーの為、省略) 内容を確認してはいかがでしょうか。
→ これも試して見たのですが、ステップイン動作に持ち込めず意味がありませんでした。

状況が分かりません。F8でステップ実行できないと言う事ですか?そのような事象は経験がありませんので
後学の為、どのような挙動になるのでしょうか、教えてください。

また、内容は、ローカルウィンドウで確認するのでStop挿入位置を考えれば、良いのではないでしょうか。
    • good
    • 0
この回答へのお礼

何度も投稿頂いたのですが、こちらの検証が遅れて連絡が遅くなり申し訳ありませんでした。
 恐縮ですが Qchan1962さんの No.3~ No.5 の回答に対して纏めてコメントさせて頂きます。
 
【No.3】
>F8でステップ実行できないと言う事ですか?
→ これは No.3の回答に対するお礼の文章への Qchan1962さんの質問の一部になりますが、この時は文字数オーバーで詳細を書けませんでした。
 実際には最初の質問で提示したマクロでの現象に於いて、Ctrl + F8 にて ActiveSheet.PasteSpecial の行でマクロを一旦停止させ、次に F8 のボタンを押すと「中断モードでは入力できません。」とのメッセージが出てしまい、その後はステップイン動作ができなくなってしまう訳ですが、これを同様に当該行で Stopさせて F8 のボタンを押しても同じ事(「中断モードでは入力できません。」)になってしまうという事です。
 
【No.4】
>気になる点としては、あまり詳しくないのですが、必ずTRタグはTHたTDタグの前のあるのでしょうか?
もしなければ、Cells(r, c) = がCells(0,0)になり、エラーになるかと思います。
→ これについては全く理解できていないのですが、 ここでエラーが生ずるのはある特定のサイトであり、この処理自体には問題無いように思われます。

>Debug.Print Doc.all(i).innerText を For内の探りたい場所に入れイミディエイトウィンドウで確認されるのはどうでしょう。
→ 実はお恥ずかしながら、イミディエイトウィンドウを使用した事がありません。
 従って今回のアドバイスはとても役に立ちました。有り難うございます。
 
 ところで、r = r + 1 の行でサイトによってはエラーが生じてしまうのはサイト側のデータに原因がありそうなのでその前後のコードを変えないといけないのですが、私の知識では現状無理です。
 そこで時間はかかってしまいますが、DOMの勉強を初めてみようと考えている所です。
 今回、Qchan1962さんには大変お世話になり御迷惑もお掛けしましたが、今後も本件類似の質問を投稿する事になると思うので、宜しければその節は宜しくお願い致します。

お礼日時:2019/10/13 15:15

訂正します。


>For直下なら、全部になるかと思います。
Doc.all(0).innerTextは確かに全部ですが、
Forで繰り返されるので、適切ではありません。
Doc.all(1).innerText以降で見るか、全部なら、イミディエイトウィンドウで
?Doc.all(0).innerText  +エンターキーです。

Debug.Printを使わない場合は、?Doc.all(iの値).innerText でした。
    • good
    • 0

コード拝見しました。

表の見出しとセル内のデータを抽出するで良かったでしょうか。
>'データ取り込み(r、c の定義省略)とあるので実際は違うと思いますが、
気になる点としては、あまり詳しくないのですが、必ずTRタグはTHたTDタグの前のあるのでしょうか?
もしなければ、Cells(r, c) = がCells(0,0)になり、エラーになるかと思います。

また、F8などで実行する際、変数は見えるとして、all(i).innerTextを見たいと言う事でしょうか。

であれば、
Debug.Print Doc.all(i).innerText をFor内の探りたい場所に入れイミディエイトウィンドウで確認されるのはどうでしょう。
条件の下なら条件の通ったものが見れますし、For直下なら、全部になるかと思います。

コードについては、私が書くプロセスと違うので、検証していません。
    • good
    • 0

同じ環境下を作る事が出来ず、同様のエラーが出なかった為、色々と頓珍漢な回答をしてしまったようです。


私が確認したOSは、Windows10 IE11、Excelは、2013 と 2016 でした。

今回の事象で、特定オブジェクトをDeleteしたりした時と同じに、
HTMLフォーマットの場合、マクロの実行が一瞬(内部的に?)途切れるのだと理解しました。

エラーメッセージと言う文字に私は、誤解してしまっていたようです。(中断モードダイアログを意図的にブレイクした時の忠告位に考えていました)

>ステップバイステップを行わずにマクロを一気に実行すればエラーダイアログは表示されません。

ステップインで検証したいが中断モードに阻まれるのであれば、
Stop を検証用に挿入して、中断モードダイアログを出さずにマクロを止め、内容を確認してはいかがでしょうか。

自身の読解力のなさに、情けなくなりました。
    • good
    • 0
この回答へのお礼

Qchan1962 さん、度々の投稿、恐れ入ります。
 
>エラーメッセージと言う文字に私は、誤解してしまっていたようです。
→ こちらの文章能力にも問題があるのだと思うので気にしないで下さい。

>Stop (文字数オーバーの為、省略) 内容を確認してはいかがでしょうか。
→ これも試して見たのですが、ステップイン動作に持ち込めず意味がありませんでした。

 なお、今回作成したマクロは以下の通りです。

Sub IE_Scraping()

'IEの立ち上げ
Set IE = CreateObject("InternetExplorer.Application")
IE.Visible = True
IE.navigate "https://www.google.com/"
Do While IE.Busy Or IE.readyState < READYSTATE_COMPLETE
DoEvents
Loop
'データ取り込み(r、c の定義省略)
r = 0
c = 0
Sheets("SheetA").Select
'■初期化
Cells.NumberFormatLocal = "G/標準"
Rows.RowHeight = 15
'データ取得、整理
Set Doc = IE.document
For i = 0 To Doc.all.Length - 1
If Doc.all(i).tagName = "TH" Or Doc.all(i).tagName = "TD" Then
Cells(r, c) = Doc.all(i).innerText
c = c + 1
ElseIf Doc.all(i).tagName = "TR" Then
r = r + 1
c = 1
End If
Next i
'------------ データ処理 -------------
'IEの終了
IE.Quit
Set IE = Nothing

End Sub

お礼日時:2019/10/12 14:41

一度回答を書いたので、気は進まないけど検証しました。


エラーとは、1004ですよね?
参考先のコードでも、新規ブック、自ブック共に、ターゲットサイトがご質問にある IE.navigate "https://www.google.com/" ではエラーが出ました。
ただし、実行前にクリップボードに値がない場合です。該当フォーマットデータがクリップボードにあれば、当然エラーは出ません。"テキスト"ならテキストでもエラーは出ませんでした。
ターゲットサイトを参考サイトにあるアドレスで実行するとご質問のコードでもエラーは出ません。


コード自体は、エラーが出る場合も出ない場合も、IE.ExecWB 17, 0 '全選択、IE.ExecWB 12, 0 'コピーが実行されています。
しかし、エラーが出る場合は、IE.ExecWB 17, 0 '全選択でターゲットWebページは全選択されませんでした。(IE.ExecWB 12, 0 以下をコメントアウトしブラウザを確認)
従って、IE.ExecWB 12, 0は内をコピーしているのか不明ですが、クリップボードに何も入りません。
私が推測するのは、すでに#1で示しように、ターゲットサイトの挙動にあるのではないでしょうか?そう想定するとターゲットに合わせコマンドなどを送り、ターゲットがアクティヴ?最前面?などにして捕まえてからIE.ExecWB 17, 0、、、となるようにする必要があるのではないでしょうか。。あくまで想定の範疇ですが。

IEのバージョンは、独自にあると思っていましたが、、Windows7ならIE何々と決まっているのでしょうか?

訂正します。#1の回答にある VBEをクリックなどをして知らずにインスタンスをVBEに戻しています。これは、他のアプリケーションを扱う場合も同様です。
これは、VBE事態をVBAで操作している場合や他のアプリ(アクセスなどのインスタンスを操作して(アクセス側でVBAを走らす)実行するなどの場合に
該当するコメントでした。今回の事象には該当しないかと思います。

数百Webページを対象とするとあるので、取敢えずエラー回避コードなどでコピーできないのを飛ばしては、、同時にNGなアドレスを抽出するとか、、
IE.ExecWB 17, 0の前にClipboardは、コードで空にする必要がありますが、

IE.ExecWB 12, 0


cbData.GetFromClipboard
If cbData.GetFormat(1) Then
Else
'ここでWebアドレスを抽出する
GoTo NothingClipboard ’ActiveSheet.PasteSpecial Format:="HTML"を飛ばす
End If
みたいな、、。
エラーになったアドレスが入るようにすれば、検証できるかと思います。

全てわかっている事と思いますが、訂正があったので、、です。
この回答への補足あり
    • good
    • 0
この回答へのお礼

補足コメントは、間違った情報のままでは拙いので追加したものですが態態検証して頂いたとの事で感謝します。
 
>エラーとは、1004ですよね?
→ 1004とは出ず、標記のように「中断モードでは~。」と出るだけです。
 データを貼り付ける前にクリップボードに目的のデータがある事は確認しています。
 
>私が推測するのは、すでに#1で示しように、ターゲットサイトの挙動にあるのではないでしょうか?
→ この可能性についてよくは判りませんが、IE.ExecWB を使わずに全選択、コピーができ、且つデータ処理のできるマクロが「Excel VBAでIEを思いのままに操作できるプログラミング術(インプレス刊)」なる教本に載っていたサンプルマクロを殆どそのままパクって以下のようなマクロを組んだところ、「中断モードでは~。」のエラーメッセージは無くなり、ステップインでの操作ができるようになりました。
 ただ、For ~ Next 文のデータ処理の中味が見えないので、その処理途中でエラーが出てもトラブルシューティングができないという問題が新たに発生してしまいました(この場合のエラーは特定のサイトで発生)。

   (マクロをここに載せると文字数オーバーとなってしまうので、補足コメントをご覧下さい。)

>Windows7ならIE何々と決まっているのでしょうか?
→ 現在使用している Win7では IE8でしか動作しないので他のバージョンでの検証はできません。
 只、今回は Win10でも同じ状況なので IEのバージョンとは無関係と思われます。
 
>数百Webページを対象とするとあるので、取敢えずエラー回避コードなどでコピーできないのを飛ばしては、、同時にNGなアドレスを抽出するとか、、
→ エラー回避コードや Application.DisplayAlerts を試してみたのですが、どの場合も無視されて機能しません。

>エラーになったアドレスが入るようにすれば、検証できるかと思います。
→ 現状の検証の結果では、対象のサイト以前の問題だと思われます。

 今回はマクロまで書いて頂き有り難うございました。
 一応、数日間はここを閉じずにおきますが、特に何も無ければクローズします。
 Qchan1962 さんにはこれに懲りずに、また何かあれば宜しくお願いします。

お礼日時:2019/10/12 11:46

こんにちは、


>ステップバイステップで各行をチェックして行くと、下記に提示したマクロの後方の ActiveSheet~ で始まる貼り付けの行で標記のようなエラーメッセージが表示されてしまい、それ以降の>デバッグが困難になってしまいます。

ステップバイステップで各行をチェックして行くと、実行インスタンスがIE.navigateでIEに渡りますが、その状態ではステップ実行が出来ません。
おそらく、VBEをクリックなどをして知らずにインスタンスをVBEに戻しています。これは、他のアプリケーションを扱う場合も同様です。
したがって、IE.ExecWB 17, 0 '全選択、IE.ExecWB 12, 0 'コピーは、VBE側で実行されます(または、実行されない)なので、クリップボードにあるデータの種類によっては、
1004エラーになったり””がペーストされたり、現行あるクリップボードデータが張り付いたりします。

挙動の確認などは、取り敢えず、Debug.Printで行うのが良いかと、、

>このエラー有無の違いは、画像を含んでいるか否かのようにも思われます。
これは該当しないと思われます。

IE.navigate "https://www.google.com/" これは、404ですが、、
抽出先サイトですが、アクセスと同時にアラートやアイフレームなどでIEから見てページがアクティブでない為、全選択できないページがあります。
その場合、当然クリップボードは空か前のコピーデータです。サイトを変えて調整した方が良いかと
また、検索文字などを入力させ、遷移後 IE.ExecWB 17, 0 を実行してみてはいかがでしょうか。。

実行しようとしている処理は、ブラウザに依存する部分が多くあるます。
IEのバージョン、設定確認なども気に留めてください。また、他のブラウザで実行するなども選択種にはあります。

ちなみに、こちらを参考にしているかと思いますが、https://ken3memo.hatenablog.com/entry/20091227/1 …
サイト内のコメントにあるように、上記の理由などですべてに対応できないと思います。

私もちょっと試しましたが、やはりページ内でアクセスと同時にアイフレームやアラート、テキストボックスなどがアクティブになるサイトでは
うまくコピー出来ないようでした。

全部コピペは、貼り付けたものを整理するの大変ではありませんか?画像が欲しいのかな?
この回答への補足あり
    • good
    • 0
この回答へのお礼

Qchan1962 さん、懇切丁寧な説明を有り難うございました。
 投稿して1週間経過してゼロ回答だったので諦め掛けていたところでした。
 Qchan1962 さんのコメントに対しては以下のように記したのでお読み下さい。

>抽出先サイトですが、アクセスと同時にアラートやアイフレームなどでIEから見てページがアクティブでない為、全選択できないページがあります。
その場合、当然クリップボードは空か前のコピーデータです。サイトを変えて調整した方が良いかと
→ クリップボードには全選択したデータが格納されているのは確認しています。
 これは私が試した他のサイトでも同じでした。
 ステップバイステップしてエラー行で現れる窓で「継続」ボタンを押せばデータが貼り付けられています。

>また、検索文字などを入力させ、遷移後 IE.ExecWB 17, 0 を実行してみてはいかがでしょうか。。
→ このマクロはでは100近いサイトを巡回させる予定なので、この方法はとれません。

>実行しようとしている処理は、ブラウザに依存する部分が多くあるます。
IEのバージョン、設定確認なども気に留めてください。また、他のブラウザで実行するなども選択種にはあります。
→ 他のブラウザを使う場合、Selenium Basicなるライブラリファイルをインストールする手があるとの事でChromeで試してはみたのですが、SP1無しのWindows 7 の為か動作しないようです。
 IEのバージョンについては本文中にも記したように、2種類で実施しています。

>ちなみに、こちらを参考にしているかと思いますが、https://ken3
サイト内のコメントにあるように、上記の理由などですべてに対応できないと思います。
→ このサイトも以前に覗いているのですが、形式は殆どサンプルマクロと同じなので試していませんでした。
 今回、ダメ元でコピペして試行した所、どういう訳かエラー無しで実行できてしまいました。
 その理由はこれからじっくり考えてみようと思いますが、取り敢えず解決したのでお礼申し上げます。
 なお、画像は必要はありませんし、"HTML" モードでは画像貼り付けはしないようです。
 
 今回は御蔭様にて問題を解決する事ができました。感謝致します。
 今後も機会があれば宜しくお願いします。

お礼日時:2019/10/06 18:32

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


人気Q&Aランキング