Надеюсь, это не глупый вопрос. У меня есть поиск с высоким и низким для ответа, теперь это удача. Я новичок в использовании VBA для получения информации из Интернета. У меня рабочая версия, которая использует IE.doc, но она медленная, и вам приходится ждать загрузки браузеров. Я привел ниже рабочую функцию, которую я преобразовал в подпрограмму для примера. Проблема в том, что без открытия родительского окна у вас нет доступа ко всем номерам отслеживания.
Это JavaScript, который я использую для вызова родительского окна с Internet Explore. Возможно ли это сделать? Я иду в правильном направлении?
IE.document.parentWindow.execScript "handleTrackDetailShowShipments()", "JavaScript"
Я впервые использовал "С CreateObject (" msxml2.xmlhttp ")", так что, возможно, я просто задаю вопрос неправильно при поиске ответа.
Ссылки: регулярные выражения Microsoft VBScript 5.5
VBA:
Sub GetTrackingData_Html_UPS()
Dim TrackN As String
Dim x As Long, y As Long
Dim Htm As Object
Dim i As Integer
Dim theRegex As Object
Dim theString As String
Dim s() As String
Dim myColl As Collection
Dim iCtr As Long
Dim tempArray As Variant
Set myColl = New Collection
Set theRegex = CreateObject("VBScript.RegExp")
With theRegex
.MultiLine = False
.Global = True
.IgnoreCase = False
End With
Set Htm = CreateObject("htmlFile")
TrackN = "1Z7452780345800256"
With CreateObject("msxml2.xmlhttp")
.Open "GET", "http://wwwapps.ups.com/WebTracking/processRequest?HTMLVersion=" & _
"5.0&Requester=NES&AgreeToTermsAndConditions=yes&loc=en_US&tracknum=" _
& TrackN & "&WT.z_eCTAid=ct1_eml_Tracking", False
.send
Htm.body.innerHTML = .responseText
End With
'IE.document.parentWindow.execScript "handleTrackDetailShowShipments()", "JavaScript" '< I want data from the parent window
'/\ this works if i use InternetExplorer but it is so slow and hit or miss
Debug.Print Htm.getElementsByTagName("h1")(0).innerText & vbNewLine & _
Htm.getElementsByTagName("h4")(1).innerText & vbNewLine & _
Htm.getElementsByTagName("h4")(4).innerText & vbNewLine & _
"Master Tracking Number: " & Htm.getElementsByTagName("h3")(0).innerText & _
vbNewLine
theRegex.Pattern = "([0-9][A-z][0-9A-z][0-9][0-9][0-9][0-9][0-9A-z][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9])"
Set MyMatches = theRegex.Execute(Htm.body.innerHTML)
If MyMatches.Count <> 0 Then
With MyMatches
For myMatchCt = 0 To .Count - 1
For subMtCt = 0 To .Item(subMtCt).SubMatches.Count - 1
Item = (.Item(myMatchCt).SubMatches.Item(subMtCt))
Tracking = Tracking & Trim(Item) & ","
Next
Next
End With
Else
End If
s = Split(Tracking, ",")
On Error Resume Next
For i = UBound(s) - 1 To 0 Step -1
myColl.Add s(i), CStr(s(i))
Next i
On Error Resume Next
ReDim s(LBound(s) To LBound(s) + myColl.Count - 1)
For i = 1 To myColl.Count
Debug.Print i & " " & myColl(i)
Next i
Set theRegex = Nothing
Set Htm = Nothing
Set MyMatches = Nothing
End Sub
Вы можете загрузить данные со страницы и использовать регулярное выражение, чтобы найти то, что вы хотите на нем, и загрузить в переменную.
Попробуйте этот способ, используя xmlhttp. Отредактируйте URL-адрес и т.д. Если кажется, что нужно прокомментировать if/end, если сбрасывать информацию, даже если она работает. Это vbscript, но vbscript работает в vb6. Вы можете оптимизировать его, добавив его как ссылку и создав файл и явный объект xmlhttp - set file = new microsoft.xmlhttp
On Error Resume Next
Set File = WScript.CreateObject("Microsoft.XMLHTTP")
File.Open "GET", "http://www.microsoft.com/en-au/default.aspx", False
'This is IE 8 headers
File.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 1.1.4322; .NET CLR 3.5.30729; .NET CLR 3.0.30618; .NET4.0C; .NET4.0E; BCD2000; BCD2000)"
File.Send
If err.number <> 0 then
line =""
Line = Line & vbcrlf & ""
Line = Line & vbcrlf & "Error getting file"
Line = Line & vbcrlf & "=================="
Line = Line & vbcrlf & ""
Line = Line & vbcrlf & "Error " & err.number & "(0x" & hex(err.number) & ") " & err.description
Line = Line & vbcrlf & "Source " & err.source
Line = Line & vbcrlf & ""
Line = Line & vbcrlf & "HTTP Error " & File.Status & " " & File.StatusText
Line = Line & vbcrlf & File.getAllResponseHeaders
wscript.echo Line
Err.clear
wscript.quit
End If
On Error Goto 0
Set BS = CreateObject("ADODB.Stream")
BS.type = 1
BS.open
BS.Write File.ResponseBody
BS.SaveToFile "c:\users\test.txt", 2
Также посмотрите, работают ли эти другие объекты.
C:\Users>reg query hkcr /f xmlhttp
HKEY_CLASSES_ROOT\Microsoft.XMLHTTP HKEY_CLASSES_ROOT\Microsoft.XMLHTTP.1.0 HKEY_CLASSES_ROOT\Msxml2.ServerXMLHTTP HKEY_CLASSES_ROOT\Msxml2.ServerXMLHTTP.3.0 HKEY_CLASSES_ROOT\Msxml2.ServerXMLHTTP.4.0 HKEY_CLASSES_ROOT\Msxml2.ServerXMLHTTP.5.0 HKEY_CLASSES_ROOT\Msxml2.ServerXMLHTTP.6.0 HKEY_CLASSES_ROOT\Msxml2.XMLHTTP HKEY_CLASSES_ROOT\Msxml2.XMLHTTP.3.0 HKEY_CLASSES_ROOT\Msxml2.XMLHTTP.4.0 HKEY_CLASSES_ROOT\Msxml2.XMLHTTP.5.0 HKEY_CLASSES_ROOT\Msxml2.XMLHTTP.6.0 Конец поиска: найдено 12 совпадений.