Home > Net >  KeyDown in WebBrowser (Excel VBA)
KeyDown in WebBrowser (Excel VBA)

Time:03-14

Is there a way to know what key is pressed if a WebBrowser is used in a UserForm?

Thanks in advance :)

Edit: I basically want to open a different UserForm on KeyDown, but the WebBrowser prevents that. Maybe I can run a Sub of my UserForm from the WebBrowser.

CodePudding user response:

OK here's a very basic example to show you can send a message to the HTML page from VBA, and send a message in the other direction:

UserForm:

Option Explicit

Dim obj As webEvents 'must be Global to remain in scope...

'send a message to the browser page
Private Sub CommandButton1_Click()
    'would need to escape the text sent if it contains (eg) '
    Me.WebBrowser1.Document.parentWindow.execScript "MessageIn('" & Me.TextBox1.Text & "')"
End Sub

'receive a message from the browser page
Public Sub HandleBrowserMessage(s As String)
    MsgBox "From web:" & vbLf & s
End Sub

Private Sub UserForm_Initialize()
    Me.WebBrowser1.Navigate "about:blank"  'load a blank document
    Application.Wait Now   TimeSerial(0, 0, 1)
    With Me.WebBrowser1.Document 'load some HTML
        .Open "text/html"
        .write Sheet1.Range("A1").Value
        .Close
    End With
    
    Set obj = New webEvents                  'new class instance
    Set obj.ParentForm = Me                  'for the callback
    Set obj.HtmlOutput = Me.WebBrowser1.Document.getElementById("msgOut")
End Sub

Class module webEvents:

Option Explicit

Public ParentForm As Object 'not As userform!
Public WithEvents HtmlOutput As MSHTML.HTMLInputElement

'handling click since change seems unreliable
Private Function HtmlOutput_onclick() As Boolean
    ParentForm.HandleBrowserMessage CStr(HtmlOutput.Value)
End Function

HTML in Cell A1:

<html><body>
<input type="hidden" id="msgOut" /><br>
To VBA: <input type="text" size="20" id="msg" />
<button  onclick="MessageOut()">Send to VBA</button><br><br>
From VBA: <span id="showMessage" style="color:#F00"></span><br>
<script>
function MessageIn(s){  document.getElementById("showMessage").innerText = s;  }
function MessageOut(s){  
    var el = document.getElementById("msgOut");
    el.value = document.getElementById("msg").value; 
    el.click();
}
</script>
</body></html>
  • Related