2012-04-17 18 views
6

Estoy tratando de utilizar la automatización desde Microsoft Access 2003 para controlar Internet Explorer 9 y completar un formulario con los datos de la base de datos.Automatización de Internet Explorer con eventos de entrada de VBA

La entrada activa un evento en el navegador que valida los datos y hace visible el botón de guardar. Si utilizo sendkeys, el evento se desencadena; sin embargo, he encontrado que sendkeys es muy poco confiable. Si cambio el valor del elemento y luego uso .fireevent ("onchange"), no pasa nada, ni siquiera un error.

Mi pregunta es, ¿cómo disparo el evento. O bien, ¿cómo puedo averiguar qué javascript se está ejecutando? ¿Hay un tipo de depuración de complemento para IE que me diga qué evento se dispara? Si es así, ¿puedo ejecutar el script yo solo?

Mi código está por debajo.

Set IE = CreateObject("internetexplorer.application") 
IE.Visible = True 
IE.Navigate "https://extranet.website.com/Planning/Edition/Periodic?language=en" 

Do While IE.ReadyState <> 4 Or IE.Busy = True 
    DoEvents 
Loop 


'log in 
If IE.Document.Title = "website- access" Then 
    IE.Document.getElementById("login_uid").Value = "username" 
    IE.Document.getElementById("login_pwd").Value = "password" 
    IE.Document.all("ButSubmit").Click 
    Do While IE.ReadyState <> 4 Or IE.Busy = True 
     DoEvents 
    Loop 
End If 

Do While Not RstAvailability.EOF 
    StartDate = RstAvailability!AvailDate 
    IE.Document.getElementById("periodStart").Value = Format(StartDate, "dd mmm yy") 
    IE.Document.getElementById("periodEnd").Value = Format(StartDate, "dd mmm yy") 
    Set LinkCollection = IE.Document.GetElementsByTagName("A") 
    For Each link In LinkCollection 
     If link.innertext = "Add" Then 
      link.Click 
      Exit For 
     End If 
    Next 
    Do While IE.ReadyState <> 4 Or IE.Busy = True 
     DoEvents 
    Loop 


    Set objRows = IE.Document.GetElementsByTagName("tr") 
    If RstAvailability!RoomType = "DTW" Then 
     n = 0 
     While n < objRows.Length 
      If Trim(objRows(n).Cells(0).innertext) = "Single Room" Then 
       For i = 1 To 7 
        'objRows(n).FireEvent ("onchange") 
        'objRows(n).Cells(i).GetElementsByTagName("input")(0).Focus 
        'SendKeys Format(RstAvailability!roomcount - RstAvailability!RoomsSold, "0") & "{TAB}" 
        objRows(n).Cells(i).GetElementsByTagName("input")(0).Value = Format(RstAvailability!roomcount - RstAvailability!RoomsSold, "0") 
        objRows(n).Cells(i).GetElementsByTagName("input")(0).fireevent ("onchange") 
        Do While IE.ReadyState <> 4 Or IE.Busy = True 
         DoEvents 
        Loop 
       Next i 
      End If 
      n = n + 1 
     Wend 
    End If 

    Set objButtons = IE.Document.getelementsbyname("savePlanning") 
    objButtons(0).Click 

    Do While IE.ReadyState <> 4 Or IE.Busy = True 
     DoEvents 
    Loop 

    newtime = Now + TimeValue("0:00:10") 
    Do While True 
     If Now > newtime Then Exit Do 
    Loop 

    RstAvailability.MoveNext 
Loop 

el HTML de los campos de entrada son:

<tr class="first" roomId="30494" articleId="0" type="Availability" readonly="False"> 

<div> 

    <span class="roomName"> 

    Single Room 

    </span> 



</div> 

<span class="data"> 

<input id="Availabilities" name="Availabilities" type="text" value="" /> 

</span> 

<span class="data"> 

<input id="Availabilities" name="Availabilities" type="text" value="" /> 

</span> 

Gracias!

Respuesta

12

Después de sudar por esto durante unos días, la respuesta fue en realidad muy simple, pero casi imposible de encontrar en cualquier documentación en MSDN o en cualquier otro lugar en la web.

Antes de cambiar el valor del campo de entrada, puede establecer el foco en ese campo. Después de cambiar el valor, debe establecer el foco en otro campo. Aparentemente, los eventos disparan sobre la pérdida de enfoque. Por lo tanto, el código debería tener este aspecto:

 n = 0 
    While n < objRows.Length 
     If Trim(objRows(n).Cells(0).innertext) = "Family Room" Then 
      For i = 1 To 7 
       objRows(n).Cells(i).GetElementsByTagName("input")(0).Focus 
       objRows(n).Cells(i).GetElementsByTagName("input")(0).Value = Format(RstAvailability!roomcount - RstAvailability!RoomsSold, "0") 
      Next i 
      objRows(n).Cells(1).GetElementsByTagName("input")(0).Focus 

     End If 
     n = n + 1 
    Wend 

La manera que he encontrado esto fue examinado alguna documentación de MSDN acerca de la accesibilidad de IE9. Aconsejaba establecer el foco para los usuarios discapacitados. Pensé que probaría esto y funcionó. Espero que esto ayude a alguien más.

de Dave

+0

Saludos que era muy útil para mí – BlueTrin

1

Si desea (en IE9) para poner la siguiente línea justo antes de la línea "Siguiente i". también debería funcionar incluso si no pierde el enfoque?

objRows (n) .Cells (i) .GetElementsByTagName ("input") (0) .pulsa

Cuestiones relacionadas