EXCEL VBAでURLの内容を取得できない

このQ&Aのポイント
  • EXCEL VBAでURLの内容を取得する際、一部のURLで取得ができない場合があります。
  • 特定のURL画面にインプット用の記述があると、内容の取得ができない可能性があります。
  • 解決方法を教えていただけると助かります。(使用環境:Win7 64B EXCEL2010 IE11)
回答を見る
  • ベストアンサー

EXCEL VBAで URLの内容 が取得できない

EXCEL VBA で VBAサンプルを参考にして、下記により、URLの内容を得ようとしていますが、できません。 どうも、URL画面の中に インプット用の記述があると、できなくなるのでは、と推測していますが、できるケースもあるようです。解決方法があるようでしたら、教えていただけますでしょうか? (Win7 64B EXCEL2010 IE11です。)' Sub URL取得TEST() On Error GoTo Er1 Dim StrUrl As String StrUrl = InputBox("URLを指定", "URL入力", "http://www3.nhk.or.jp/nhkworld/") ' これは 読み込めます StrUrl = InputBox("URLを指定", "URL入力", "http://uwl.weblio.jp/") ' これが読み込めません Dim objIE As Object Set objIE = CreateObject("InternetExplorer.application") objIE.Visible = True objIE.FullScreen = False objIE.Top = 200 objIE.Left = 100 objIE.Width = 800 objIE.Height = 600 objIE.navigate StrUrl While (objIE.readyState <> 3 And objIE.readyState <> 4) Or objIE.busy = True DoEvents Wend DoEvents Workbooks.Add objIE.ExecWB 17, 0 objIE.ExecWB 12, 0 Sheets.Add ActiveSheet.name = "Format テキスト" Range("A1").Select ActiveSheet.PasteSpecial Format:="テキスト" objIE.ExecWB 17, 0 objIE.ExecWB 12, 0 Sheets.Add ActiveSheet.name = "FormatHTML" Range("A1").Select ActiveSheet.PasteSpecial Format:="HTML" '別のURLでテキストOKでこれはだめというケースあり ' objIE.Quit Set objIE = Nothing Exit Sub ' Er1: objIE.Quit Set objIE = Nothing End Sub

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

  • ベストアンサー
  • ki-aaa
  • ベストアンサー率49% (105/213)
回答No.3

試してみて objIE.navigate StrUrl While (objIE.readyState <> 3 And objIE.readyState <> 4) Or objIE.busy = True DoEvents Wend DoEvents objIE.Document.body.Focus

その他の回答 (8)

  • kumatti1
  • ベストアンサー率60% (73/121)
回答No.9

IE11と言う事で「拡張保護モード」が有効になってるのではないでしょうか。 無効にされるとか。

sei1miyata
質問者

補足

「拡張保護モード」は 無効となっていました。 ほかの方の別方法でも、ある方はダメだったというように、PCの設定等で なにかにより、微妙な支障がでてくるということなのでしょうか ありがとうございました。

  • kumatti1
  • ベストアンサー率60% (73/121)
回答No.8

>単純に このままでは 不能なのでしょうか >JavaScriptだから、何かの設定が必要とかがあるのでしょうか 確認してみましたが、示されてる「Weblio英単語帳」のページでは上手くいきますが。

sei1miyata
質問者

補足

示していただいた内容を  While (objIE.readyState <> 3 And objIE.readyState <> 4) Or objIE.busy = True DoEvents Wend DoEvents objIE.document.forms("login").Item("email").blur Workbooks.Add と修正して、試しましたが、Workbooks.Add へ いかずに Er1:エラーへ 移動します。 なにかの 原因・影響があるのでしょうか?

  • kumatti1
  • ベストアンサー率60% (73/121)
回答No.7

ExecWBでなくても、 objIE.Document.body.createTextRange.execCommand "Copy" で可能かも。

sei1miyata
質問者

補足

ためしてみましたが、『「空欄」のテキストエリア(=ログインメールアドレスの欄)が選択されてしまうため  ---』という部分で、不能になっているようです。 なにもないページでは、できました。

  • kumatti1
  • ベストアンサー率60% (73/121)
回答No.6

>objIE.document.forms("login").Item ("email"), Blur() 失礼。JavaScriptの構文なので()は余計でした。ついでに.のはずがカンマになってました。 objIE.document.forms("login").Item ("email").Blur

sei1miyata
質問者

補足

単純に このままでは 不能なのでしょうか JavaScriptだから、何かの設定が必要とかがあるのでしょうか

  • oka_me
  • ベストアンサー率86% (26/30)
回答No.5

#1です。補足に対しまして・・・ 例えば1個目のURLは、IEの通常操作でページを開くと、「ページそのもの」にフォーカスがある(と思われます)ので、そのままの状態ですべて選択(Ctrl+A)でコピペできますが、2個目のURLの場合、開いた時点で「空欄」のテキストエリア(=ログインメールアドレスの欄)が選択されてしまうため、空のテキストエリアから全て選択しようとしても、空ですので当然何も選択されません。 (これが例えばテキストエリアにデフォルト仕様で何か文字が入力されている場合、その文字列がコピーされエクセルに貼り付けられるかと思います) 私の知識が不足していたために汎用性のある解決法が思い付きませんでしたが、#3の方が回答されているように「objIE.Document.body.Focus」を追加することで基本的にどのURLでも貼り付けられるようになるかと思います。 (私も勉強になりました、ありがとうございます。。。) #3の方の補足で「他のウェブページが開いていると~」とありましたが、少なくとも私の環境ではその状態でも問題無く動作しました。。

  • ki-aaa
  • ベストアンサー率49% (105/213)
回答No.4

直前の回答者ですけど 実行時に、ほかのウェブページを表示していると 下のコードを使ってもだめみたいです。 objIE.Document.body.Focus

  • kumatti1
  • ベストアンサー率60% (73/121)
回答No.2

私も知らなかったので「html Focus 外す」でググりました。 objIE.navigate StrUrl While (objIE.readyState <> 3 And objIE.readyState <> 4) Or objIE.busy = True DoEvents Wend DoEvents objIE.document.forms("login").Item ("email"), Blur() 「Weblio英単語帳~TOEICやTOEFLなどの勉強にも使える英語学習サービス~」で、 ログインメールアドレスのテキストボックスにフォーカスが当たってるのでそれを外すとか。

sei1miyata
質問者

補足

Blur() のところで ストップしています どんな DIM が 必要なのでしょうか お教えください。

  • oka_me
  • ベストアンサー率86% (26/30)
回答No.1

対象のURLを開いた際にCtrl+Aを押してみて、ページ全体が選択されれば読み込めるページ、何も選択されなければ読み込まれないページかと思います。 開いた際に例えばテキストエリアにフォーカスが移動されてしまうようなページは(検索サイト系はそのような所が多そうですが)、そのままではページ全体の選択がされないため読み込まれなくなってしまうかと思います。 例えば質問文にある2個目のURLはTABを2回押してフォーカスをテキストエリアの外に出してやった後にExecWB 17, 0で選択できますので DoEvents の下あたりに SendKeys "{tab}" SendKeys "{tab}" のような記述を追加してやればとりあえずこのケースでは解決できると思いますが、この方法ではURL毎に対処法を変えてやる必要がありそうなのであまり良い回答ではないかと思われます。。。 (例えば、YahooのトップページなどはTABを7回ぐらい押してやっとフォーカスが外れます) もしかしたら他の方がもっと汎用性のある解決法を提示してくださるかもしれませんm(_ _)m

sei1miyata
質問者

補足

『開いた際にCtrl+Aを押してみて』というのは、タイミングがあるのでしょうか? どんな状態が 『ページ全体が選択される』『されない』なのかを 具体的に教えていただけますでしょうか? 下段の回答のほうは、うまくできました。

関連するQ&A

  • EXCEL VBA で URL内容を 取得できない

    EXCEL VBAで URLの内容を取得しようとしていますが、URLの内容中に FINNAIRの広告ラベル? がトップにでてくる場合には URLの内容が取得できません。広告ラベルが 時々に変更されますが、FINNAIR以外の 広告ラベルの場合は URLの内容を取得できます。 FINNAIRの 広告ラベルも 取得できるようにするには、どうすればいいのでしょうか? FINNAIRの広告ラベルは、短時間のうちに 変化しているようです。なぜ、取得できないのか、まったくわかっていません。 解決方法を教えていただきたく、よろしくお願いします。 Sub IEデータ取得() Dim IE As Object Set IE = CreateObject("InternetExplorer.Application") IE.Visible = True IE.navigate "http://www.japantimes.co.jp/news/" While (IE.readyState <> 4) Or IE.busy = True DoEvents Wend DoEvents IE.document.body.Focus IE.ExecWB 17, 0 IE.ExecWB 12, 0 Excel.Application.CutCopyMode = False Sheets.Add.name = "Formatテキスト" Range("A1").Select ActiveSheet.PasteSpecial Format:="テキスト" IE.Quit Set IE = Nothing End Sub

  • サイトのページの全体をコピーしてエクセルに貼り付け

    サイトのページの全体をコピーしてエクセルに貼り付けたいのですが http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1341770528 を参考にしたのですが Sub test() Dim objIE As Object Set objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True objIE.Navigate "http://www.goo.ne.jp/" While objIE.ReadyState <> 4 DoEvents Wend objIE.ExecWB OLECMDID_SELECTALL, OLECMDEXECOPT_DODEFAULT '17,0 objIE.ExecWB OLECMDID_COPY, OLECMDEXECOPT_DODEFAULT '12 DoEvents Workbooks.Add DoEvents Range("A1").Select ActiveSheet.PasteSpecial Format:="テキスト", Link:=False, DisplayAsIcon:=False End Sub をしたのですが、うまくコピーできていません。 一番最後にコピーした文字がセルに張りついてしまいます。 なぜでしょうか?

  • WEB画面をエクセルのセルに貼り付けるマクロ

    過去の回答を参考にエクセルでWEB画面をすべて選択しエクセルの所定のセルに貼り付けするマクロを作成しました。処理を追加していった結果、下記のようなマクロが完成しました。ステップインで動作確認できましたが、マクロ実行から動かすと途中で止まります。 止まる箇所は、 While objIE.readyState <> READYSTATE_COMPLETE Or objIE.Busy = True DoEvents Wend DoEvents この記述でWEBが遅く開く時に対応するよう作成しましたが、ここで止まります。(抜け出せません) また、この記述を削るとステップインではうまく動きますが、マクロの実行から動かすと何回目かで objIE.ExecWB 17, 0 すべて選択するときに止まります。 どこが悪いのか教えていただけないでしょうか? 使用、作成したのは、excel2007 及びexcel2010です。どちらでも動きません。 よろしくお願い致します。 Sub test() Dim URL As String Dim URL2 As String Dim URL3 As String Dim CD As String Dim i As Integer For i = 1 To 199 CD = Worksheets("CD").Cells(i + 1, 1).Value URL2 = "貼り付けたいWEBのURL" URL3 = CD ’縦一列にコードを入力しているシート URL = URL2 & URL3 Dim objIE As Object Set objIE = CreateObject("InternetExplorer.application") objIE.Visible = True objIE.navigate URL While objIE.readyState <> READYSTATE_COMPLETE Or objIE.Busy = True DoEvents Wend DoEvents objIE.ExecWB 17, 0 objIE.ExecWB 12, 0 Sheets.Add ActiveSheet.Name = 199 - i Range("A1").Select ActiveSheet.PasteSpecial Format:="HTML" objIE.Quit Set objIE = Nothing Next End Sub よろしくお願いいたします。

  • エクセルVBAの値貼り付けについて

    いつもお世話になっております。 エクセルVBAについての質問ですが 以下のコードを使用するとどうしても元の書式の貼り付けになってします。 値(テキスト)貼り付けを実行したいのですがどこのコードをどのように変えればいいか教えてください。 ------------------------------------------------------------------------------------------- Sub IE_Open_Copy() Dim objIE As Object Const OLECMDID_SELECTALL = 17 Const OLECMDID_COPY = 12 Const OLECMDEXECOPT_DODEFAULT = 0 Const URL As String = "https://okwave.jp/question/" Set objIE = CreateObject("InternetExplorer.Application") With objIE .Visible = True .Navigate URL Do While .Busy DoEvents Loop Do Until .ReadyState = 4 DoEvents Loop .ExecWB OLECMDID_SELECTALL, OLECMDEXECOPT_DODEFAULT .ExecWB OLECMDID_COPY, OLECMDEXECOPT_DODEFAULT Application.Wait Now() + TimeValue("00:00:05") .Quit End With AppActivate Application.Caption, True Range("A1").Select Application.Wait Now() + TimeValue("00:00:05") Application.SendKeys "^v" Set objIE = Nothing End Sub ---------------------------------------------------------------------------------------------

  • EXCEL VBA IEからダウンロード

    まず以下のコードを見てください(一部を抜粋) objIE.Navigate URL02 Do While objIE.Busy = True DoEvents Loop objIE.ExecWB OLECMDID_SELECTALL, OLECMDEXECOPT_DODEFAULT objIE.ExecWB OLECMDID_COPY, OLECMDEXECOPT_DODEFAULT Application.Wait Now() + TimeValue("00:00:05") objIE.Quit Worksheets("商品情報").Select Range("A2:J100").Clear Range("A2").Select Application.Wait Now() + TimeValue("00:00:05") Application.SendKeys "^v", True とりあえずこれで使えてはいるのですが、これだと一度IEを終了することになるので、終了せずにエクセルのシートにペーストしたいと思いobjIE.Quitを削除しました。 そうしたらコピーまではするのですがペーストしなくなってしまいました。 なんとかIEを起動したままでペーストしたいのですが、どう直したらいいですか?教えてください。 宜しくお願いします。

  • vbaでIEを閉じるだけの処理

    オフィス2003を使用しています。 「IEを開いて閉じる」は Sub TEST() Set ObjIE = CreateObject("InternetExplorer.application") ObjIE.Visible = True '見えるようにする '文字列で指定したURLに飛ぶ ObjIE.navigate "http://www.yahoo.co.jp/index.html" '表示終了まで待つ Do While ObjIE.Busy = True DoEvents Loop ObjIE.Quit End Sub と言うことがわかったのですが 開くのは他の作業をしたときに行うので 「閉じる」だけをvbaで行いたいのですがどうすればいいのかわかりません。 Sub TEST2() Set ObjIE = CreateObject("InternetExplorer.application") ObjIE.Visible = True '見えるようにする ObjIE.Quit End Sub だと また新たなIEが起動してしまい「現在起動しているIEを閉じる」と言うことができません。 アドバイスをお願い致します。

  • オブジェクト変数またはWithブロック変数が設定されていません

    はじめまして質問させていただきます。 Webページからコピー&ペーストしたものを必要な情報だけ 抜き出すものを作成中です。 1ページ目は成功していますが 2ページ目の objIE.Navigate url の行で 実行時エラー'91' オブジェクト変数またはwithブロック変数が設定されていません。とでてしまします。 解決策をご教授お願いします。 Dim objIE As Object Dim url As String Dim tai As String Dim aku As String Dim uot As String Dim i As Integer Set objIE = CreateObject("InternetExplorer.application") objIE.Visible = True x = 1 For i = 1 To 20 url = Worksheets("データ").Range("E" & i) objIE.Navigate url Do If objIE.Busy = False And objIE.readyState = 4 Then Exit Do Loop objIE.ExecWB 17, 0 objIE.ExecWB 12, 0 Sheets.Add ActiveSheet.Name = "1" Range("A1").Select ActiveSheet.PasteSpecial Format:="テキスト" objIE.Quit: Set objIE = Nothing tai = Worksheets("1").Range("A13") aku = Worksheets("1").Range("A63") uot = Worksheets("1").Range("A64") Worksheets("データ").Select Range("A" & i) = tai Range("B" & i) = aku Range("C" & i) = uot Application.DisplayAlerts = False Worksheets("1").Delete Application.DisplayAlerts = True Next i

  • (VBAマクロ)複数月に渡る過去の天気の取得方法

    現在、各サイトを参考にしながら、下記のコードで一ヶ月分は取得できていますが、複数月を取得する場合、どのようにすればいいでしょうか。  たとえば2014年12月1日~2015年1月17日の期間 Excel2013を使用していますが、外部データの取り込みではエラーが出るため、使用していません。 Sub Main() Application.ScreenUpdating = False '画面更新禁止 Dim objIE As Object Set objIE = CreateObject("InternetExplorer.Application") 'IEを開いて非表示 objIE.Visible = False yy = Range("a1").Value mo = Range("B1").Value da = Range("C1").Value '指定URLへ移動する objIE.Navigate "http://www.data.jma.go.jp/obd/stats/etrn/view/daily_s1.php?prec_no=74&block_no=47893&year=" & yy & "&month=" & mo & "&day=" & da & "&view=" '表示完了を待つ .readyState と .Busy を見る While objIE.readyState <> 4 Or objIE.Busy = True 'IEがBusyの間 待つ DoEvents Wend DoEvents '表示待ちここまで 'Tableタグを抜き出す Dim objT As Object 'テーブルオブジェクトの格納用 Set objT = objIE.document.all("tablefix1") '.all("id名前")でテーブルタグを抜く If objT Is Nothing Then '↑上で見つかったか? MsgBox "err 表が見つかりません、 IDを確認してください。" Exit Sub 'エラーなので抜ける。 End If Dim x As Integer '列の管理 Dim y As Integer '行の管理 'Worksheets(3).Select 'Webの表をシートへ転記(代入する) For y = 0 To objT.Rows.Length - 1 '行のループ For x = 0 To objT.Rows(y).Cells.Length - 1 '列数分ループ Worksheets(3).Cells(y + 2, x + 1) = objT.Rows(y).Cells(x).innertext '↑y+1 1行目から書き出す、11行目にするには y+1+10に変更する Next Next 'objIE.ExecWB 17, 0 'OLECMDID_SELECTALL = 17 全てを選択 'objIE.ExecWB 12, 0 'OLECMDID_COPY = 12 コピー 'Range("A1").Select 'ActiveSheet.PasteSpecial Format:="HTML" 'HTML形式で貼り付ける objIE.Quit '.QuitでIEを閉じる '使用したオブジェクト変数を空に。 Set objT = Nothing Set objIE = Nothing Worksheets(2).Select Application.ScreenUpdating = True '画面更新 End Sub

  • 「ページが表示されました」まで取得したい

    IEを立ち上げてステータスバーのテキストを取得して、 「ページが表示されました」を取得出来たら、次のコードへ進みたいのですが、 下のコードでStatusTexttを書き出しても「ページが表示されました」まで取得できません。 Sub test() Dim objIE As InternetExplorer Dim i As Long Set objIE = CreateObject("InternetExplorer.Application") objIE.Navigate "http://www.goo.ne.jp/" objIE.Visible = True Workbooks.Add Cells(1, 1) = objIE.StatusText i = 2 Do While objIE.Busy = True Or objIE.ReadyState <> 4 DoEvents Cells(i, 1) = objIE.StatusText i = i + 1 Loop Cells(i, 1) = objIE.StatusText Set objIE = Nothing End Sub Do While objIE.Busy = True Or objIE.ReadyState <> 4 ここら辺のコードを弄ればいいような気がしますが、うまくいきません。 ご回答よろしくお願いします。

  • 現在表示されているURLを取得したいのですが

    Sub test1() Dim objIE As InternetExplorer Set objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True objIE.Navigate "http://www.goo.ne.jp/" Do While objIE.Busy = True Or objIE.ReadyState <> 4 DoEvents Loop Debug.Print objIE.Navigate Set objIE = Nothing End Sub //////////////////////////////////////////////// をやろうとすると、 Debug.Print objIE.Navigate の部分で、「引数は省略できません。」とエラーになります。 どう修正すればいいか教えてください。 ("http://www.goo.ne.jp/"はダミーです)

専門家に質問してみよう