2015-03-09 3 views
1

Я недавно преподавал 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 
+0

Другое примечание: оно проходит через вышеупомянутый цикл, но не всегда застревает в той же точке. Иногда он застрянет на второй итерации, иногда на четвертой. Но никогда не при отладке. – Jessica

+0

Если у вас есть такие ошибки при работе с Интернетом, это всегда почти всегда из-за подключения к Интернету, которое не может загрузить полный контент веб-страницы в ожидаемое время, которое вы ему даете. Например, я заметил, что после навигации по ссылке вы 1) дождитесь, когда статус IE будет освобожден из Busy; 2) подождите 5 секунд, начиная с этого момента. Я боюсь, проблема в том, что этого времени недостаточно для полной загрузки страницы, поэтому после этого возникают ошибки. –

+0

P.s. это причина, по которой в режиме Debug всегда работает: в режиме отладки вы контролируете скорость, а скорость человека намного ниже, чем у соединения; с другой стороны, скорость во время работы намного быстрее, чем у соединения. Поскольку проблема может быть немного в любом месте, я предлагаю вам сделать это, чтобы увеличить время ожидания и убедиться, что каждый раз, когда вы вызываете страницу load_ (т.е. Navigate), сразу после того, как вы ставите официанта времени на ожидание 5-10 секунд в зависимости от вашего компьютера и скорости сети. –

ответ

0

Просто для тех, кто ищет другое решение. Сегодня я столкнулся с подобной проблемой. Затем я использовал «DoEvents» перед строками, выделенными с ошибками, и он работает.

Смежные вопросы