Opzione di modifica VBA di Excel nel tag di selezione HTML

Recentemente, ho postato la domanda vbscript capture text nel tag dell’opzione di selezione HTML . Questo mi ha aiutato moltissimo su una piattaforma di Internet Explorer. Tuttavia, ho un nuovo progetto con un po ‘più complesso di un sito web. Il sito Web ha più tabelle nidificate che sono formattate per contenere gli elementi del form . Il mio team e io abbiamo capito come ottenere e impostare i dati all’interno della maggior parte degli elementi tranne la casella a discesa ( select tag). Siamo in grado di ottenere il testo dal menu a discesa, ma non possiamo modificare il valore. Invece, tutte le opzioni vengono cancellate e l’intera discesa è vuota.

Ecco una versione riveduta del codice per il sito web in quanto vi è molto più codice in questione, ma viene mostrato solo il codice pertinente:

  ...  
...
...
...
.........
...
...... </table
... ... ... ... ... ... ... --Select User-- Amy Jones (000456321) Brian Wyatt (000745632) Carl Lister (000874563) Daniel Michaels (000987456) Elizabeth Sweeny (001456321) Fran Tarris (001745632) Gail McMurphy (001874563) Hannah Barisce (001987456)

Per essere in grado di ottenere il testo dal txt_input1 discesa, abbiamo utilizzato il nome della class txt_input1 dopo aver individuato il nodo all’interno della tabella che contiene il txt_input1 discesa. Questo codice ci darà l’intera lista all’interno del menu a discesa:

objIE.Document.getElementsByTagName("table")(0).getElementsByTagName("td").Item(64).GetElementsByClassName("txt_input1")(0).innerText

Ho provato a cambiare il valore del menu a discesa di select da “–Seleziona utente–” a uno dei nomi nell’elenco con il seguente codice:

objIE.Document.getElementsByTagName("table")(0).getElementsByTagName("td").Item(64).GetElementsByClassName("txt_input1")(0).innerText = "Carl Lister"

Ciò ha comportato la discesa vuota. Se ho cambiato il finale in .Value , rimuove solo “–Seleziona utente–” dalla visualizzazione. Ancora non cambia il valore in “Carl Lister”. C’è qualcosa che ci manca quando si tratta di selezionare option in una select discesa all’interno di tabelle annidate?

Per un elemento select , il modo migliore per cambiare il valore visualizzato è “selezionare” uno degli elementi option che fanno parte del menu. Per fare ciò, puoi cambiare il tuo codice in questo modo:

 objIE.Document.getElementsByTagName("table")(0).getElementsByTagName("td").Item(64).GetElementsByClassName("txt_input1")(0).childNodes(x).selected = true 

Il codice precedente selezionerebbe il nodo figlio (l’elemento option ) all’indice x e lo selezionerà a livello di programmazione, in modo tale che il valore venga visualizzato nell’elemento select . L’indice per le opzioni inizia da 0, quindi per x = 0 seleziona la prima opzione (in questo caso, Amy Jones ).

Potresti anche semplificare il codice sopra riportato per leggere solo:

 objIE.Document.getElementsByClassName("txt_input1")(0).childNodes(x).selected = true 

Oppure potresti anche farlo da id dato che hai un ID assegnato al menu:

 objIE.Document.getElementById("user").childNodes(x).selected = true 

Se si desidera selezionare un nome dipendente dall’elenco a discesa, è ansible scorrere tra le opzioni esistenti e trovare quella corretta come questa (codice adattato dal codice VBA in questa domanda ):

 Dim el As IXMLDOMNode Dim childNode As IXMLDOMNode el = objIE.Document.getElementById("user") For Each childNode in el.ChildNodes If InStr(childNode.innerText, emplName) Then childNode.selected = true Exit For End If Next childNode 

In questo esempio, emplName è qualsiasi dipendente che si desidera selezionare.

(Il mio VBA è un po ‘arrugginito, quindi mi scuso se qualcuno della syntax è distriggersto.)

Grazie, @ freginold, per tutto il tuo aiuto. Il mio team e io abbiamo trovato una soluzione che amplia le nostre soluzioni già sviluppate.

 tdNode = 64 i = 0 For Each objOption In objIE.Document.GetElementsByTagName("table")(0).GetElementsByTagName("td")(tdNode).GetElementsByClassName("txt_input1")(0).Options Q(i) = objOption.Text & "-" & objOption.Value QNm = QNm & "|" & Q(i) i = i + 1 If objOption.Selected Then strWQ = objOption.Text End If If i > 53 Then MsgBox "stuck" SetEverythingToNothing End If Next QNm = QNm & "|=" & strWQ a = 1 MyArray = Split(QNm, "|") For a = LBound(MyArray) To UBound(MyArray) If InStr(MyArray(a), UserName) Then strWQ = MyArray(a) End If Next SelQ = Mid(strWQ, InStr(strWQ, "-") + 1, Len(strWQ) - InStr(strWQ, "-")) For Each objOption In objIE.Document.GetElementsByTagName("table")(0).GetElementsByTagName("td")(tdNode).GetElementsByClassName("txt_input1")(0).Options If objOption.Value = SelQ Then objOption.Selected = True objIE.Document.GetElementsByTagName("table")(0).GetElementsByTagName("td")(tdNode).GetElementsByClassName("txt_input1")(0).OnChange Else objOption.Selected = False End If Next