2013-03-15 82 views
1

我使用excel VBA打开google结果的第一个返回页面。从第一页开始,我根据元素ID操作数据。在做这个过程中,我遇到了一个非常奇怪的行为。Excel VBA打开第一个返回的google页面 - 怪异行为

让我简要介绍一下我正在尝试做什么。

我将在用户表单中输入名字和姓氏。对于给定的名字和姓氏,我将搜索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

我说你的宏需要一些额外的时间来加载所有(或一些额外的)数据。如果你有MsgBox,你会在无意中给你的程序一些时间,然后找到并关闭你MsgBox。

如果您将其他类型的“等待”点(如Application.WaitDo...Loop)而不是MsgBox放在什么位置怎么办?请让我们知道结果。

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 

虽然你应该增加睡眠指令那里。