Добрый день, у вас, скорей всего, после нажатия кнопки происходит обновление/перерисовка формы. IE при загрузке считывает структуру документа и изменения на странице - не отслеживает. Поэтому, при изменении формы нужно повторно запустить инициализацию структуры документа. [vba]
Код
s = "http://www.crowdrise.com/skollsechallenge" ' generate link oIE.Navigate (s) 'load webpage Do While oIE.busy Or (oIE.ReadyState <> 4): DoEvents: Loop 'wait while loading Set maPageHtml = oIE.Document' Вот тут происходит инициализация Set SelectList = maPageHtml.getElementsbyclassname("more seeMoreTeams") 'select description area SelectList(0).Click 'делаем щелчок, при этом структура меняется Do While i < 100000 : i = i + 1 : DoEvents : Loop : Next i 'ждем пока обновится
Set maPageHtml = oIE.Document 'ПОВТОРНОЕ СЧИТЫВАНИЕ - читает уже обновленную форму
[/vba]
Добрый день, у вас, скорей всего, после нажатия кнопки происходит обновление/перерисовка формы. IE при загрузке считывает структуру документа и изменения на странице - не отслеживает. Поэтому, при изменении формы нужно повторно запустить инициализацию структуры документа. [vba]
Код
s = "http://www.crowdrise.com/skollsechallenge" ' generate link oIE.Navigate (s) 'load webpage Do While oIE.busy Or (oIE.ReadyState <> 4): DoEvents: Loop 'wait while loading Set maPageHtml = oIE.Document' Вот тут происходит инициализация Set SelectList = maPageHtml.getElementsbyclassname("more seeMoreTeams") 'select description area SelectList(0).Click 'делаем щелчок, при этом структура меняется Do While i < 100000 : i = i + 1 : DoEvents : Loop : Next i 'ждем пока обновится
Set maPageHtml = oIE.Document 'ПОВТОРНОЕ СЧИТЫВАНИЕ - читает уже обновленную форму
у вас, скорей всего, после нажатия кнопки происходит обновление/перерисовка формы. IE при загрузке считывает структуру документа и изменения на странице - не отслеживает. Поэтому, при изменении формы нужно повторно запустить инициализацию структуры документа
Добрый день! Спасибо. Это похоже то с чем я столкнулся бы чуть позже. Для начала я не могу научить его нажимать кнопку (ссылка javascript)
Но у меня после открытия начальной страницы, VBA ее теряет и на любое последующее действие выдает: automation error The object invoked has disconnected from its clients
Может это быть из-за HTTPS ? Но страница открывается верно (аутентификация по учетной записи домена)
у вас, скорей всего, после нажатия кнопки происходит обновление/перерисовка формы. IE при загрузке считывает структуру документа и изменения на странице - не отслеживает. Поэтому, при изменении формы нужно повторно запустить инициализацию структуры документа
Добрый день! Спасибо. Это похоже то с чем я столкнулся бы чуть позже. Для начала я не могу научить его нажимать кнопку (ссылка javascript)
Но у меня после открытия начальной страницы, VBA ее теряет и на любое последующее действие выдает: automation error The object invoked has disconnected from its clients
Может это быть из-за HTTPS ? Но страница открывается верно (аутентификация по учетной записи домена)VIA
Сообщение отредактировал VIA - Четверг, 20.02.2014, 16:01
в коде что я привел, как раз пример нажатия кнопки с javaScript. Точно не знаю будет ли работать клик на ссылке, но попробуйте так: [vba]
Код
Public Sub x() Application.ScreenUpdating = False Application.Calculation = xlCalculationManual 'Set variables Dim ar Dim oIE As Object, sHTML As String Dim tmp, i As Long Set oIE = CreateObject("InternetExplorer.Application") 'start IE oIE.Visible = 1 'IE window visible - 0-hide 1-show Worksheets("Лист2").Cells.ClearContents 'очищаем лист s = "file:\\D:\IAM.htm" ' тут ваша ссылка на интранет oIE.Navigate (s) 'грузим Do While oIE.busy Or (oIE.ReadyState <> 4): DoEvents: Loop 'ждем пока прогрузится Set maPageHtml = oIE.Document 'считываем структуру документа Set SelectList = maPageHtml.getElementsbyclassname("Tab2Lnk") 'выбираем нужные ссылки по которым надо щелкать (с нужным скриптом) SelectList(0).Click 'щелкаем (теоретически должен запуститься скрипт); индекс 0 - делегирования, 1-атрибуты и т.д i = 0 : Do While i < 100000 : i = i + 1 : DoEvents : Loop : Next i 'пауза для обновления страницы Set maPageHtml = oIE.Document 'считываем обновленный документ Set Htable = maPageHtml.getElementsbyTagname("tbody") 'выбираем все таблицы For i = 0 To Htable.Length - 1 'циклом выбираем первую таблицу в которой кол-во строк больше 3 If Htable(i).Rows.Length > 3 Then Exit For Next i last = Worksheets("Лист2").Range("A65536").End(xlUp).Row 'последняя строка на листе Set maTable = Htable(i) ' выбираем найденную в цикле таблицу For i = 1 To maTable.Rows.Length ' цикл по строкам For j = 1 To maTable.Rows(i - 1).Cells.Length ' цикл по столбцам Worksheets("Лист2").Cells(s, j) = maTable.Rows(i - 1).Cells(j - 1).innertext 'значение ячейки Next j Next i Worksheets("Лист2").Select Set maPageHtml = Nothing 'clear variables oIE.Quit 'exit from IE 'the end Set oIE = Nothing Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic MsgBox "Finish" End Sub
[/vba]
в коде что я привел, как раз пример нажатия кнопки с javaScript. Точно не знаю будет ли работать клик на ссылке, но попробуйте так: [vba]
Код
Public Sub x() Application.ScreenUpdating = False Application.Calculation = xlCalculationManual 'Set variables Dim ar Dim oIE As Object, sHTML As String Dim tmp, i As Long Set oIE = CreateObject("InternetExplorer.Application") 'start IE oIE.Visible = 1 'IE window visible - 0-hide 1-show Worksheets("Лист2").Cells.ClearContents 'очищаем лист s = "file:\\D:\IAM.htm" ' тут ваша ссылка на интранет oIE.Navigate (s) 'грузим Do While oIE.busy Or (oIE.ReadyState <> 4): DoEvents: Loop 'ждем пока прогрузится Set maPageHtml = oIE.Document 'считываем структуру документа Set SelectList = maPageHtml.getElementsbyclassname("Tab2Lnk") 'выбираем нужные ссылки по которым надо щелкать (с нужным скриптом) SelectList(0).Click 'щелкаем (теоретически должен запуститься скрипт); индекс 0 - делегирования, 1-атрибуты и т.д i = 0 : Do While i < 100000 : i = i + 1 : DoEvents : Loop : Next i 'пауза для обновления страницы Set maPageHtml = oIE.Document 'считываем обновленный документ Set Htable = maPageHtml.getElementsbyTagname("tbody") 'выбираем все таблицы For i = 0 To Htable.Length - 1 'циклом выбираем первую таблицу в которой кол-во строк больше 3 If Htable(i).Rows.Length > 3 Then Exit For Next i last = Worksheets("Лист2").Range("A65536").End(xlUp).Row 'последняя строка на листе Set maTable = Htable(i) ' выбираем найденную в цикле таблицу For i = 1 To maTable.Rows.Length ' цикл по строкам For j = 1 To maTable.Rows(i - 1).Cells.Length ' цикл по столбцам Worksheets("Лист2").Cells(s, j) = maTable.Rows(i - 1).Cells(j - 1).innertext 'значение ячейки Next j Next i Worksheets("Лист2").Select Set maPageHtml = Nothing 'clear variables oIE.Quit 'exit from IE 'the end Set oIE = Nothing Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic MsgBox "Finish" End Sub
Спасибо огромное - это то что нужно! Но мне пока не удается это проверить Не могу понять причину потери контроля над IE. Попробую пояснить:
IE открытый вручную и открытый через VBA - CreateObject("InternetExplorer.Application"), ведут себя по разному 1. В открытом через VBA после входа на любую страницу https://intranet, переход на другой сайт вызывает открытие нового окна!!! 2. В открытом вручную никаких странностей все открывается в одном окне.
И думаю именно поэтому VBA выдает ошибку. Опытный пример: [vba]
Код
oIE.Navigate "about:blank" Do While oIE.busy Or (oIE.ReadyState <> 4): DoEvents: Loop ' открылсь about:blank oIE.Navigate "https://google.ru" Do While oIE.busy Or (oIE.ReadyState <> 4): DoEvents: Loop 'открылся залогиненый https google oIE.Navigate "about:blank" Do While oIE.busy Or (oIE.ReadyState <> 4): DoEvents: Loop 'снова about:blank oIE.Navigate "https://iam.intranet/" Do While oIE.busy Or (oIE.ReadyState <> 4): DoEvents: Loop 'открылся сайт intranet oIE.Navigate "about:blank" Do While oIE.busy Or (oIE.ReadyState <> 4): DoEvents: Loop 'Ошибка Automation error The interface is unknown.
[/vba]
В чем волшебство? Может в том, что выход в инет через proxy? Куда копать?
Спасибо огромное - это то что нужно! Но мне пока не удается это проверить Не могу понять причину потери контроля над IE. Попробую пояснить:
IE открытый вручную и открытый через VBA - CreateObject("InternetExplorer.Application"), ведут себя по разному 1. В открытом через VBA после входа на любую страницу https://intranet, переход на другой сайт вызывает открытие нового окна!!! 2. В открытом вручную никаких странностей все открывается в одном окне.
И думаю именно поэтому VBA выдает ошибку. Опытный пример: [vba]
Код
oIE.Navigate "about:blank" Do While oIE.busy Or (oIE.ReadyState <> 4): DoEvents: Loop ' открылсь about:blank oIE.Navigate "https://google.ru" Do While oIE.busy Or (oIE.ReadyState <> 4): DoEvents: Loop 'открылся залогиненый https google oIE.Navigate "about:blank" Do While oIE.busy Or (oIE.ReadyState <> 4): DoEvents: Loop 'снова about:blank oIE.Navigate "https://iam.intranet/" Do While oIE.busy Or (oIE.ReadyState <> 4): DoEvents: Loop 'открылся сайт intranet oIE.Navigate "about:blank" Do While oIE.busy Or (oIE.ReadyState <> 4): DoEvents: Loop 'Ошибка Automation error The interface is unknown.
[/vba]
В чем волшебство? Может в том, что выход в инет через proxy? Куда копать?VIA
Сообщение отредактировал Serge_007 - Пятница, 21.02.2014, 22:56
Я всегда запускаю в скрытом режиме, поэтому никогда не обращал внимания на новые окна. Часто IE возвращает ReadyState = готово, раньше чем успевает прогрузиться страница (может это как то с обновлением кэша связанно - не знаю точно. Но у меня почти всегда так). Поэтому я всегда ставлю дополнительную паузу [vba]
Код
i = 0 : Do While i < 100000 : i = i + 1 : DoEvents : Loop : Next i 'пауза для обновления
[/vba] экспериментально можно попробовать увеличить задержку. другого лекарства я не нашел.
Я всегда запускаю в скрытом режиме, поэтому никогда не обращал внимания на новые окна. Часто IE возвращает ReadyState = готово, раньше чем успевает прогрузиться страница (может это как то с обновлением кэша связанно - не знаю точно. Но у меня почти всегда так). Поэтому я всегда ставлю дополнительную паузу [vba]
Код
i = 0 : Do While i < 100000 : i = i + 1 : DoEvents : Loop : Next i 'пауза для обновления
[/vba] экспериментально можно попробовать увеличить задержку. другого лекарства я не нашел.egonomist
Мы все поломаем нашей силой ума
Сообщение отредактировал Serge_007 - Пятница, 21.02.2014, 22:54
Пауза не играет роли в данном случае, переход бы осуществился, даже если страница не догрузилась.
Нашел в чем бага. В настройках безопасности IE поставил галку "включить защищенный режим для интрасети" и все заработало. Теперь буду пробовать жать на JAVAкнопки.
Пауза не играет роли в данном случае, переход бы осуществился, даже если страница не догрузилась.
Нашел в чем бага. В настройках безопасности IE поставил галку "включить защищенный режим для интрасети" и все заработало. Теперь буду пробовать жать на JAVAкнопки.VIA