Get data from each link in webpage to excel - vba

I'm trying to get data from the webpage.(some link)
In that webpage, there are many tickets(link) raised by customer. I need to go through each link and get some specific data from each tickets(link).
My program needs to click each review link and get some data from each link.
My program successfully picks the 1st ticket data but not all(click the 1st link and successfully get the 1st link data then it throws error).
it throws error(Access error)
Sorry my code is huge
Option Explicit
Sub AVS()
Dim ie As InternetExplorer
Dim iedoc As HTMLDocument
Dim innerString As String
Dim ttext As Integer
Dim avsHtmlTable As Object
Dim links As HTMLAnchorElement
Dim link As Object
Dim lRow As Integer
Set ie = New InternetExplorer
ie.Visible = True
ie.Navigate "https://apj-i.svcs.hp.com/itam-av1/"
Do While ie.Busy
DoEvents
Loop
Do Until ie.ReadyState = READYSTATE_COMPLETE
DoEvents
Loop
Set iedoc = ie.Document
With iedoc.forms("Login")
.all.Item("USER").Value = "Mail id goes here"
.all.Item("PASSWORD").Value = "pw goes here"
.submit
End With
Do While ie.Busy
DoEvents
Loop
Do Until ie.ReadyState = READYSTATE_COMPLETE
DoEvents
Loop
With iedoc.forms("aspnetForm")
.all.Item("ctl00$conNavBar$acpAssets_content$btnAssets-ExceptionSearch").Click
End With
Do While ie.Busy
DoEvents
Loop
Do Until ie.ReadyState = READYSTATE_COMPLETE
DoEvents
Loop
With iedoc.forms("aspnetForm")
.all.Item("ctl00$conMainPageContent$txtMaxRows").Value = 100
.all.Item("ctl00$conMainPageContent$rblStatus").Item(4).Checked = True
.all.Item("ctl00$conMainPageContent$btnAssetExceptionSearch").Click
End With
Do While ie.Busy
DoEvents
Loop
Do Until ie.ReadyState = READYSTATE_COMPLETE
DoEvents
Loop
With iedoc.forms("aspnetForm")
innerString = .innerText
ttext = InStr(innerString, "There are no results found for this query")
If Not ttext = 0 Then
MsgBox "There are no Tickets are there in AVS - Exception ", vbInformation, "AVS-Exception"
Else
''ctl00_conMainPageContent_grdAssetExceptionSearchResults
Set avsHtmlTable = iedoc.getElementsByTagName("a")
For Each link In avsHtmlTable
If link.innerHTML = "Review" Then
link.Click
Do While ie.Busy
DoEvents
Loop
Do Until ie.ReadyState = READYSTATE_COMPLETE
DoEvents
Loop
With Sheets("AVS")
set iedoc=ie.document
lRow = .Range("A10000").End(xlUp).Row
> ## ' error throws here
Range("A" & lRow).Value = iedoc.getElementById("ctl00_conMainPageContent_ddlAssignment").Value
End With
End If
Next link
End If
End With
End Sub
Sorry .. Not able to attach the image due to my 1st post.

Related

Getting stuck Internet explorer automation in vba to calculate the distance between two places using google map

Sub Automate_IE_Load_Page()
Dim i As Long
Dim URL As String
Dim IE As Object
Dim objElement As Object
Dim objCollection As Object
Set IE = CreateObject("InternetExplorer.Application")
IE.Visible = True
URL = "https://www.google.com/maps"
IE.Navigate URL
Application.StatusBar = URL & " is loading. Please wait..."
Do While IE.ReadyState = 4: DoEvents: Loop 'Do While
Do Until IE.ReadyState = 4: DoEvents: Loop 'Do Until
Application.StatusBar = URL & " Loaded"
IE.document.getElementById("searchbox-directions").Click
You can set the values of the start point and the destination to get the route and the distance. Please check my sample below:
Sub Automate_IE_Load_Page()
Dim i As Long
Dim URL As String
Dim IE As Object
Dim objElement As Object
Dim objCollection As Object
Set IE = CreateObject("InternetExplorer.Application")
IE.Visible = True
URL = "https://www.google.com/maps"
IE.Navigate URL
Application.StatusBar = URL & " is loading. Please wait..."
Do Until IE.readyState = 4
DoEvents
Loop
Application.StatusBar = URL & " Loaded"
IE.document.getElementById("searchboxinput").Value = "Lincoln Park, Chicago, IL" 'set the destination
IE.document.getElementById("searchbox-directions").Click
IE.document.getElementsByClassName("tactile-searchbox-input")(2).Value = "Chicago, Illinois" 'set the start point
Application.SendKeys "{ENTER}"
IE.document.getElementsByClassName("searchbox-searchbutton")(2).Click
End Sub
The result is like this: https://imgur.com/1JFk7l3

Selecting value from a dropdown list on a webpage using vba

On this site I am able to select the country and language from dropdown menu but when I click on "Complete new application form" button. It says fields are empty.
Any help would be appreciated.
Sub Test()
strURL = "https://visa.kdmid.ru/PetitionChoice.aspx"
With ie
.Visible = True
.navigate strURL
While .Busy
DoEvents
Wend
Set html = .document
'Country where you will apply for visa.
Set ctY = html.getElementById("ctl00$phBody$Country")
For i = 1 To ctY.Options.Length
If ctY.Options(i).Text = "NETHERLANDS" Then
ctY.selectedIndex = i
Exit For
End If
Next i
'Select Language
Set lnG = html.getElementById("ctl00$phBody$ddlLanguage")
For i = 1 To lnG.Options.Length
If lnG.Options(i).Text = "ENGLISH" Then
lnG.selectedIndex = i
Exit For
End If
Next i
'Click I have read instructions check box
html.getElementById("ctl00$phBody$cbConfirm").Click
'Click apply button
Set btnGo = html.forms(0).all("ctl00$phBody$btnNewApplication")
btnGo.Click
End With
End Sub
So you are on the right track but if you look at the HTML of the site there are actually two elements with the country selection- you got the first one, 'ctl00_phBody_Country', but this is actually just the drop down, and the actual selected value is stored in 'ctl00_phBody_cddCountry_ClientState'... the language section has similar structure. Lastly the accepted value is not just the country name you see in the drop down, it is actually a combination of a country code from the drop down and the country name....
See below for sample code:
Public Sub Test()
Dim IE As InternetExplorer
Dim HTMLDoc As HTMLDocument
Dim countryStr As String
Dim countryObj As HTMLObjectElement
Dim countryCodes As IHTMLElementCollection
Dim codeCounter As Long
Dim languageStr As String
Dim languageObj As HTMLObjectElement
Dim languageCodes As IHTMLElementCollection
countryStr = "Netherlands"
languageStr = "English"
Set IE = New InternetExplorer
With IE
.Visible = False
.Navigate "https://visa.kdmid.ru/PetitionChoice.aspx?AspxAutoDetectCookieSupport=1"
While .Busy Or .ReadyState <> READYSTATE_COMPLETE: Wend
Set HTMLDoc = IE.document
End With
Set countryObj = HTMLDoc.getElementById("ctl00_phBody_cddCountry_ClientState")
Set countryCodes = HTMLDoc.getElementById("ctl00_phBody_Country").getElementsByTagName("option")
For codeCounter = 0 To countryCodes.Length - 1
If countryCodes(codeCounter).innerText = UCase(countryStr) Then
countryObj.Value = countryCodes(codeCounter).Value & ":::" & countryCodes(codeCounter).innerText & ":::"
While IE.Busy Or IE.ReadyState <> READYSTATE_COMPLETE: Wend
Exit For
End If
Next
Set languageObj = HTMLDoc.getElementById("ctl00_phBody_cddLanguage_ClientState")
Set languageCodes = HTMLDoc.getElementById("ctl00_phBody_ddlLanguage").getElementsByTagName("option")
For codeCounter = 0 To languageCodes.Length - 1
If languageCodes(codeCounter).innerText = UCase(languageStr) Then
languageObj.Value = languageCodes(codeCounter).Value & ":::" & languageCodes(codeCounter).innerText & ":::"
While IE.Busy Or IE.ReadyState <> READYSTATE_COMPLETE: Wend
Exit For
End If
Next
HTMLDoc.getElementById("ctl00$phBody$cbConfirm").Click
While IE.Busy Or IE.ReadyState <> READYSTATE_COMPLETE: Wend
HTMLDoc.getElementById("ctl00_phBody_btnNewApplication").Click 'Launch Form
IE.Quit
Set IE = Nothing
End Sub

Use VBA IE Automation to send message from pinkoi.com

Forgive my English. Using VBA Automation of Internet Explorer, I want to send message from pinkoi.com.
Now I can show the send message form,But I don't know how to input the subject and body and select file and send it.
the send form photo
Sub test()
Dim ie As Object 'SHDocVw.InternetExplorer
Set ie = CreateObject("InternetExplorer.Application")
Call login(ie) 'just for login
Call show_the_form(ie) 'My problem in here
End Sub
Sub login(ie)
ie.Visible = True
ie.Navigate "https://www.pinkoi.com/user/testpkko"
Do While ie.Busy Or ie.readyState <> 4: DoEvents: Loop
Dim anchorTags As Object 'MSHTML.IHTMLElementCollection
Set anchorTags = ie.document.GetElementsByTagName("A")
Dim oAnchorLoop As Object 'MSHTML.IHTMLAnchorElement
For Each oAnchorLoop In anchorTags
Dim anchorText As String
anchorText = oAnchorLoop.Text
If anchorText = ChrW(20659) & ChrW(36865) & ChrW(35338) & ChrW(24687) Then
Dim oAnchorLogon As Object 'MSHTML.IHTMLAnchorElement2
Set oAnchorLogon = oAnchorLoop
oAnchorLogon.Click
Exit For
End If
Next
Do While ie.Busy Or ie.readyState <> 4: DoEvents: Loop
'* so now logon form should be visible
On Error Resume Next
Dim oUserNameInput As Object 'MSHTML.IHTMLInputElement
Set oUserNameInput = ie.document.getElementById("n-login-id")
nowtime = Timer
Do While ie.Busy Or ie.readyState <> 4 Or oUserNameInput Is Nothing
DoEvents
If Timer - nowtime > 1 Then Exit Do 'Already logoin
Set oUserNameInput = ie.document.getElementById("n-login-id")
Loop
oUserNameInput.Value = "testpkko"
Dim oUserPassword As Object 'MSHTML.IHTMLInputElement
Set oUserPassword = ie.document.getElementById("n-login-password")
oUserPassword.Value = "abc123"
Dim oListElement As Object 'MSHTML.HTMLLIElement
Set oListElement = oUserNameInput.parentElement
Dim oUnorderedList As Object 'MSHTML.IHTMLUListElement
Set oUnorderedList = oListElement.parentElement
Dim oForm As Object 'MSHTML.IHTMLFormElement
Set oForm = oUnorderedList.parentElement
Dim oSubmitInputElememt As Object 'MSHTML.HTMLInputElement
Set oSubmitInputElememt = Nothing
Dim lFormChildrenLoop As Long
For lFormChildrenLoop = 1 To oForm.all.Length
If oForm.elements.Item(lFormChildrenLoop).Type = "submit" Then
Set oSubmitInputElememt = oForm.elements.Item(lFormChildrenLoop)
Exit For
End If
Next lFormChildrenLoop
If Not oSubmitInputElememt Is Nothing Then
'Stop '* get ready .....
oSubmitInputElememt.Click
Do While ie.Busy Or ie.readyState <> 4: DoEvents: Loop
End If
End Sub
Sub show_the_form(ie)
Application.Wait Now + TimeValue("00:00:03")
ie.Navigate "https://en.pinkoi.com/user/testpkko2" 'After login we can trip to other people website
Do While ie.Busy Or ie.readyState <> 4: DoEvents: Loop
With ie.document
On Error Resume Next
For Each E In .GetElementsByTagName("A")
a = E.Text
If CStr(a) = "Message" Then
E.Click 'After Click I want to send a message
'how can I input Subject and body and select file to upload?
'And I want to learn how to do this , Very thanks.
End If
Next
End With
End Sub
Sorry we downvoted you, try this. If we click on the anchor you specified but I needed to use Unicode character logic. The rest is just navigating the DOM. I have put default username and password of "hello" and "world".
Option Explicit
Private Sub test()
'use ie open https://www.pinkoi.com/
'Please use FB login then web
'* Might want to consider using the Tools References to give yourself Intellisense
'* Tools->References Microsoft Internet Controls
'* Tools->References Microsoft HTML Object Library
Dim IE As Object 'SHDocVw.InternetExplorer
Set IE = CreateObject("InternetExplorer.Application")
IE.Visible = True
IE.Navigate "https://www.pinkoi.com/user/testpkko"
Do While IE.Busy Or IE.readyState <> 4: DoEvents: Loop
Dim anchorTags As Object 'MSHTML.IHTMLElementCollection
Set anchorTags = IE.document.GetElementsByTagName("A")
Dim oAnchorLoop As Object 'MSHTML.IHTMLAnchorElement
For Each oAnchorLoop In anchorTags
Dim anchorText As String
anchorText = oAnchorLoop.Text
If anchorText = ChrW(20659) & ChrW(36865) & ChrW(35338) & ChrW(24687) Then
Dim oAnchorLogon As Object 'MSHTML.IHTMLAnchorElement2
Set oAnchorLogon = oAnchorLoop
oAnchorLogon.Click
Exit For
'oAnchorLoop.Click 'here can show the form,but i can put message and select file from it
End If
Next
Do While IE.Busy Or IE.readyState <> 4: DoEvents: Loop
'* so now logon form should be visible
On Error Resume Next
Dim oUserNameInput As Object 'MSHTML.IHTMLInputElement
Set oUserNameInput = IE.document.getElementById("n-login-id")
Do While IE.Busy Or IE.readyState <> 4 Or oUserNameInput Is Nothing
DoEvents
Set oUserNameInput = IE.document.getElementById("n-login-id")
Loop
oUserNameInput.Value = "hello"
Dim oUserPassword As Object 'MSHTML.IHTMLInputElement
Set oUserPassword = IE.document.getElementById("n-login-password")
oUserPassword.Value = "world"
Dim oListElement As Object 'MSHTML.HTMLLIElement
Set oListElement = oUserNameInput.parentElement
Dim oUnorderedList As Object 'MSHTML.IHTMLUListElement
Set oUnorderedList = oListElement.parentElement
Dim oForm As Object 'MSHTML.IHTMLFormElement
Set oForm = oUnorderedList.parentElement
Dim oSubmitInputElememt As Object 'MSHTML.HTMLInputElement
Set oSubmitInputElememt = Nothing
Dim lFormChildrenLoop As Long
For lFormChildrenLoop = 1 To oForm.all.Length
If oForm.elements.Item(lFormChildrenLoop).Type = "submit" Then
Set oSubmitInputElememt = oForm.elements.Item(lFormChildrenLoop)
Exit For
End If
Next lFormChildrenLoop
If Not oSubmitInputElememt Is Nothing Then
Stop '* get ready .....
oSubmitInputElememt.Click
End If
End Sub
I alreay know how to input subject and body and send the file
ie.document.all("title").Value = "subject"
ie.document.all("description").Value = "Body"
For Each e In ie.document.GetElementsByTagName("INPUT")
a = e.Type
If CStr(a) = "submit" Then e.Click
Next
But after click select file , it will no response and program will stop
did anybody can use vba to select file?
ie.document.all("file").Click

How to select values from Dropdown menu on a webpage:VBA

My code :
Sub login()
Dim IE As Object
Dim HTMLDoc As Object, HTMLDoc2 As Object
Dim objCollection As Object
Const navOpenInNewTab = &H800
Set IE = CreateObject("InternetExplorer.Application")
IE.Visible = True
IE.Navigate "https:/com/1/19/login.esp"
Do While IE.Busy Or IE.ReadyState <> 4: Loop
Set HTMLDoc = IE.Document
With HTMLDoc
HTMLDoc.getElementById("USERNAME").Value = "xxxx" 'Entering credential
HTMLDoc.getElementById("PASSWORD").Value = "yyyyy"
End With
Set objCollection = IE.Document.getElementById("loginbutton")
objCollection.Click
'Second webpage
Do While IE.Busy Or IE.ReadyState <> 4: Loop ' opening the second webpage
Set HTMLDoc2 = IE.Document
With HTMLDoc2
**HTMLDoc2.getElementById("DEPARTMENTID").selectedindex = 1 'Drop down menu
HTMLDoc2.getElementById("DEPARTMENTID").FireEvent ("onchange")**
End With
Set objCollection = IE.Document.getElementById("loginbutton")
objCollection.Click
End Sub
Q)What code changes do I do to select Dwell_DF option Value 1567?
The above code gives run time error '424' : Object required.
HTMLDoc2.getElementById("DEPARTMENTID").selectedindex = 1 'Drop down menu
HTMLDoc2.getElementById("DEPARTMENTID").FireEvent ("onchange")
The above line give the error.
In the first webpage I fill the login credentials then in the next page is that of the image pasted with this post. Here I want to change the value in the drop down menu.
Give this a try. The value "1567" corresponds with the InnerText "Dwell_DF".
With HTMLDoc2
.getElementById("DEPARTMENTID").Focus
.getElementById("DEPARTMENTID").Value = "1567" 'You can also loop to find the text of the Option
.getElementById("DEPARTMENTID").FireEvent ("onchange")
End With
It should be something like this.
Sub passValueToComboBox1()
Dim ie As Object
Dim oHTML_Element As IHTMLElement
Set ie = CreateObject("InternetExplorer.Application")
ie.Visible = True
ie.navigate "http://your_URL_here.php"
While ie.Busy Or ie.readyState <> 4: DoEvents: Wend
Set oHTML_Element = ie.document.getElementsByName("selectedReportClass")(0)
If Not oHTML_Element Is Nothing Then oHTML_Element.Value = "FUBU7"
For Each oHTML_Element In ie.document.getElementsByTagName("input")
If oHTML_Element.Type = "submit" Then oHTML_Element.Click: Exit For
Next
End Sub
Check out the link below for some other ideas of how to programatically interact with a web site.
http://vbadud.blogspot.com/2009/08/how-to-login-to-website-using-vba.html

IE innerHTML after clicking on link

I'm using Excel-vba, and trying to get the innerHTML of an InternetExplorer Object, my problem is that after clicking on a link, the innerHTML doesn't change and stays as the first navigation.
is there a way to get the innerHTML of the next page after clicking the link?
Here is the code:
Dim ie As InternetExplorer
Dim hd As HTMLDocument
Set ie = New InternetExplorer
ie.navigate "http://www.stormchaser.niu.edu/machine/textfcstsound.html"
Do While ie.readyState <> READYSTATE_COMPLETE
DoEvents
Loop
Set hd = ie.document
hd.all.Item("mo")(4).Checked = True
hd.all.Item("ft")(11).Checked = True
Set objInputs = ie.document.getElementsByTagName("input")
For Each ele In objInputs
If ele.Type = "submit" Then
ele.Click
End If
Next
Do While ie.readyState <> READYSTATE_COMPLETE
DoEvents
Loop
hd.Links(0).Click
Range("K4") = ie.document.body.innerHTML
I'd really thank for any help.
Jon
It looks likes a timing issue which I find is a very common problem in automating IE. The code is not waiting for the following page to load before executing hd.Links(0).Click so it is actually clicking a link on the old page. I tested the following code and it seems to run fine. It is using the page title as a check if it is loaded instead of ie.ReadyState which doesn't seem to be working.
Sub test()
Dim ie As InternetExplorer
Dim hd As HTMLDocument
Set ie = New InternetExplorer
ie.Navigate "http://www.stormchaser.niu.edu/machine/textfcstsound.html"
ie.Visible = True
Do While ie.ReadyState <> READYSTATE_COMPLETE
DoEvents
Loop
Set hd = ie.Document
hd.all.Item("mo")(4).Checked = True
hd.all.Item("ft")(11).Checked = True
Set objInputs = ie.Document.getElementsByTagName("input")
For Each ele In objInputs
If ele.Type = "submit" Then
ele.Click
'Debug.Print ele.outerHTML
End If
Next
Do While hd.Title <> "Forecast Sounding Text Output for KOKC" ' ie.ReadyState <> READYSTATE_COMPLETE
'Debug.Print hd.Title, hd.Links(0)
'DoEvents
Loop
'While ie.ReadyState <> READYSTATE_COMPLETE: Wend
Set hd = ie.Document
Debug.Print hd.Title, hd.Links(0)
hd.Links(0).Click
'Do While ie.ReadyState <> READYSTATE_COMPLETE
' DoEvents
'Loop
While ie.ReadyState <> READYSTATE_COMPLETE: Wend
Do While hd.Title <> "" ' ie.ReadyState <> READYSTATE_COMPLETE
Loop
Debug.Print hd.Title, hd.body.innerHTML
Range("K4") = hd.body.innerHTML
End Sub
I would also suggest ie.Visible for debugging. Hope that helps.
I got it, you're right that it's a timing issue, I found out how to catch the right second for calling the innerHTML method without freezing Excel, it gives Excel a timeout of 20 seconds waiting for the new window, otherwise it returns "failed".
here is the full code:
Set ie = New InternetExplorer
ie.navigate "http://www.stormchaser.niu.edu/machine/textfcstsound.html"
Do While ie.readyState <> READYSTATE_COMPLETE
DoEvents
Loop
Set hd = ie.document
T1 = ie.document.Title
hd.all.Item("mo")(4).Checked = True
hd.all.Item("ft")(10).Checked = True
hd.getElementById("stn").Value = "LLBG"
Set objInputs = ie.document.getElementsByTagName("input")
For Each ele In objInputs
If ele.Type = "submit" Then
ele.Click
End If
Next
Do While ie.readyState <> READYSTATE_COMPLETE
DoEvents
Loop
T2 = Now
Do While (Now < T2 + TimeValue("0:00:20")) And ie.document.Title = T1
DoEvents
Loop
If ie.document.Title = T1 Then
Debug.Print "failed"
GoTo end_ext
End If
T1 = ie.document.Title
ie.document.Links(0).Click
Do While ie.readyState <> READYSTATE_COMPLETE
DoEvents
Loop
T2 = Now
Do While (Now < T2 + TimeValue("0:00:20")) And ie.document.Title = T1
DoEvents
Loop
If ie.document.Title = T1 Then
Debug.Print "failed"
GoTo end_ext
Else
'Debug.Print "succeeded"
End If
Debug.Print ie.document.body.innerText
end_ext:
ie.Quit
Set hd = Nothing
Set ie = Nothing