
下記は、"ソース内に指定したキーワードがあったら○が付くマクロ"です。
A列にあるURLのソースを調べるこのマクロは、それなりに早いのですが、
今回調べるURLの量がとても多くて、どうにかもっと早く調べるようにしたいです。
マクロをもっと早く調べていくようにするには、どのような記述でできるでしょうか?
よろしくお願いいたします。
Sub リンゴ()
'!!!! [Microsoft XML v6.0] に参照設定すること
Dim xHttp As IServerXMLHTTPRequest
Dim myErr_Number As Long, myErr_Description As String
Set xHttp = CreateObject("MSXML2.ServerXMLHTTP")
Dim aCell As Range
R = 1
For Each aCell In Selection.Columns(1).Cells '選択セルの1列目がURL
Application.GoTo aCell '対象URLの列にジャンプ表示
DoEvents
sUrl = aCell.Value
If sUrl <> "" Then
xHttp.Open "GET", sUrl, True
xHttp.setOption SXH_OPTION_IGNORE_SERVER_SSL_CERT_ERROR_FLAGS, _
SXH_SERVER_CERT_IGNORE_ALL_SERVER_ERRORS ' SSL関係のエラーを無視
On Error Resume Next
xHttp.send
If xHttp.readyState <> 4 Then
xHttp.waitForResponse 5 '5秒まってだめならタイムアウト
End If
If xHttp.readyState <> 4 Then Err.Raise 1004, , "タイムアウト"
myErr_Number = Err.Number
myErr_Description = Err.Description
On Error GoTo 0
If myErr_Number = 0 Then
sHtml = xHttp.responseText
nRtn = InStr(sHtml, "リンゴ")
If nRtn = 0 Then
aCell.Offset(, 1).Value = "--"
Else
aCell.Offset(, 1).Value = "○"
End If
Else
aCell.Offset(, 1).Value = myErr_Description ' エラー時はエラー内容を表示
End If
DoEvents
End If
Next
Set xHttp = Nothing
End Sub
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
#1です
実験的に書いてみましたが、環境に依存される部分が多いので早くなるかな?
Sub リンゴ1()
'!!!! [Microsoft XML v6.0] に参照設定すること
Dim xHttp As IServerXMLHTTPRequest
Dim myErr_Number As Long, myErr_Description As String
Dim R As Long, sUrl As String, sHtml As String, nRtn As String
Dim TagetAry As Variant, Ary As Variant, i As Long
Set xHttp = CreateObject("MSXML2.ServerXMLHTTP")
R = 1
If Selection.Columns.Count = 1 Then
TagetAry = Selection.Cells
ReDim Ary(Selection.Count)
Else
Exit Sub
End If
If Not IsArray(TagetAry) Then
ReDim TagetAry(1, 1)
TagetAry(1, 1) = Selection.Cells
End If
For i = 1 To UBound(TagetAry)
DoEvents
sUrl = TagetAry(i, 1)
If sUrl <> "" Then
xHttp.Open "GET", sUrl, True
xHttp.setOption SXH_OPTION_IGNORE_SERVER_SSL_CERT_ERROR_FLAGS, _
SXH_SERVER_CERT_IGNORE_ALL_SERVER_ERRORS ' SSL関係のエラーを無視
On Error Resume Next
xHttp.Send
If xHttp.readyState <> 4 Then
xHttp.WaitForResponse 5 '5秒まってだめならタイムアウト
End If
If xHttp.readyState <> 4 Then Err.Raise 1004, , "タイムアウト"
myErr_Number = Err.Number
myErr_Description = Err.Description
On Error GoTo 0
If myErr_Number = 0 Then
sHtml = xHttp.ResponseText
nRtn = InStr(sHtml, "リンゴ")
If nRtn = 0 Then
Ary(i - 1) = "--"
Else
Ary(i - 1) = "○"
End If
Else
Ary(i - 1) = myErr_Description ' エラー時はエラー内容を表示
End If
DoEvents
End If
Next
Selection(1).Offset(, 1).Resize(UBound(Ary)) = Ary
Set xHttp = Nothing
End Sub
Timerなどを差し込んでテストしてみてください。
No.1
- 回答日時:
こんばんは、
しばらく放置されているようなので回答を付けさせていただきます。
プロシージャ全体を考えるとターゲットサイトのレスポンスやトラフィック、通信帯域(速度)に大きく影響を受ける処理だと思います。
従って処理自体、対象を分け同時処理したり、非同期処理を模索したり、処理言語の変更なども考慮する必要があるかも知れません。
しかしながら、処理速度に対する要因は変わらず残ります。
極端に言うと遅い通信速度の環境から複数のアクセスをしても通信速度がネックになり改善が見込めないとか、、
>それなりに早いのですが
上記の影響を度返しにしてVBA的に時間がかかっている処理を変更する部分はあると思います。
同期通信で必要部分を除き、遅い部分Application.GoTo aCell
ループ内の aCell.Offset(, 1).Value = 位でしょうか、
簡単な方法はおなじみ Application.ScreenUpdating = False
これを使用しない場合、配列などに入れる方法になると思います。
(Application.GoTo aCellを別の方法にすればコレクション内のループなので変わらないかも)
変数Rが解らないのと速度を意識するのなら、変数宣言はした方が良いと思います。
続く
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【C#/Java?】try-catchでcatch...
-
シグナル 6(SIGABRT)とは?
-
エクセル VBAで複数セル選択時...
-
Excel VBA セルの名前があるか...
-
順番に処理させたい
-
Form オブジェクトの戻り値の設定
-
シェルスクリプトでファイル内...
-
VBA 複数の行を高速で削除する...
-
【VBA】エラー処理で別プロシー...
-
エクセル画面のちらつきなくす...
-
どう増強すべきか
-
どうやってもFor文を抜けてしま...
-
StatusStripの表示が更新されな...
-
RaiseEventのメリット
-
ExcelのVBAで、選択したファイ...
-
LoadPicture のオートメーショ...
-
private subモジュールを他のモ...
-
ExcelVBAのコントロールの種類...
-
eclipseのデバッグ中に変数の値...
-
VBA シートのボタン名を変更し...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【C#/Java?】try-catchでcatch...
-
private subモジュールを他のモ...
-
どう増強すべきか
-
Excel VBA セルの名前があるか...
-
vbaのエラー対応(実行時エラー...
-
IF文に時間(何時から何時ま...
-
特定の名前のオートシェイプの...
-
シグナル 6(SIGABRT)とは?
-
マクロで、次のコードへ行く前...
-
どうやってもFor文を抜けてしま...
-
【Vb.net】プリンタジョブの取得
-
特定のファイルを他のプロセス...
-
VB6にてネットワーク上にある共...
-
シェルスクリプトでファイル内...
-
【VBA】エラー処理で別プロシー...
-
cobolのコントロールブレイク
-
Functionで戻り値を複数返す方法
-
エクセル VBAで複数セル選択時...
-
【C#】Page_Loadさせない方法に...
-
ExcelのVBAで、選択したファイ...
おすすめ情報
Qchan1962さん、回答ありがとうございます!
書いていただいたマクロをやってみました。
前のマクロは、一つずつ調べていくのですが、
こちらは、一気に結果が表示されるみたいです。
調べたいURLは1万を越えるので、一つずつ結果が出たほうがいいかなと思いました。
そして、本来「○」が付くところが付かないところがありました。
質問のマクロは、だいぶ前に別の方に書いていただいたものです。
私自身、マクロについて知識がないのですが、早くさせるのはなかなか難しいのかもしれません。
どうにか、マクロを早くできたりしますでしょうか?