我正在使用excel VBA打开google结果的第一个返回页面。从第一页开始,我根据元素ID操作数据。在这个过程中,我遇到了一个非常奇怪的行为。
让我简要介绍一下我的目标。
我将在用户表单中输入名字和姓氏作为输入。对于给定的名字和姓氏,我将搜索linkedin个人资料。
例如,如果名字是Sachin而且姓氏是Tendulkar,我将使用VBA将搜索字词作为 Sachin Tendulkar linkedin 传递给google。对于返回的搜索结果,我将打开第一个搜索结果页面并尝试获取linkedin配置文件数据。
我的代码到目前为止如下。
Private Sub CommandButton1_Click()
Dim ie As InternetExplorer
Dim RegEx As RegExp, RegMatch As MatchCollection
Dim MyStr As String
Dim pDisp As Object
Dim FirstName As String
Dim LastName As String
Dim sample As String
Set ie = New InternetExplorer
Set RegEx = New RegExp
Dim iedoc As Object
Dim openedpage As String
Dim inpagestrt, inpageend As Integer
Dim returnstatement As String
Dim detailname, locationdetails, profileexperience, profilecontact
Dim overview,skillslist, profilelanguages, profileeducation, publicgroups
detailname = ""
returnstatement = ""
locationdetails = ""
profileexperience = ""
profilecontact = ""
overview = ""
skillslist = ""
profilelanguages = ""
profileeducation = ""
publicgroups = ""
FirstName = TextBox1.Value
LastName = TextBox2.Value
ie.Navigate "http://www.google.com/search?hl=en&q=" & FirstName & "+" & LastName & "+linkedin&meta="
Do Until ie.ReadyState = READYSTATE_COMPLETE
Loop
MyStr = ie.Document.body.innerText
Set RegMatch = RegEx.Execute(MyStr)
'If a match to our RegExp searchstring is found then launch this page
If RegMatch.Count > 0 Then
ie.Navigate RegMatch(0)
Do Until ie.ReadyState = READYSTATE_COMPLETE
Loop
'****************************************
'EDITS
'****************************************
Set iedoc = ie.Document
Dim extractedHTML As String
Dim iStart, iEnd As Integer
extractedHTML = iedoc.getElementById("search").innerHTML
iStart = InStr(1, extractedHTML, "href=", vbTextCompare) + Len("href=") + 1
iEnd = InStr(iStart, extractedHTML, Chr(34), vbTextCompare)
'extract the text
extractedHTML = Mid(extractedHTML, iStart, iEnd - iStart)
'go to the URL
ie.Navigate extractedHTML
Set iedoc1 = ie.Document
'MsgBox iedoc1
On Error GoTo ErrHandler:
openedpage = iedoc1.getElementById("name").innerText
detailname = "NAME:" & vbCrLf & FirstName + " " + LastName
MsgBox ""
openedpage = ""
openedpage = iedoc1.getElementById("headline").innerText
'On Error GoTo ErrHandler:
MsgBox "LOCATION DETAILS:" & vbCrLf & openedpage
locationdetails = openedpage + vbCrLf
MsgBox locationdetails
openedpage = iedoc1.getElementById("profile-experience").innerText
profileexperience = openedpage + vbCrLf
openedpage = iedoc1.getElementById("profile-contact").innerText
profilecontact = openedpage + vbCrLf
openedpage = iedoc1.getElementById("overview").innerText
overview = openedpage + vbCrLf
openedpage = iedoc1.getElementById("skills-list").innerText
skillslist = openedpage + vbCrLf
openedpage = iedoc1.getElementById("profile-languages").innerText
profilelanguages = openedpage + vbCrLf
openedpage = iedoc1.getElementById("profile-education").innerText
profileeducation = openedpage + vbCrLf
openedpage = iedoc1.getElementById("pubgroups").innerText
publicgroups = openedpage + vbCrLf
returnstatement = locationdetails + profileexperience + profilecontact + overview + skillslist + profilelanguages + profileeducation + publicgroups
MsgBox returnstatement
ErrHandler:
openedpage = "NULL"
Resume Next
'****************************************
'End EDITS
'****************************************
Else
MsgBox "No linkedin profile found"
End If
Set RegEx = Nothing
Set ie = Nothing
End Sub
最奇怪的是,当我对第59行进行注释时,我的位置详细信息将返回为NULL。但是,如果我有该消息框,则会正确返回位置详细信息。我尝试使用变量而不是消息框,但除了我使用消息框之外,所有场景的位置详细信息都变为NULL。
openedpage = iedoc1.getElementById("name").innerText
detailname = "NAME:" & vbCrLf & FirstName + " " + LastName
**MsgBox ""** (If i comment it out, location details becomes NULL. If it is uncommented, location details value is correct.
openedpage = ""
openedpage = iedoc1.getElementById("headline").innerText
'On Error GoTo ErrHandler:
**MsgBox "LOCATION DETAILS:" & vbCrLf & openedpage**
locationdetails = openedpage + vbCrLf
MsgBox locationdetails
答案 0 :(得分:0)
我认为你需要一些额外的时间来加载所有(或一些额外的)数据。如果你有MsgBox,你会在找到并关闭MsgBox之前无意中给你一个进程。
如果您使用其他类型的“等待”点(例如Application.Wait
或Do...Loop
)而不是MsgBox,该怎么办?请告诉我们结果。
答案 1 :(得分:0)
Internet Explorer需要一些时间来加载和呈现页面。添加一行
Do While ie.Busy : WScript.Sleep 100 : Loop
在指令ie.Navigate extractedHTML
之后。加载第一页时你已经做了类似的事情:
ie.Navigate "http://www.google.com/search?hl=en&q=" & FirstName _
& "+" & LastName & "+linkedin&meta="
Do Until ie.ReadyState = READYSTATE_COMPLETE
Loop
虽然你也应该在那里添加睡眠指令。