http://q.hatena.ne.jp/1248338268に関連しているのですが、VBAでHTMLのページ内でJavaScriptのConfirm関数で表示されるメッセージのボタンを自動的にクリックするには、どのようにしたらいいのでしょうか?サンプルのHTMLページとして、以下のようなものを知人に作っていただきました。

http://kamicha1.web.fc2.com/Excel/Test20090726.html
このページの OK ボタンをクリックすると、「PDFを表示しますか?」という表示が出るので、その表示の OK ボタンをクリックしたいのです。現在できているコードは、以下のとおりです。

Sub Sample()
Dim objIE As Object
Dim objTag As Object
Dim i As Long

Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = True
objIE.Navigate2 ("http://kamicha1.web.fc2.com/Excel/Test20090726.html")
While (objIE.Busy = True): Wend ' 表示完了まで待つ
 Set objTag = objIE.Document.getElementsByTagName("INPUT")
For i = 0 To objTag.Length - 1
If objTag(i).Value = "OK" Then
objTag(i).Click
'↑ここでClickした後にJavaScriptのConfirm関数で表示されるOKボタンを
クリックしたい
Exit For
End If
Next i
End Sub

以上、ご教授いただけると幸いです。何卒宜しくお願いいたします。

回答の条件
  • 1人5回まで
  • 登録:2009/07/27 10:16:15
  • 終了:2009/07/27 16:42:01

回答(3件)

id:HALSPECIAL No.1

HALSPECIAL回答回数407ベストアンサー獲得回数862009/07/27 11:24:20

ポイント27pt

スマートでないですが、SendKeys を使えばできます。


Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Sub Sample()
    '・・・
    Sleep (1000)  '待ちを入れる
    SendKeys "{enter}", True



SendKeysステートメント

id:tororosoba

HALSPECIALさん、ありがとうございます。何が原因かわからないのですが、SENDKeysのENTERが効かないようで、やはりPDF表示まで進むことができません・・・。

2009/07/27 13:26:19
id:HALSPECIAL No.2

HALSPECIAL回答回数407ベストアンサー獲得回数862009/07/27 14:24:55

ポイント27pt

再回答ですみませんが

Sleep で待ちを入れましたか?

回答では

Sleep (1000) としましたが、

2000とか3000とか待ち時間を増やしても駄目でしょうか?

id:tororosoba

HALSPECIALさん、何度もありがとうございます。仰るとおりに数字を調整してみたのですが、やはり問題の箇所で止まってしまっています。

2009/07/27 14:53:03
id:HALSPECIAL No.3

HALSPECIAL回答回数407ベストアンサー獲得回数862009/07/27 16:34:42

ポイント500pt

何度も済みません。



Option Explicit

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Private Declare Function GetLastActivePopup Lib "user32" _
    (ByVal hWnd As Long) As Long
Private Declare Function PostMessage Lib "user32.dll" Alias "PostMessageA" ( _
     ByVal hWnd As Long, _
     ByVal wMsg As Long, _
     ByVal wParam As Long, _
     ByVal lParam As Long) As Long
     

Public Sub Sample()
    Dim objIE As Object
    Dim objTag As Object
    Dim i As Long
    
    Set objIE = CreateObject("InternetExplorer.Application")
    objIE.Visible = True
    objIE.Navigate2 ("http://kamicha1.web.fc2.com/Excel/Test20090726.html")
    While (objIE.Busy = True): Wend  ' 表示完了まで待つ
    
   
    Set objTag = objIE.Document.getElementsByTagName("INPUT")
    For i = 0 To objTag.Length - 1
        If objTag(i).Value = "OK" Then

'            objTag(i).Click
            '↑ここでClickした後にJavaScriptのConfirm関数で表示されるOKボタンを
            'クリックしたい

            '===================================================================
            'VBAからではなく、ページ中のスクリプトで押させる
            objIE.Document.Script.setTimeout "javascript:document.getElementById('popOK').click()", 200
            'ダイアログが表示されるまで待機
            Dim lngDHnd As Long
            Do
                Sleep (200)
                lngDHnd = GetLastActivePopup(objIE.hWnd)
            Loop While lngDHnd = objIE.hWnd
            'OKボタンを押す
            Const WM_COMMAND = &H111
            Dim lngRc As Long
            lngRc = PostMessage(lngDHnd, WM_COMMAND, 1, 0)
            '===================================================================
          
           Exit For
        End If
    Next i
    
End Sub

(参考)

http://q.hatena.ne.jp/1174026115

http://www.happy2-island.com/bbs/bbs.cgi?mode=past&no=488

id:tororosoba

HALSPECIALさん、本当にありがとうございました、無事、目的のPDFが開けました!

2009/07/27 16:40:49
  • id:HALSPECIAL
    HALSPECIAL 2009/07/27 16:43:28
    たくさんのポイントありがとうございました。
  • id:tdoi
    別スレッドでボタンを押すという手もありますよ。参考までに。

    Declare Sub Sleep Lib "KERNEL32" (ByVal dwMilliseconds As Long)
    Declare Function CreateThread Lib "KERNEL32" (ByVal lpThreadAttributes As Any, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, ByVal lpParameter As Long, ByVal dwCreationFlags As Long, ByRef lpThreadId As Long) As Long
    Declare Function CloseHandle Lib "KERNEL32" (ByVal hObject As Long) As Long
    Declare Function WaitForSingleObject Lib "KERNEL32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long

    Function ClickThread()
    Sleep (1000)
    SendKeys "{enter}", True
    End Function


    Sub Macro1()
    Dim objIE As Object
    Dim objTag As Object
    Dim i As Long

    Set objIE = CreateObject("InternetExplorer.Application")
    objIE.Visible = True
    objIE.Navigate2 ("http://kamicha1.web.fc2.com/Excel/Test20090726.html")
    While (objIE.Busy = True): Wend
    Set objTag = objIE.Document.getElementsByTagName("INPUT")

    Dim idThread As Long
    Dim hThread As Long
    hThread = CreateThread(0&, 0&, AddressOf ClickThread, 1, 0&, idThread)

    For i = 0 To objTag.Length - 1
    If objTag(i).Value = "OK" Then
    objTag(i).Click
    Exit For
    End If
    Next i

    Range("A1").Select
    End Sub


    ただ、本来やりたいことのソリューションとしてこれが最適なのかちょっと疑問な気はします。
  • id:HALSPECIAL
    HALSPECIAL 2009/07/27 17:37:40
    >ただ、本来やりたいことのソリューションとしてこれが最適なのかちょっと疑問な気はします。
    そうですね。
    実際のページを見ることができ、操作して確かめることができるのであれば、XMLHTTPREQUEST等を使って別の解決方法があるかもしれません。

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません