2016-01-25 14 views
8

Buon pomeriggio,Utilizzo di Excel per inviare informazioni a un modulo web e analizzare i risultati

Sto cercando di impostare un mezzo di automatizzare qualche segnalazione per un sito web in-house. Insegno in un college e ho bisogno di estrarre alcuni dati dai database accessibili dalla facoltà attraverso l'interfaccia fornita dal college. Quindi, sto cercando di accedere al materiale che sono autorizzato a vedere, sarà necessario accedere per vedere, ma non voglio ripetere i passaggi potenzialmente centinaia di volte.

Il mio pensiero è quello di:

1) accedere all'interfaccia collegio fornito utilizzando IE con le mie credenziali (in modo che il sistema sa che sono autorizzato).

2) Fornire Excel con un elenco di numeri di identificazione sugli studenti che sto cercando di rintracciare

3) utilizzare VBA per scorrere ogni ID, effettuare le seguenti operazioni:

  • Inserire il numero ID dalla lista in Excel nella casella di testo apposito modulo
  • Fare clic sul pulsante "Invia"
  • Clicca un secondario pulsante "Invia" nella pagina risultante
  • Copy ° e conseguente pagina di testo HTML che appare e analizzarlo per le informazioni che ho bisogno
  • Procedere con il numero successivo e ripetere

ho provato alcune delle altre opzioni che ho visto (come VBA to Enter Data Online and Submit Form) ma sto ricevendo errori sulla sintassi.

La parte rilevante del codice HTML del sito che sto cercando di riferimento è:

<FORM ACTION="action" METHOD="POST" NAME="idinputform"> 
Enter Number Here: 
<INPUT TYPE="number" NAME="ID_NUM" SIZE="9" MAXLENGTH="9"> 
<INPUT TYPE="hidden" NAME="refresh_proc" VALUE="menu_1"> 
<INPUT TYPE="submit" VALUE="Submit"> <INPUT TYPE="reset" VALUE="Reset"> 
</FORM> 

Quello che ho in Excel è:

Sub QueryInfo() 
    Application.ScreenUpdating = False 
    Set IE = CreateObject("InternetExplorer.Application") 
    IE.Visible = True 
    IE.Navigate "website address" 
    IE.Document.idinputform.number.Value = "000000000" 
    Application.ScreenUpdating = True 
End Sub 

Così, comincio da aprire una finestra di IE e accedere all'interfaccia, quindi avviare VBA. L'applicazione viene eseguita, apre una nuova finestra di IE, raggiunge il sito Web (che conserva la mia autorizzazione di accesso dal primo), quindi si blocca con un errore non specificato.

Sembra che questo dovrebbe essere semplice, ma io non lo vedo.

Grazie! -G-

+0

provare questo IE.document.getElementsByName ("idinputform"). Voce '(0) .Value = "myID"' 'dove myID' = valore della cella di id studente o qualunque id hai hardcoded per il momento . –

+0

Ahimè, no. IE.document.getElementsByName ("idinputform"). Item (0) .Value = "myID" non funziona. Né IE.document.getElementByName ("numero"). Value = "myID". Altri pensieri? –

+0

Ah, ho letto male 'getElementByName (" ID_NUM "). Item (0) .Value' –

risposta

0

Quando si ha a che fare con le raccolte (oggetti multipli), trovo che sia meglio scorrere gli oggetti disponibili, testandoli ciascuno come si va.

Sub QueryInfo() 
    Dim ie As Object, iFRM As Long, iNPT As Long 
    'Application.ScreenUpdating = False 'uncomment this once it is working 
    Set ie = CreateObject("InternetExplorer.Application") 
    ie.Visible = True 
    ie.Navigate "website address" 

    'wait untli the page loads 
    Do While ie.busy Or ie.readyState <> 4 'READYSTATE_COMPLETE = 4 
     DoEvents 
    Loop 

    With ie.document.body 
     For iFRM = 0 To .getElementsByTagName("form").Length - 1 
      If LCase(.getElementsByTagName("form")(iFRM).Name) = "idinputform" Then 
       With .getElementsByTagName("form")(iFRM) 
        For iNPT = 0 To .getElementsByTagName("input").Length - 1 
         Select Case LCase(.getElementsByTagName("input")(iNPT).Name) 
          Case "id_num" 
           .getElementsByTagName("input")(iNPT).Value = 123 
          Case "refresh_proc" 
           .getElementsByTagName("input")(iNPT).Value = "menu_2" 
         End Select 
        Next iNPT 
        .submit '<~~ submit the form 
        Do While ie.busy Or ie.readyState <> 4: DoEvents: Loop 
        Exit For 
       End With 
       Exit For 
      End If 
     Next iFRM 
    End With 

    With ie.document.body 
     'should be at the form's destination 
    End With 

    Application.ScreenUpdating = True 
End Sub 

Ci potrebbero essere più moduli sulla pagina. Passa attraverso ciascuno finché non trovi quello con il nome corretto. All'interno di quella definizione di modulo, ci sono più elementi di input; scorrere ciclicamente ciascuna e applicare i parametri secondo necessità. Al termine, invia il modulo ed esci dal ciclo.

0

Ho avuto momenti in cui non potevo per la vita di me far funzionare il modulo di invio utilizzando gli elementi HTML ... Ho trovato un bel po 'di lavoro in giro per capire dove il sito lo mette a fuoco e poi usando i tasti per rendere necessari gli input.

Ammetto che non è elegante, ma mi ha messo in giro quello che è stato un impasse che mi ha causato molti a tarda notte.

Application.Wait (DateAdd("S", 1, Now())) 
DoEvents 
    Call SendKeys("{TAB}", True) 
Application.Wait (DateAdd("S", 2, Now())) 
Text2Clipboard (Format(Password1, "00000000")) 
Application.Wait (DateAdd("S", 1, Now())) 
DoEvents 
    Call SendKeys("^v", True) 
Application.Wait (DateAdd("S", 1, Now())) 
DoEvents 
    Call SendKeys("{TAB}", True) 
Application.Wait (DateAdd("S", 2, Now())) 
Text2Clipboard (Password2) 
Application.Wait (DateAdd("S", 1, Now())) 
DoEvents 
    Call SendKeys("^v", True) 
Application.Wait (DateAdd("S", 1, Now())) 
DoEvents 
    Call SendKeys("~", True) 
Application.Wait (DateAdd("S", 2, Now())) 
Dim Counter As Integer 
Counter = 0 
Do While IE.Busy 
    Application.Wait (DateAdd("S", 5, Now())) 
Loop 
Application.Wait (DateAdd("S", 2, Now())) 
Dim links, link As Object 
Set links = IE.Document.getElementById("t-mainmenu").getElementsByTagName("a") 
links(1).Click 
Do While IE.Busy 
    Application.Wait (DateAdd("S", 5, Now())) 
Loop