VBAでのインターネットアクセスのメモ

IEオブジェクトを使う

重たそう? 途中で対話形式に持ってゆけるので 認証処理がややこしいときは手動でなんとかできる。ページ保存はCSSや画像も一緒に保存できる。

Sub usingIE()
  Dim oIE as InternetExplorer
  Set oIE = CreateObject("InternetExplorer.Application")

  oIE.Width = 800
  oIE.Height = 600
  oIE.Left = 0
  oIE.Top = 0

  oIE.Visible = True

  oIE.Navigate "http://・・・・・・"
  Do Until oIE.Busy = False
     Application.Wait Time:=Now + TimeValue("00:00:01")
  Loop


  oIE.document.Title = "****" 'タイトルにするとファイル名になる
  oIE.execWB OLECMDID_SAVEAS, false 'ダイアログがでる

End Sub

URLDownloadToFile を使う

簡単。CSSや画像は別途解析して、ダウンロードが必要。

Private Declare Function URLDownloadToFile Lib _
  "urlmon" Alias "URLDownloadToFileA" ( _
   ByVal pCaller As Long, ByVal szURL As String, _
   ByVal szFileName As String, _
   ByVal dwReserved As Long, _
   ByVal lpfnCB As Long) As Long

Sub DownloadFile()
  Dim sURL as String
 Dim sFilePath as String
  Dim rc
  
  sURL = "http://・・・・・・"
  sFilePath = "保存ファイルパス.htm"
  
  rc = URLDownloadToFile(0, sURL, sFilePath, 0, 0)

End Sub

XMLHTTPを使用

これは万能。ページ上の細かい要素に比較的アクセスしやすい。
(メソッドまわり) http://japan.internet.com/developer/20051005/28.html

Sub PrintHttpDoc()
    Dim oHttp  As Object
    Dim sURL As String

    sURL = "http://・・・・・"

    Set oHttp = CreateObject("MSXML2.XMLHTTP")
    With oHttp
        .Open "GET", sURL, False
        .Send

        Debug.Print .responseText
        Debug.Print .Status '200-300
    End With

    Set oHttp = Nothing
End Sub

wininet.dllの使用

めんどくさいが、細かい接続処理が可能。膨大なAPI関数の宣言が必要。
http://www.happy2-island.com/access/gogo03/capter90100.shtml
APIを呼んだ後は、Err.LastDllErrorでエラー処理

Sub getFile()

    Dim hWIN as Long, hHTTP as Long, hREQ as Long

    Dim strBuf as Sring * 1024
    Dim GetLen as Long
    Dim tmpIndex As Long

    Dim sServer as String, sURL As String * 255
    Dim lStat as Long    

    hWIN = InternetOpen(vbNullString, INTERNET_OPEN_TYPE_PRECONFIG _
                            , vbNullString, vbNullString, 0)

    sServer = "www.********.net"
    hHTTP = InternetConnect(hWIN,  sServer
                              , INTERNET_DEFAULT_HTTP_PORT _
                              , vbNullString, vbNullString _
                              , INTERNET_SERVICE_HTTP, 0 , 0)

    sURL = "page1.html" 
    hREQ = HttpOpenRequest(hHTTP, "GET", sURL _
                              , "HTTP/1.1" _
                              , vbNullString, 0 _
                              , INTERNET_FLAG_RELOAD, 0)

    Call HttpSendRequest(hREQ, vbNullString, 0, vbNullString, 0)
    
    strBuf = vbNullString
    GetLen = 1024 '初期値はstrBufの長さ
    tmpIndex = 0 
    Call HttpQueryInfo(hREQ, HTTP_QUERY_STATUS_CODE _
                     , ByVal strBuf, GetLen, tmpIndex)
    lStat = CLng(strBuf) 


    Call InternetReadFile(hREQ, tmpBuf(0), 1024, GetLen)
        'tmpBufにデータ、1024ばtmpBufのサイズ、GetLenに取り込んだバイトが返る
     '必要ならぐるぐる回す

    Call InternetCloseHandle(hREQ)
    Call InternetCloseHandle(hHTTP)
    Call InternetCloseHandle(hWIN)

End Function