- 締切済み
下記のマクロをもっと早くするには?
下記のマクロは、 A列にあるURLがSSL化(https)されているかを調べるものです。 このマクロを動かすと、大体3秒に1つのURLを調べるくらいの早さです。 もっと早く調べられるようにするには、どのような記述にすればできるでしょうか? また、エクセルの他の設定で、マクロを早くできたりしますか? よろしくお願いいたします。 Sub SSL() Dim objHttp As Object Dim nURL As String Dim strURL As String Dim i As Long, f As String, l As String Dim Lastrow As Long, getLine As Long Set objHttp = CreateObject("WinHttp.WinHttpRequest.5.1") On Error GoTo ErrHandler 'A1から getLine = Cells(Rows.Count, 2).End(xlUp).Row Lastrow = Cells(Rows.Count, 1).End(xlUp).Row If getLine = Lastrow Then MsgBox "既に終わっているか、データがないです。", vbExclamation: Exit Sub If getLine < Lastrow And Cells(1, 2).Value <> "" Then getLine = getLine + 1 Else getLine = 1 '最初の行が1行目からの場合 End If For i = getLine To Lastrow strURL = LCase(Trim(Cells(i, 1).Value)) 'A列の登録URL strURL = Replace(strURL, "https:", "http:") If strURL Like "http*" Then objHttp.Open "GET", strURL, False objHttp.send DoEvents 'ESC割り込み可能にする With objHttp If .Status = 200 Then nURL = .Option(1) 'WinHttpRequestOption_URL f = Mid(strURL, 1, InStr(strURL, "://")) l = Mid(nURL, 1, InStr(nURL, "://")) If nURL = "" Then Cells(i, 2).Value = "no URL" ElseIf nURL <> "" Then If LCase(f) = LCase(l) Then Cells(i, 2).Value = "non SSL" Else Cells(i, 2).Value = "https" End If End If Else Cells(i, 2).Value = "Err:" & .Status End If End With End If Endline: nURL = "" strURL = "" Next i MsgBox "Finished" Exit Sub ErrHandler: If Err() <> 0 Then Cells(i, 2).Value = Err.Number 'マイナスになるのは外部エラー GoTo Endline End If End Sub
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- superside0
- ベストアンサー率64% (461/711)
もし、 外部コンテンツを取り出しているところが遅いのだったら インターネット環境を改善するしかないでしょうけど、 > objHttp.Open "GET", strURL, False のとこを "GET"でコンテンツを全部取り出すんじゃなくて、 "HEAD"にして、ヘッダーのみ取り出すだけに変更したら そのぶんは速くなるんじゃないかな。
- imogasi
- ベストアンサー率27% (4737/17069)
セルの値を読み書きして入り箇所があるから、 Application.ScreenUpdating = False Application.ScreenUpdating = True をいれるのは常識でしょう。 それに通信の回線にデータが出したり、受けている箇所があるのでは? それだと内部処理速度と桁違いに遅くなると思う。改善策はコードの問題ではないのでは?
- bardfish
- ベストアンサー率28% (5029/17766)
経験則での判断ですが・・・ Excel VBAはワークシートのセルを利用する処理がとにかく遅いです。 速度で言えばAccessのテーブルを使用した方が遙かに速い。テーブルの作り方やインデックスの貼り方にも影響されますが・・・ Visual Basic .NETからExcelファイルを利用するとよくわかります。 理由を調べてみると、どうやらExcelをVBAでCellを扱うときにはCOMオブジェクトと言って古い方法を未だに必要としているのが原因らしい。たぶんExcel VBAからも同じ事が言えるのではないだろうか? 今は.NET Frameworkというクラスライブラリを利用するのが当たり前。 だから、百数十万行のデータを処理するExcel VBAのシステムがあったんだけどAccessに移行したら処理時間が5分の1以下になりました。Accessの方でインデックスの最適化を行ったらさらに速くなった。 今はさらなる利便性を求めてVisualBasic + SQL Serverに移植しています。どちらも無料で利用できるので興味がわいたらMicrosoftのサイトからダウンロードしてみてください。