#1
|
|||
|
|||
IE9- "document.getElementsByClassName" problem
Code:
Function w(cName As String, q As String) On Error Resume Next Dim IE As New InternetExplorer IE.Visible = False IE.navigate "http://hk.dictionary.yahoo.com/dictionary?p=" & q Do DoEvents Loop Until IE.readyState = READYSTATE_COMPLETE Dim html As HTMLDocument Set html = IE.document Dim y As Integer y = -1 Do Until y > html.getElementsByTagName("div").Length y = y + 1 If html.getElementsByTagName("div")(y).ClassName = cName Then _ w = html.getElementsByTagName("div")(y).innerText End If Loop IE.Quit On Error GoTo 0 End Function I thought ClassName only works in IE9 so I tweaked the code above a bit and hoped to have a workaround. It works. It is far from perfect, though. (Use of "document.getElementsByClassName" can save me work on looping the tags to find where the classname is. I wonder if there's a direct approach for it. (I can do it in JS but very good in VB) |
#2
|
||||
|
||||
Hi tinfanide,
The document.getElementsByClassName parameter is available in IE9 / HTML5. So, if it's not working on your users' PCs, it would seem that either their IE9 installation is faulty or they don't actually have IE9 installed.
__________________
Cheers, Paul Edstein [Fmr MS MVP - Word] |
#3
|
|||
|
|||
Quote:
Code:
Option Explicit Function GetElementsByClassName1(cName As String, q As String) Dim IE As New InternetExplorer IE.Visible = True IE.navigate "http://hk.dictionary.yahoo.com/dictionary?p=" & q Dim html As HTMLDocument Set html = IE.Document Do Until IE.readyState = 4 Loop Dim Result Dim tag Dim tags As Object Set tags = html.getElementsByTagName("*") Result = Array() For Each tag In tags If tag.className = cName Then ReDim Preserve Result(UBound(Result) + 1) Set Result(UBound(Result)) = tag End If Next tag GetElementsByClassName1 = Result(0).getElementsByTagName("div")(0).innerText IE.Quit End Function Could ya please debug the code for me? It seems that I cannot pass the arguments directly "strings" (with reference to the error help in Excel) It's beyond what I know about VBA. |
#4
|
|||
|
|||
Well, I've made another try and the result was more weird.
GetElementsByClassName.xlsm If I debug it in VBA Editor, it returns the results in each cell. But when I run it as a macro, it does not return any value. |
#5
|
|||
|
|||
Just fix it.
Code:
Sub WebDictQuery() Dim x As Integer Dim Query As String For x = 1 To 3 Cells(x, 3).Value = GetElementsByClassName("pronunciation", Cells(x, 1).Value) Next x End Sub Function GetElementsByClassName(className, q) '''''''''''''''''''''''''''''''''''''''' Dim IE As Object Set IE = CreateObject("InternetExplorer.Application") '''''''''''''''''''''''''''''''''''''''' IE.Visible = False IE.navigate "http://hk.dictionary.yahoo.com/dictionary?p=" & q Do Until IE.readyState = 4 Loop Dim Result Dim tag Dim tags As Object ''''''''''''''''''''''''''''''''''''''''''''''''''' Set tags = IE.document.getElementsByTagName("*") ''''''''''''''''''''''''''''''''''''''''''''''''''' Result = Array() For Each tag In tags If tag.className = className Then ReDim Preserve Result(UBound(Result) + 1) Set Result(UBound(Result)) = tag End If Next tag GetElementsByClassName = Result(0).getElementsByTagName("div")(0).innerText IE.Quit '''''''''''''''''''''''''''''''''''' Set IE = Nothing '''''''''''''''''''''''''''''''''''' End Function Code:
Set html = IE.Document |
#6
|
||||
|
||||
Hi tinfanide,
I'm not familiar with IE automation. However, when I test your funnction with: Code:
Sub Test() GetElementsByClassName1 "pronunciation", "dog" End Sub 'Set html = IE.Document' after the 'Loop' line. Speaking of which your 'Do Until ... Loop' should have a 'DoEvents' statement, like: Code:
Do Until IE.readyState = READYSTATE_COMPLETE DoEvents Loop Your code would also be more efficient with: Code:
Result = Array(0) For Each tag In tags If tag.className = cName Then Set Result(0) = tag Exit For End If Next tag GetElementsByClassName1 = Result(0).getElementsByTagName("div")(0).innerText Code:
For Each tag In tags If tag.className = cName Then GetElementsByClassName1 = tag.getElementsByTagName("div")(0).innerText Exit For End If Next tag PS: I'm moving the thread to the Excel forum, as you've posted in the Word vba forum and your attachment shows this is really for Excel.
__________________
Cheers, Paul Edstein [Fmr MS MVP - Word] |
#7
|
|||
|
|||
Yes, thanks for your input.
I've forgotten the use of Exit For and without this it'll make the application work unnecessarily after it finishes its job. Yes, the use of array here is not necessary. The most amazing part is that "set" has to be placed after the loop event. |
|
Similar Threads | ||||
Thread | Thread Starter | Forum | Replies | Last Post |
How to edit the "Format" and the "show level" of an EXISTING table of content? | Jamal NUMAN | Word | 2 | 08-14-2011 10:46 AM |
Word 2003 document suddenly "locked for editing" by me | lisa801 | Word | 3 | 07-08-2011 10:11 PM |
"Table of content" based on "Normal Style" behavior!!!! | Jamal NUMAN | Word | 4 | 07-08-2011 04:12 AM |
How to choose a "List" for certain "Heading" from "Modify" tool? | Jamal NUMAN | Word | 2 | 07-03-2011 03:11 AM |
"Microsoft Excel Application" missing in the "Component Services" on win08 | sword.fish | Excel | 0 | 02-26-2010 02:09 PM |