Я недавно преподавал VBA с целью создать собственный пользовательский «искатель сайта», чтобы создать сайт-сайт/карту сайта.Отладка VBA отлично работает, но ошибка при запуске
Таким образом, мой код (когда он будет завершен) просмотрит и нажмет на все ссылки на веб-сайте.
Я могу получить все ссылки с домашней страницы без проблем и разместить их в Excel. Однако, когда я пытаюсь получить ссылки с других страниц, я получаю ошибки во время выполнения, такие как:
«Ошибка выполнения„70“: Доступ запрещен»
или
«Время воспроизведения Ошибка «91»: переменная объекта или блок ширины не установлены «
ОДНАКО, когда я иду в режиме отладки и вступаю в код, я не сталкиваюсь ни с одним из этих элементов сферические зеркала. Это довольно странно.
Одно говоря, я получить доступ к веб-сайту системы с множеством настроек безопасности, включая ограничения на Интернет, который является, почему у меня есть строка: CreateObject("new:{D5E8041D-920F-45e9-B8FB-B1DEB82C6E5E}")
вместо Create(internetExplorer)
и т.д ...
Он застревает на For Each tabLinks In ieLink2
в моем коде ниже. Я удалил ссылки, но надеюсь, что все могут получить эту идею. (обратите внимание, что я новичок в StackOverflow, поэтому я не уверен, правильно ли опубликовать весь код, как это, или если я должен опубликовать только часть моего кода).
Public Sub CreateSiteIndex_Click()
'Variables
Dim objShell As Object
Dim objShellWind As Object
Dim ie As Object
Dim ieFol As Object
Dim ieData As Object
Dim ieLink As Object
Dim tabData As Object
Dim ieLink2 As Object
Dim listLinks As Object
Dim tabLinks As Object
'Variable for duplicate link check
Dim dupCheck As Boolean
'Variables to check for site links
Dim siteCheck As Boolean
Dim siteAddress As String
Dim siteAddress2 As String
'Variables to check for unwanted links
Dim noCheck As Boolean
Dim noCheckLink As String
Dim noCheckLink2 As String
'Track Shell Windows
Set objShell = CreateObject("Shell.Application")
Set objShellWind = objShell.Windows
'Navigating to webpage
Set ie = CreateObject("new:{D5E8041D-920F-45e9-B8FB-B1DEB82C6E5E}")
ie.Visible = True
ie.Navigate2 "mywebsiteURLisHere(just blocked it out for security purposes"
Set ieFol = CreateObject("new:{D5E8041D-920F-45e9-B8FB-B1DEB82C6E5E}")
'Wait until page is loaded before checking links
Do Until ie.ReadyState >= 4
DoEvents
Loop
Application.Wait Now + TimeSerial(0, 0, 5)
'Get all links from webpage and store as a list/array
Set ieData = ie.Document
'tabData(0) = 0
Set ieLink = ieData.getElementsByTagName("a")
'These are specifications/filters for which links to allow in the Excel sheet
siteAddress = "specific filter here"
siteAddress2 = "another one..."
noCheckLink = "another filter"
'For Loop - goes through each link on page
i = 1
j = 1
k = 1
Cells.Clear
For Each listLinks In ieLink
'Checks to make sure no duplicates before adding link to Excel sheet
'dupCheck becomes TRUE if duplicate
Range("C1").Select
Do Until IsEmpty(ActiveCell)
If (ActiveCell = listLinks.href) Then
dupCheck = True
End If
ActiveCell.Offset(1, 0).Select
ActiveCell.WrapText = True
Loop
'If not a duplicate
If (dupCheck = False) Then
'Check that link is a Horizons link
sC = InStr(listLinks, siteAddress)
sC2 = InStr(listLinks, siteAddress2)
'Check that link is not HOME or TOP OF PAGE
nC = InStr(listLinks, noCheckLink)
If sC > 0 Or sC2 > 0 Then
siteCheck = True
End If
If nC > 0 Then
noCheck = True
Else: noCheck = False
End If
'If link is a Horizons link AND it not linking back to homepage
If (siteCheck = True) Then
If (noCheck = False) Then
'Add links to Excel sheet
ActiveSheet.Cells(i, 3) = listLinks.href
ActiveSheet.Cells(i, 2) = listLinks.innerText
'Convert URL to hyperlink
For Each Cell In Selection
ActiveSheet.Hyperlinks.Add Cells(i, 3), Cell.Value
Next
If ieFol Is Nothing Then Set ieFol = CreateObject("new:{D5E8041D-920F-45e9-B8FB-B1DEB82C6E5E}")
'Follow hyperlink
'ActiveSheet.Cells(i, 3).Hyperlinks(1).Follow
ieFol.Navigate2 ActiveSheet.Cells(i, 3).Value
While ieFol.Busy
'wait for page to load
Wend
Set tabData = ieFol.Document
Set ieLink2 = tabData.getElementsByTagName("a")
For Each tabLinks In ieLink2
If ieFol Is Nothing Then Set ieFol = CreateObject("new:{D5E8041D-920F-45e9-B8FB-B1DEB82C6E5E}")
If tabData Is Nothing Then Set tabData = ieFol.Document
If ieLink2 Is Nothing Then Set ieLink2 = tabData.getElementsByTagName("a")
ActiveSheet.Cells(k, 7) = tabLinks.href
ActiveSheet.Cells(k, 6) = tabLinks.innerText
If ieFol Is Nothing Then Set ieFol = CreateObject("new:{D5E8041D-920F-45e9-B8FB-B1DEB82C6E5E}")
If tabData Is Nothing Then Set tabData = ieFol.Document
If ieLink2 Is Nothing Then Set ieLink2 = tabData.getElementsByTagName("a")
'Check for broken link
If InStr(tabData.Body.innerText, "Page Not Found") > 0 Then
'The link is not valid, flag the cell
ActiveSheet.Cells(i, 3).Interior.Color = vbRed
End If
'ie.Quit
k = k + 1
Next tabLinks
'Next
'Skip link if it links back to homepage
ElseIf (noCheck = True) Then
i = i - 1
End If
siteCheck = False
'If link goes to external site, put it in a different column
ElseIf (siteCheck = False) Then
ActiveSheet.Cells(j, 5) = listLinks.href
ActiveSheet.Cells(j, 4) = listLinks.innerText
j = j + 1
i = i - 1
End If
'If it is a duplicate, skip that link
Else:
dupCheck = False
i = i - 1
End If
i = i + 1
'On to the next!
Next listLinks
'Close the window when done
ie.Quit
End Sub
Другое примечание: оно проходит через вышеупомянутый цикл, но не всегда застревает в той же точке. Иногда он застрянет на второй итерации, иногда на четвертой. Но никогда не при отладке. – Jessica
Если у вас есть такие ошибки при работе с Интернетом, это всегда почти всегда из-за подключения к Интернету, которое не может загрузить полный контент веб-страницы в ожидаемое время, которое вы ему даете. Например, я заметил, что после навигации по ссылке вы 1) дождитесь, когда статус IE будет освобожден из Busy; 2) подождите 5 секунд, начиная с этого момента. Я боюсь, проблема в том, что этого времени недостаточно для полной загрузки страницы, поэтому после этого возникают ошибки. –
P.s. это причина, по которой в режиме Debug всегда работает: в режиме отладки вы контролируете скорость, а скорость человека намного ниже, чем у соединения; с другой стороны, скорость во время работы намного быстрее, чем у соединения. Поскольку проблема может быть немного в любом месте, я предлагаю вам сделать это, чтобы увеличить время ожидания и убедиться, что каждый раз, когда вы вызываете страницу load_ (т.е. Navigate), сразу после того, как вы ставите официанта времени на ожидание 5-10 секунд в зависимости от вашего компьютера и скорости сети. –