ログイン TOPに戻る
ぐぐると、GETするほうは、すごくわかりやすく纏めてくれてあるサイトがあるんだけど
POSTするほうは無くって、すごく嵌ったのでここに書いておきます。


適当なボタンに下記のマクロをつけたとして
Private Sub CommandButton1_Click()
  Dim response
   
  postData = "abc=" & urlEncode("あいうえお") & "&xyz=" & urlEncode("かきくけこ")

  response = SendPostRequest("www.hogehoge.com", "/excel_test.php",postData)
  MsgBox response
End Sub


標準モジュールに下記のマクロをコピペする。
Private Declare Function InternetOpen Lib "wininet.dll" _
   Alias "InternetOpenA" _
      (ByVal lpszCallerName As String, _
       ByVal dwAccessType As Long, _
       ByVal lpszProxyName As String, _
       ByVal lpszProxyBypass As String, _
       ByVal dwFlags As Long) As Long

Private Declare Function InternetConnect Lib "wininet.dll" _
      Alias "InternetConnectA" _
      (ByVal hInternetSession As Long, _
       ByVal lpszServerName As String, _
       ByVal nProxyPort As Integer, _
       ByVal lpszUsername As String, _
       ByVal lpszPassword As String, _
       ByVal dwService As Long, _
       ByVal dwFlags As Long, _
       ByVal dwContext As Long) As Long

Private Declare Function InternetReadFile Lib "wininet.dll" _
         (ByVal hFile As Long, _
          ByVal sBuffer As String, _
          ByVal lNumBytesToRead As Long, _
          lNumberOfBytesRead As Long) As Integer

Private Declare Function HttpOpenRequest Lib "wininet.dll" _
         Alias "HttpOpenRequestA" _
         (ByVal hInternetSession As Long, _
          ByVal lpszVerb As String, _
          ByVal lpszObjectName As String, _
          ByVal lpszVersion As String, _
          ByVal lpszReferer As String, _
          ByVal lpszAcceptTypes As Long, _
          ByVal dwFlags As Long, _
          ByVal dwContext As Long) As Long

Private Declare Function HttpSendRequest Lib "wininet.dll" _
         Alias "HttpSendRequestA" _
         (ByVal hHttpRequest As Long, _
          ByVal sHeaders As String, _
          ByVal lHeadersLength As Long, _
          ByVal sOptional As String, _
          ByVal lOptionalLength As Long) As Boolean

Private Declare Function InternetCloseHandle Lib "wininet.dll" _
         (ByVal hInternetHandle As Long) As Boolean

Private Declare Function HttpAddRequestHeaders Lib "wininet.dll" _
          Alias "HttpAddRequestHeadersA" _
          (ByVal hHttpRequest As Long, _
          ByVal sHeaders As String, _
          ByVal lHeadersLength As Long, _
          ByVal lModifiers As Long) As Integer

Public Function SendPostRequest(host As String, path As String, src As String)
  
    Dim hInternetOpen As Long
    Dim hInternetConnect As Long
    Dim hHttpOpenRequest As Long
    Dim bRet As Boolean
    Dim strResult As String
   
    hInternetOpen = 0
    hInternetConnect = 0
    hHttpOpenRequest = 0
   
    'Use registry access settings.
    Const INTERNET_OPEN_TYPE_PRECONFIG = 0
    hInternetOpen = InternetOpen("http generic", _
                    INTERNET_OPEN_TYPE_PRECONFIG, _
                    vbNullString, _
                    vbNullString, _
                    0)
   
    If hInternetOpen <> 0 Then
       'Type of service to access.
       Const INTERNET_SERVICE_HTTP = 3
       Const INTERNET_DEFAULT_HTTP_PORT = 80
       'Change the server to your server name
       hInternetConnect = InternetConnect(hInternetOpen, _
                          host, _
                          INTERNET_DEFAULT_HTTP_PORT, _
                          vbNullString, _
                          "HTTP/1.0", _
                          INTERNET_SERVICE_HTTP, _
                          0, _
                          0)
   
       If hInternetConnect <> 0 Then
        'Brings the data across the wire even if it locally cached.
         Const INTERNET_FLAG_RELOAD = &H80000000
         hHttpOpenRequest = HttpOpenRequest(hInternetConnect, _
                             "POST", _
                             path, _
                             "HTTP/1.0", _
                             vbNullString, _
                             0, _
                             INTERNET_FLAG_RELOAD, _
                             0)
   
          If hHttpOpenRequest <> 0 Then
             Dim sHeader As String
             Const HTTP_ADDREQ_FLAG_ADD = &H20000000
             Const HTTP_ADDREQ_FLAG_REPLACE = &H80000000
             sHeader = "Content-Type: application/x-www-form-urlencoded" _
               & vbCrLf
             bRet = HttpAddRequestHeaders(hHttpOpenRequest, _
               sHeader, Len(sHeader), HTTP_ADDREQ_FLAG_REPLACE _
               Or HTTP_ADDREQ_FLAG_ADD)
   
             Dim lpszPostData As String
             Dim lPostDataLen As Long
   
             lpszPostData = src
            
             lPostDataLen = Len(lpszPostData)
             bRet = HttpSendRequest(hHttpOpenRequest, _
                    vbNullString, _
                    0, _
                    lpszPostData, _
                    lPostDataLen)
   
             Dim bDoLoop             As Boolean
             Dim sReadBuffer         As String * 2048
             Dim lNumberOfBytesRead  As Long
             Dim sBuffer             As String
             bDoLoop = True
             While bDoLoop
              sReadBuffer = vbNullString
              bDoLoop = InternetReadFile(hHttpOpenRequest, _
                 sReadBuffer, Len(sReadBuffer), lNumberOfBytesRead)
              sBuffer = sBuffer & _
                   Left(sReadBuffer, lNumberOfBytesRead)
              If Not CBool(lNumberOfBytesRead) Then bDoLoop = False
             Wend
             strResut = sBuffer
             bRet = InternetCloseHandle(hHttpOpenRequest)
          End If
          bRet = InternetCloseHandle(hInternetConnect)
       End If
       bRet = InternetCloseHandle(hInternetOpen)
    End If
   
    SendPostRequest = strResut
   
End Function

'URLエンコード
Function urlEncode(src As String)
    Dim result As String
    strResult = ""
    src = StrConv(src, vbFromUnicode)
    For i = 1 To LenB(src)
        strResult = strResult + "%" + Right$("0" + Hex$(AscB(MidB$(src, i, 1))), 2)
    Next i
    urlEncode = strResult
End Function


ここまで、調べるのに半日かかった。。。

もとねたは、
http://support.microsoft.com/kb/175474/ja
コメントはこちらから
名前:
通信:
※オーナーにのみ表示されます。(mail やホームページのurl等ご入力ください)
本文:
トラックバックはこちらから
トラックバックURL: