Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(指定なし : 指定なし)
userfoamのwebbrowserからのログイン時のエラー抽出について
投稿日時: 17/07/25 07:19:22
投稿者: hirama1982

いつも拝見させていただいております。職場のweb業務システムの自動化を検討しております。userfoamのwebbrowser からログインしておりますが、webページからのメッセージの表示から進むことができません。ご教示いただけないでしょうか?
 
 
Private Declare PtrSafe Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As LongPtr, ByVal wMsg As Long, ByVal wParam As LongPtr, ByVal lParam As LongPtr) As Long
 
Declare Function FindWindow Lib "User32.dll" Alias "FindWindowA" _
(ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
 
Const WM_COMMAND As Long = &H111&
 
 
Sub ie()
 
Dim hwnd As Long
Dim ie As InternetExplorer
 
 
 
Set ie= WebBrowser1
 
ie.Navigate 接続先url
 
ie.document.Script.setTimeout "javascript:document.getElementById('popOK').click()", 200
 
Sleep 1000
 
hwnd = FindWindow("#32770", "Web ページからのメッセージ")
 
If hwnd <> 0 Then
 
PostMessage hwnd, WM_COMMAND, vbOK, 0
 
End If
 
 
End Sub

回答
投稿日時: 17/07/25 07:43:16
投稿者: kumatti
投稿者のウェブサイトに移動


>PostMessage hwnd, WM_COMMAND, vbOK, 0
PostMessage hwnd, WM_COMMAND, vbCancel, 0
にされるとか。

投稿日時: 17/07/26 12:31:47
投稿者: hirama1982

返信ありがとうございます。
変更しましたが処理をすることができませんでした。
 
hwndのウィンドウ名が、確認できないためPostMessageでも処理できていないと思われます。
 

回答
投稿日時: 17/07/26 12:50:29
投稿者: kim358

私は、
 
> Sleep 1000
1秒待って即
> hwnd = FindWindow("#32770", "Web ページからのメッセージ")
で、うまくいかないページがあったため、下記のようにループしてうまくいきました。
 
    Do
        Call Sleep(100)
        hWnd = FindWindow("#32770", "Web ページからのメッセージ")
    Loop Until hWnd <> 0
    PostMessage hWnd, &H111, 1, 0
 

投稿日時: 17/07/28 06:33:10
投稿者: hirama1982

コメントありがとうございます。
webbrowser 上で、sleepをすることにりより、webbrowser そのものが停止してしまうようです。

回答
投稿日時: 17/07/28 13:44:10
投稿者: kumatti
投稿者のウェブサイトに移動

では、DoEventsにするとか。

投稿日時: 17/07/31 22:19:35
投稿者: hirama1982

回答いただきありがとうございます。
 
 Do
        DoEvents
        hWnd = FindWindow("#32770", "Web ページからのメッセージ")
    Loop Until hWnd <> 0
    PostMessage hWnd, &H111, 1, 0
 
上記のように変更してみましたが、ダイアログが表示後に制御が返ってこないためか、
停止してしまうようです。
 

回答
投稿日時: 17/08/01 11:43:17
投稿者: きぬあさ
投稿者のウェブサイトに移動

こんにちは。
非同期でダイアログを閉じる処理を実行してみてはいかがでしょうか。
(あまり動作確認していないので、環境によっては実行できないかもしれません。)
 

Private Sub CommandButton1_Click()
  With Me.WebBrowser1
    .Navigate "http://hoge/popup.html"
    Do While (.Busy = True) Or (.ReadyState <> READYSTATE_COMPLETE)
      DoEvents
    Loop
    
    '非同期でダイアログを閉じる
    With CreateObject("htmlfile")
      Set .parentWindow.onhelp = Me
      .parentWindow.setTimeout "onhelp.CloseDialog()", 300, "VBScript" 'タイミングは要調整
    End With
    
    .Document.getElementById("popOK").Click
    MsgBox "確認用メッセージ表示", vbInformation + vbSystemModal
  End With
End Sub

Public Sub CloseDialog()
  Dim hWnd As Long
  Const WM_COMMAND = &H111
  
  hWnd = FindWindow("#32770", "Web ページからのメッセージ")
  If hWnd <> 0 Then PostMessage hWnd, WM_COMMAND, vbOK, 0
End Sub

投稿日時: 17/08/02 11:51:10
投稿者: hirama1982

きぬあさ様
回答ありがとうございございました。
無事に目的の動きを確認できました。
 
 
他の回答者様もありがとうございございました。
ちなみに、webbowserのwebページを印刷する際に表示される印刷ダイアログも同様の方法で制御可能でしょうか?

回答
投稿日時: 17/08/02 13:47:44
投稿者: きぬあさ
投稿者のウェブサイトに移動

こんにちは。
 
> webbowserのwebページを印刷する際に表示される印刷ダイアログも同様の方法で制御可能でしょうか?
 
下記のような形で処理できそうですが、複雑な処理をするより運用でカバーできるところは運用でカバーした方が良いのではないかと思います。
 

Private d As Object

Private Sub CommandButton1_Click()
  Dim hWnd As Long
  
  With Me.WebBrowser1
    .Navigate "http://hoge/dlg.html"
    Do While (.Busy = True) Or (.ReadyState <> READYSTATE_COMPLETE)
      DoEvents
    Loop
    
    '非同期で印刷ダイアログ制御
    Set d = CreateObject("htmlfile")
    Set d.parentWindow.onhelp = Me
    d.parentWindow.setTimeout "onhelp.DialogPrint()", 300, "VBScript" 'タイミングは要調整
    
    .Document.parentWindow.execScript "window.print();"
  End With
End Sub

Public Sub DialogPrint()
  Dim hWnd As Long
  Const WM_COMMAND = &H111
  
  hWnd = FindWindow("#32770", "印刷")
  If hWnd <> 0 Then PostMessage hWnd, WM_COMMAND, vbOK, 0
End Sub

投稿日時: 17/08/06 07:22:04
投稿者: hirama1982

きぬあさ様
回答ありがとうございました。
印刷含め動作確認致しました。提案含めありがとうございございました。