[[20190603175945]] 『サイトタイトルを取得するマクロを高速化』(ブルーライン) ページの最後に飛ぶ

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

 

『サイトタイトルを取得するマクロを高速化』(ブルーライン)

下記のマクロは、指定したURLの隣にサイトタイトルを取得するマクロです。

このマクロで、サイトタイトルを取得していましたが、
5秒に1つくらいのペースなので、もっとスピードを上げたいと思っています。

「InternetExplorerオブジェクト」

「XMLHTTPオブジェクト」

へと変更すれば、高速化ができるそうですが、
どこをどのように変更すればいいか分からないです。

高速化するには、どこをどのように修正すれば良いでしょうか?
また、変更するべき設定などもあったりするでしょうか?

Sub sample()
Dim Carea As Range
Set Carea = Selection
If Carea(1).Value = "" Then Exit Sub

Dim Tcel As Range

Dim ObjIE As Object
Set ObjIE = CreateObject("InternetExplorer.Application")

For Each Tcel In Carea

ObjIE.Navigate Tcel.Value

Do While ObjIE.Busy = True Or ObjIE.readyState <> 4
DoEvents
Loop

Tcel.Offset(, 1) = ObjIE.document.Title
Next

ObjIE.Quit
Set ObjIE = Nothing

End Sub

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


「XMLHTTPオブジェクト」がわかっているなら、「XMLHTTPオブジェクト VBA」というキーワードでググればいろいろと出てくると思いますが。。。。

とりあえず、以下のサイトに簡単なサンプルがあります。
[エクセルVBAでIEを使わずにHTMLドキュメントを取得する方法]
https://tonari-it.com/excel-vba-http-document-write/

こちらのサンプルで、タイトルも取得もしています。

なお、アクセスする先のURLは可変のようですが、
アクセスする先のページのエンコードによっては文字化けします。
アクセスする先が決まっていないのであれば、アクセスする先のエンコードもわからないので、
以下の情報を参考に、エンコードの考慮が必要です。
https://oshiete.goo.ne.jp/qa/5123536.html

また、HTTPオブジェクトでアクセスする際は、"GET"と"POST"があります。
私はあまり詳しくはありませんが、これもアクセスするサイトによって異なるとの認識です。
「GETとPOSTの違いについて」
https://qiita.com/kanataxa/items/522efb74421255f0e0a1

"GET"と"POST"の判断をどのようにするのかも別途考慮する必要があると思います。
(私なら、とりあえず確率的に高い”GET”で実行して、エラーになれば"POST"で試すという処理にしますが。)

上記以外にも「保護されている通信に保護されていない状態でアクセスすると失敗する」という注意点もあるようです。

特定のサイトの情報を取得するのであれば、そのサイトにあわせて作ればよいですが、URLが可変となると考慮する点を多く、自分自身がちゃんと理解して作成しないと対応できない方法だと思います。

なお、具体的なコード・修正個所は私は記載しませんのでご了承ください。

(う) 2019/06/04(火) 15:02


たびたびすみません。

ちなみに、もともと自分で作っていた「ホームページからデータを取得するマクロ」を、XMLHTTPオブジェクトに変更して試してみましたが、IEオブジェクトの場合と比較して速度は、ほぼ変わりませんでした。
(同じURLへの2回目以降の処理速度の違いはありましたが。。。)

変更することによる効果があるのかわかりかねるため、今のファイルは残しておいて、別ファイルで試してみた方が良いと思います。

なお、私の環境は、Excel2013およびWindows7なので、ブルーラインさんの環境だと違うのかもしれません。
また、IEは起動しないので、IEのアドオンをのっけまくりでIEの起動が遅い環境とか、アクセスする先のページがやたらとでっかい画像があったりゴテゴテして表示に時間がかかるようなページだと早くなるのかもしれないですが。(※想像です)
(う) 2019/06/04(火) 15:50


 こんばんは。

 (1)
 文字コードが予めわかっているなら、ことは簡単です。
 ・responseBodyをいったんbinaryでADODB.streamに書込み、
 ・それをテキストモードに変えて、文字コードを指定したうえで
   .ReadText()すれば、対応したコードの文字列が得られます。

 (2)
 通常は、そのサイトで使用している文字コードは予めわかりませんから、
 問題は、そのサイトの文字コードを知る方法です。

 幸いHTMLファイルは自己の文字コードを指定していますからこれが利用できます。
 responceTextを取得して、それに対して、pattern = "charset=(.*?)"""で
 マッチするところを取得すれば文字コードが取得できます。
 (utf-8,shift_jis,x-sjis,euc-jpのサイトでいくつか試してみましたが、
   うまく取得できました。)

 (3)
 あとは、判明した文字コードを指定して(1)を使えばいいです。

 (4)
 タイトル部分の文字列を取得するのは、正規表現でも、
 Instrでも何でもOKでしょう。

 なお、コードは載せません。
 もともと現実の話でも無いように思いますし、
 少々の速度向上よりも話を単純にしておいたほうが得策です。

 -----------
 ちなみに、これに関連する記事を検索してみましたが、
 ちょっとおかしな記事も見られますね。

 (a)
 別の質問掲示板の回答で引用されたサイトの記事に
 下記のようなコードがありました。

 Set http = CreateObject("MSXML2.XMLHTTP")
 http.Open "GET", "http://example.com/", False
 http.Send
 ' ダウンロード待ち
 Do While http.readyState <> 4
 Loop

 この時、「ダウンロード待ち」の処理は全く不要です。

 というのは、
 http.Open "GET", "http://example.com/", False
 の第三引数asyncをFalseに指定しているということは、
 サーバー側の処理が終わって情報が戻されるまで、
 VBA側の処理が先に進んでしまうことはありえません。
 (同期処理ということです)

 (b)
 charsetに "_autodetect_all"を指定して、ADODB.Streamを使えば、
 文字コードを自動判定してくれるという記事がありますが、
 そういうことはありません。間違いです。

(γ) 2019/06/04(火) 21:27


コメント返信:

[ 一覧(最新更新順) ]


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