Condividi:        

Vba e Html

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

Vba e Html

Postdi calculon » 30/04/12 21:53

Ciao a tutti,
sto cercando di automatizzare ie con una macro. Al momento mi sono bloccato su questo comando

<a title="Ricerca" id="" name="el1" target="menu" href="#" onclick="changeActiveLink(this,'/dama/plain/navtel?id=1.2.1&amp;idApp=plain')">ri.cerca</a>

Pensavo ad un comando simile ma purtroppo non va!

Set ElementCol = appIE.Document.getElementsByTagName("a")

for Each Link In ElementCol
If Link.Title = "ricerca" Then
Link.Click
Exit For
End If
Next Link

Secondo voi dov'è l'errore?

Grazie a tutti
calculon
Utente Senior
 
Post: 161
Iscritto il: 07/01/11 15:08

Sponsor
 

Re: Vba e Html

Postdi Anthony47 » 30/04/12 22:36

Sara' perche' "Ricerca" e' diverso da "ricerca" ??

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Vba e Html

Postdi calculon » 01/05/12 09:00

No, non è quello il motivo.
Probabilmente non è quello il comando che vba chiede. :(
calculon
Utente Senior
 
Post: 161
Iscritto il: 07/01/11 15:08

Re: Vba e Html

Postdi Anthony47 » 01/05/12 14:41

Premesso che "Ricerca" E' diverso da "ricerca", quindi nella sequenza che hai pubblicato l' istruzione If Link.Title = "ricerca" Then non riconoscera' il link della linea <a title="Ricerca" id="" name="el1" etc etc; collaudato il non riconoscimento e il " link.Click " sul riconoscimento.
Per un contributo ulteriore sarebbe utile:
-intanto una descrizione di quello che vorresti fare :D
-il listato di una macro completa
-il comportamento atteso all' esecuzione della macro e il comportamento reale.
-un url su cui si puo' provare la tua macro ed eventuali nostre variazioni
-l' elenco delle librerie linkate; basta uno screenshot dopo che, nell' editor delle macro, hai dato il comando Menu /Strumenti /Riferimenti

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Vba e Html

Postdi calculon » 08/05/12 20:42

Ciao a tutti,
vi chiedo una mano per risolvere un problema nell'automazione dell'esecuzione di IE da Excel.

Dal foglio elettronico devo caricare dei dati su un form on web e per l'occasione ho elaborato un codice VBA che funziona a fasi alterne.

Option Explicit
Dim appIE As Object
Dim sURL As String
Dim Element As Object
Dim btnInput As Object
Dim ElementCol As Object


Sub Vai()


Set appIE = CreateObject("InternetExplorer.Application")

With appIE
.Navigate "https://bau/accesso.php"
.Visible = True
End With

Do While appIE.Busy
DoEvents
Loop


appIE.Document.getElementsByname("anagrafica")(0).Value = Cells(1, 1)
Do While appIE.Busy
DoEvents
Loop


Set ElementCol = appIE.Document.getElementsByTagName("input")

For Each btnInput In ElementCol
If btnInput.Name = "Esegui" Then
btnInput.Click
Exit For
End If
Next btnInput

Do While appIE.Busy
DoEvents
Loop


With appIE
.Navigate "https://bau/attività.php"
.Visible = True
End With

Do While appIE.Busy
DoEvents
Loop

With appIE
.Navigate "https://bau/attività_ins.php"
.Visible = True
End With

Do While appIE.Busy
DoEvents
Loop
With appIE
.Navigate "https://bau/attività_mod_1_new.php"
.Visible = True
End With

Do While appIE.Busy
DoEvents
Loop
appIE.Document.getElementsByname("attività")(0).Value = "ciclismo"
Do While appIE.Busy
DoEvents
Loop

Do While appIE.Busy
DoEvents
Loop

End Sub


Come dicevo, talvolta, senza comprenderne la ragione, l'esecuzione si arresta rendendomi un errore di run-time 91.

Le cause possono essere legate:
1) al login
2) alla velocità di caricamento delle pagine web
3)ai certificati di sicurezza (assenti per il sito in questione)


Vi prego, ditemi la vostra perché qua sto uscendo di testa.
calculon
Utente Senior
 
Post: 161
Iscritto il: 07/01/11 15:08

Re: Vba e Html

Postdi calculon » 09/05/12 22:51

Qualcuno potrebbe spiegarmi nel dettaglio il significato e il funzionamento di questo codice?

Enum READYSTATE
READYSTATE_UNINITIALIZED = 0
READYSTATE_LOADING = 1
READYSTATE_LOADED = 2
READYSTATE_INTERACTIVE = 3
READYSTATE_COMPLETE = 4
End Enum
Private Sub CommandButton1_Click()
'USE - AUTOLOGON
'*****************************************************
'***************** NOTES *****************************
'CODE TO MOVE TO A WEBPAGE
'ie.navigate ("https://webpage_goes_here")
'Call READYSTATE(ie)
'****************************************************
'****************************************************

'DEC VARS
Dim IE As Object
Dim intPos1 As Integer 'DOM OBJECT 1
Dim intPos2 As Integer 'DOM OBJECT 2
Dim intPos3 As Integer 'DOM OBJECT 3
Dim intDefState As Integer 'INT TO HOLD BASE STATE VALUE
Dim AGAIN As Label
Dim i As Integer 'Counter
Dim j As Integer 'Counter

'SET VALS
Set IE = CreateObject("InternetExplorer.application") 'CREATE OBJECT

IE.Visible = True 'HIDE IE PANE

IE.Navigate ("http://vis1203.solutionbeacon.net")

Call READYSTATE(IE) 'CHECK STATE OF PAGE

'i = 1

AGAIN1: 'IF FINDDOM IS FAILING REPEAT THE PROCESS
intPos1 = 0
intPos1 = FindDom(IE, "usernameField")
If intPos1 = -1 Then GoTo AGAIN1

IE.document.forms(0).usernameField.Value = "username" 'Test value

Call READYSTATE(IE)

IE.document.forms(0).passwordField.Value = "password" 'Test value
Call READYSTATE(IE)

IE.document.forms(0).SubmitButton.Click 'HIT SUBMIT
Call READYSTATE(IE)

MsgBox "There is now an error message on the IE page." & Chr(13) & _
"How do I capture the URL that is now shown on the web page?"

'IE.Quit
'Set IE = Nothing

Exit Sub

PageNotFound:
MsgBox "The webpage has not loaded correctly. Try again later.", vbExclamation, "x2o"
IE.Quit
Set IE = Nothing

End Sub

Sub READYSTATE(IE)
'WAIT ROUTINE TO WAIT FOR PAGE TO BECOME INTERACTIVE

'SET VALS
intDefState = 4
bump = 0

Do
If IE.READYSTATE = intDefState Then
IE.Visible = True
Exit Do

Else
DoEvents
End If
bump = bump + 1 'SMARTSTATE COUNTER

'IF READYSTATE NEVER REACHES 4 ROLL BACK TO 3 SOME PAGES WILL NEVER REACH 4
If bump > 1000 Then
If intDefState = 4 Then
intDefState = 3
ElseIf intDefState = 3 Then
intDefState = 4
End If
Exit Do
End If

Loop
End Sub

Function FindDom(IE, strLookDom As String)
'USE-SCAN DOM TO FIND OBJECT ON WEBPAGE
'DEC VARS
Dim lblDie As Label
Dim lblDie2 As Label
Dim strTestval As String 'STRING VAR TO HOLD DOM ID


On Error GoTo lblDie
intNumInDom = IE.document.all.Length 'GET COUNT OF DOM OBJECTS ON WEBPAGE

For x = 0 To intNumInDom
strTestval = UCase(IE.document.forms(0).all(x).ID)
If strTestval = UCase(strLookDom) Then
FindDom = x
GoTo lblDie2
End If
Next x

lblDie: 'PREVENT ENDLESS LOOP
lblDie2: 'DOUBLE CHECK VALUE BEFORE PROCEEDING
If Len(Trim(FindDom)) = 0 Then FindDom = -1
End Function
calculon
Utente Senior
 
Post: 161
Iscritto il: 07/01/11 15:08

Re: Vba e Html

Postdi Anthony47 » 09/05/12 23:15

Non ti commento il codice appena pubblicato, ma ti do' qualche spunto sul messaggio precedente.

Apparentemente il codice ha una sua linearita', confermato tra l' altro dal fatto che spesso funziona...
Qualcosa in piu' "forse" si potrebbe dire avendo l' accesso alla pagina reale, ma temo che sia impossibile sia per motivi di riservatezza e sia perche' magari e' una pagina sulla tua intranet e non su internet.
Tra l' altro non hai detto se va in errore sempre nello stesso punto /sezione o se e' aleatorio
Potresti provare a inserire nell' area in cui va in errore un' attesa di qualche secondo (dopo l' attesa canonica (Do While appIE.Busy /DoEvents /Loop) per verificare l' impatto; nota che sconsiglio di usare, per l' attesa, una istruzione Wait, es Application.Wait (Now + TimeValue("0:00:05")); questa istruzione infatti attende gli N secondi, ma in questa attesa "mangia" molta della cpu disponibile, rendendo quindi difficoltoso il processing di altri fenomeni. Suggerisco quindi di spezzare la macro in N macro usando OnTime per avviare lo spezzone successivo; es
Do While appIE.Busy
DoEvents
Loop
APPLICATION.ONTIME NOW + TIMEVALUE("00:00:05"), "PARTE2"
END SUB
'
SUB PARTE2()
appIE.Document.getElementsByname("attività")(0).Value = "ciclismo"

Ho messo in maiuscolo le istruzioni aggiunte; fai attenzione all' area di validita' delle variabili, magari dichiarale in testa al modulo affinche' siano comuni alle varie macro che creerai.

Se l' operazione va fatta solo dal tuo pc (o comunque da pochi) potrebbe essere utile passare dalla modalita' "late bind" a quella "early bind", inserendo nel tuo vba i riferimenti alle librerie Microsoft Internet Controls e Microsoft HTML Object library (Menu /Strumenti /Riferimenti; spunti le voci; Ok).
Ti verranno installate le librerie ieframe.dll e mshtml.tlb; questo ti consentira' di disporre della funzione "IntelliSense", cioe' suggerimenti su metodi e proprieta' disponibili mentre digiti le istruzioni; dovresti anche avere accesso all' evento DocumentComplete che magari potresti usare per meglio sincronizzare il NonBusy di IE con la disponibilita' del documento, ma questa prestazione non l' ho mai usata. Ho invece qualche volta usato
Do Until appIE.ReadyState = 4: DoEvents: Loop
da posizionare subito DOPO la tua
Do While appIE.Busy /DoEvents /Loop

ReadyState=4 sembra essere lo stato che innesca DocumentComplete, quindi questa sequenza e' equivalente ad aver usato quell' evento.
Puoi usarla senza passare in early bind, quindi direi che questa potrebbe essere una delle prime prove da fare.
E noto che anche il codice appena pubblicato controlla readystate per controllare credo il completamento del caricamento del Document.

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Vba e Html

Postdi calculon » 10/05/12 18:59

Perfetto. Il tuo consiglio mi ha consentito di portarmi parecchio avanti nel lavoro scavalcando quel maledetto run time 91.
Ora il problema è un altro. Mi trovo davanti ad una maschera nella quale devo selezionare una voce dall'elenco a discesa e per farlo ho pensato di utilizzare questo comando:

appIE.Document.getElementsByname("attività")(0).Value = "ciclismo"

Il codice html è <select name="attività" id="attività" ><option value=""></option>
<option value="S49999999">-</option>
<option value="ciclismo">bicicletta</option>
<option value="calcio">pallone</option>
<option value="baseball">mazza</option>


Bene, tutto funziona regolarmente se non fosse che in questo modo il successivo form, legato da una condizione, non può essere compilato.
Ad es. se seleziono ciclismo il form successivo mi consente di selezionare dei valori tipo: Bartoli, Coppi, ecc..


Un'altra cosa. in questo modo non riesco ad attivare il flag appIE.Document.getElementsByname("check[]")(0).check= true

<input title="798535" type="checkbox" onClick="ctr(this)" id="check" name="check[]" value="798535">


Grazie mille ancora.
calculon
Utente Senior
 
Post: 161
Iscritto il: 07/01/11 15:08

Re: Vba e Html

Postdi Anthony47 » 11/05/12 17:28

Purtroppo non ho una conoscenza del linguaggio html sufficiente per capire quanto scrivi; ma intanto non capisco, quando dici "il successivo form, legato da una condizione, non può essere compilato", se il problema che riscontri e' che non riesci a procedere con l' esame del form successivo (campo successivo della stessa form?) o se invece l' input dato non viene recepito dalla pagina web.
Ma se si tratta di una form, forse dovresti provare a usare .Document.Forms(n),nomeCampo.Value

Qualcosa in piu' "forse" potrei fare lavorando sulla tua stessa pagina web; vedi se trovi un sito liberamente accessibile e simile al tuo dove poter sperimentare congiuntamente.

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Vba e Html

Postdi calculon » 15/05/12 19:38

grazie ai tuoi consigli sono venuto fuori egregiamente.

Fortissimo come al solito.
calculon
Utente Senior
 
Post: 161
Iscritto il: 07/01/11 15:08

Re: Vba e Html

Postdi calculon » 27/10/12 17:08

Ciao a tutti,
dopo qualche mese di pratica, e qualche nozione in più, vorrei tentare, sulla scorta di quanto consigliato dal grande Antony, di programmare in early binding un codice per compiere azioni controllate sul web.

Purtroppo il problema ricorrente che non riesco a superare in maniera ottimale è l'arresto della routine dovuta al ritardo nel caricamento delle pagine web.
Finora ho fatto ricorso al TIMEVALUE, mantenendo tempi di attesa abbastanza ampi per evitare di scatenare l'errore e nonostante ciò, talvolta, nemmeno in questo modo riesco a venirne fuori.

Osservando le indicazioni sulla libreria (microsoft internet control) vedo che esiste un evento documentcomplete che vorrei sfruttare quale alternativa al readystate, verificatosi del tutto inadatto per il mio scopo.

ultima cosa, secondo voi è possibile controllare la finestra IE "salva come" senza utilizzare il sendkeys?

Grazie mille a tutti.
calculon
Utente Senior
 
Post: 161
Iscritto il: 07/01/11 15:08

Re: Vba e Html

Postdi Anthony47 » 28/10/12 17:04

Io in realta' consiglio di lavorare in late binding; ad esempio in questo modo lavorerai sulle versioni degli "oggetti" disponibili sul pc in cui esegui la macro. La progettazione meno semplice invece si potra' avvantaggiare se si crea nel vba il riferimento alla libreria da utilizzare (Menu /Strumenti /Riferimenti), ma completato lo sviluppo si fa l' adattamento per la modalita' late binding. Questa modalita' pero' non ti mette a disposizione gli "eventi".

Comunque non so se l' evento DocumentComplete e' la risposta giusta; ad esempio a me pare che l' evento scatti molto prima che readystate passi sul valore "readystate_complete".
Con l' url http://txodds.com/omoves.php (un sito abbastanza problematico; vedi macro successiva), l' evento scatta una prima volta circa 2 secondi dopo l' avvio della navigazione, quando lo stato e' ancora "readystate_interactive", circa 9 secondi prima che lo stato diventi effettivamente "readystate_complete" quando scatta nuovamente.

Per queste prove ho usato questo codice, da inserire in ThisWorkbook:
Codice: Seleziona tutto
'Richiede riferim a Microsoft Internet Controls:
'   Menu /Strumenti /Riferimenti
Dim WithEvents Ie As InternetExplorer
'la gestione dell' evento
Private Sub Ie_DocumentComplete(ByVal pDisp As Object, URL As Variant)

    Range("B1") = Range("B1") + 1   'Azione sull' evento

End Sub

Sub Avvia_ie()
Dim aaa As String, bbb As String
'Set ie = CreateObject("InternetExplorer.Application")
 
Set Ie = New InternetExplorer
  Ie.Visible = True
'  Ie.navigate "http://www.google.com"
  Ie.navigate "http://txodds.com/omoves.php"
 
End Sub

Come gia' detto la documentazione per queste librerie e' abbastanza criptica (vedi http://msdn.microsoft.com/en-us/library ... 5%29.aspx), se confrontata con il classico help on line del vba; sara' necessario fare un po' di esperimenti per realizzare la sintassi e le funzionalita' dei comandi.

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Vba e Html

Postdi calculon » 29/10/12 02:09

Ho risolto la questione del readystate, nel senso che il problema non era quello!!!
Quando clicco sul link in questione si dà il via ad un download (pdf) che, anziché essere scaricato come distinto file, viene direttamente visualizzato in un'altra scheda di IE.

Secondo me per superare l'ostacolo dovrei spostare il focus verso questa nuova scheda, sì da verificare lo stato del caricamento (sempre con readystate) ma non ho idea di come fare!

Qualche suggerimento?

Grazie
calculon
Utente Senior
 
Post: 161
Iscritto il: 07/01/11 15:08

Re: Vba e Html

Postdi Anthony47 » 29/10/12 02:58

Per quello che ne so io sull' argomento (che e' decisamente poco), l' automazione verso IE e' possibile solo sulla scheda 1.

Sorry...
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Vba e Html

Postdi calculon » 14/11/12 00:56

Ciao a tutti,
rileggendo il tuo post ho capito l'importanza del codice riportato ad esempio.

Purtroppo il mio handicap legato alla comprensione della sintassi degli eventi - in generale - mi impedisce di afferrare appieno l'efficacia degli strumenti posti in mano all'utente programmatore.

Mi chiedo come tu possa dalla routine principale richiamare un evento come documentcomplete.
Si utilizza il call?

Insomma, se avete due minutini fate la carità di spiegarmi una volta per sempre come gestire gli eventi in vba.


centomila grazie :D
calculon
Utente Senior
 
Post: 161
Iscritto il: 07/01/11 15:08

Re: Vba e Html

Postdi Anthony47 » 14/11/12 13:00

Mi chiedo come tu possa dalla routine principale richiamare un evento come documentcomplete.
Si utilizza il call?
L' evento "documentcomplete" devi aspettare che si verifichi, e se si verifica verra' attivata da sola la relativa macro; nell' esempio sara' aumentato di 1 il contenuto di B1.
La programmazione "ad eventi" (asincrona) e' certamente piu' complessa di quella sequenziale (sincrona) perche' bisogna costantemente essere pronti a gestire un "evento"; questo comporta che nella routine principale devi predisporre la gestione degli eventi, poi devi attivare la situazione che ti generera' in modo asincrono l' evento, es:
-Memorizza che andiamo a leggere la pagina pc-facile.com
-Naviga alla pagina pc-facile.com
-Fine macro principale

Routine di evento:
-Controlla la pagina corrente
-Verifica se per quella pagina e' atteso un evento
-Se Si, richiama la macro di gestione

Si tratta quindi di una modalita' che richiede piu' abilita' del normale, compresa la facilita' a creare e lavorare su strutture dati astratte.

Insomma, se avete due minutini fate la carità di spiegarmi una volta per sempre come gestire gli eventi in vba.
"Una volta per sempre" e' un concetto troppo forte, quando si parla di programmazione.

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Vba e Html

Postdi calculon » 23/11/12 20:36

Scusate se insisto, ma vorrei provare in qualche modo a gestire l'evento download in maniera stabile.

Posto che il sito microsoft suggerisce l'utilizzo dell'evento citato per gestire tutti i download compiuti attraverso Internet Explorer, mi chiedo in che modo praticamente devo stabilire la sintassi del codice.


Ad es.

Private Sub Naviga()

dim IE as Object

set IE = createobject ("internet explorer")

With Ie
.Navigate sURL
.Visible = True
End With

------> in questo momento si innesca un download e vorrei che intervenisse la sub dell'evento

end sub


con questa sintassi si aggancia oppure no alla routine sotto riportata?


Private Sub Ie_DocumentComplete(ByVal pDisp As Object, URL As Variant)

Range("B1") = Range("B1") + 1 'Azione sull' evento

End Sub


Grazie mille
calculon
Utente Senior
 
Post: 161
Iscritto il: 07/01/11 15:08

Re: Vba e Html

Postdi Anthony47 » 24/11/12 02:35

La sub Naviga avvia una navigazione.
Quando all' interno di IE si completa il download del documento (in pratica quando la pagina web diventa visibile) scatta l' evento DocumentComplete e quindi si innesca la seconda macro che hai elencato.
TUTTAVIA questo e' reletivo alla disponibilita' del documento "html" all' interno del browser, non e' applicabile al download di un documento tipo pdf anche se questo viene poi visualizzato dal suo programma (es Adobe Reader) embedded all' interno di IE.
Insomma se la tua preoccupazione e' di sapere quando un download attivato in una pagina web e' terminato allora la strada e' diversa.
Purtroppo le mie conoscenze si fermano, non conosco quale strumento possa darti una mano.

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Vba e Html

Postdi calculon » 24/11/12 15:13

Provo ad insistere.

Ho pensato di risolvere in questo modo, anche se, la verità, ho difficoltà ad eseguire concretamente il mio progetto.

Dunque, se il file pdf viene aperto dal browser questo significa che l'immagine va a finire fra i file temporanei; così - almeno in linea teorica - sarebbe possibile impostare un ciclo di ricerca del nome del pdf oggetto di download finché questo venga rilevato nella dir in seguito riportata (segno che il download è stato completato). A questo punto si dovrebbe poter procedere con la ridenominazione e il salvataggio in altra cartella (magari sul desktop).

Il problema principale è che i file vengono salvati nelle subdir di "C:\Users\User\AppData\Local\Microsoft\Windows\Temporary Internet Files\Low\Content.IE5\"
HRTH9HB0
CS6Y9D55
70GY84CJ
OVVP37VW

ed ho difficoltà a reperire il file esatto.


Cosa ne pensate?

Grazie.
calculon
Utente Senior
 
Post: 161
Iscritto il: 07/01/11 15:08

Re: Vba e Html

Postdi Anthony47 » 25/11/12 00:04

Perdona, ma hai detto "come" stai cercando di risolvere e non "quale è" il problema da risolvere; non so nemmeno se conosci o puoi conoscere il nome dei file da scaricare.
Quindi il mio suggerimento e' che ti fermi un attimo e parti da zero, magari viene anche a noi un' idea su come procedere.

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Prossimo

Torna a Applicazioni Office Windows


Topic correlati a "Vba e Html":

file audio /link html
Autore: nikita75
Forum: Software Windows
Risposte: 1

Chi c’è in linea

Visitano il forum: Nessuno e 34 ospiti