Консультация № 178295
09.05.2010, 11:16
0.00 руб.
0 15 1
Уважаемые эксперты подскажите, открыв Интернет Эксплоер из файла, можно ли при помощи ВБА и как организовать поиск слова на странице и выделить его, или курсор чтобы находился у него, открываю файл по скрипту:

Dim IE As Object
Set IE = CreateObject("InternetExplorer.Application")
IE.Navigate "D:\Рабочая папка\УПК РФ.mht" 'открывает указанный согласно адреса .... и имени ... файл
Sleep 1000 'задержка, то есть пауза выражается в миллисекундах, 1000 миллисекунд это 1 секунда
Do While IE.ReadyState <> 4 'нужно писать <> 4, потому что это код, который показывает, что ВЭБ страница полностью загружена. Так написано в документации по ReadyState
Loop
DoEvents
IE.Visible = True 'открывает, делает видимым Микрософт Интернет Эксплоер
IE.Document.Title = "УПК РФ" 'заголовок WEB страницы, указывется в самом верху страницы
apiShowWindow IE.hwnd, SW_MAXIMIZE 'сделать окно IE во весь экран, для своей работы должна быть добавлена apiShowWindow Lib
Set IE = Nothing 'установка объекта в значение Nothing требуется для освобождения памяти, которая была выделена для нового объекта

Сразу оговорюсь, жто нижеследующий вариант открытия файла:
Shell "C:\Program Files\Internet Explorer\IEXPLORE.EXE " + "D:\Рабочая папка\УПК РФ.mht", vbNormalFocus
меня не устраивает, потому, что при таком открытии в заголовке страницы появляется что угодно, можно ли заголовок страницы при таком варианте открытия файла изменить, а также можно ли фокус Normal изменить на Maximize???? У меня не получилось. Спасибо

Обсуждение

Неизвестный
10.05.2010, 17:21
общий
'вариант
'перед сохранением ВЭБ страницы можно менять и название сохраняемого файла и заголовок ВЭБ страницы
Shell "C:\Program Files\Internet Explorer\IEXPLORE.EXE " + "D:\Рабочая папка\УК РФ.mht", vbMaximizedFocus
осталось узнать как найти слово на странице, подскажете???
Неизвестный
11.05.2010, 11:24
общий
Ципихович Эндрю:
как выделить- не знаю, для поиска могу предложить только воспользоваться внутренней функцией поиска IE, получилось вот что:
Код:
   Dim ieApp As InternetExplorer
Dim ieURL As String

ieURL = "D:\Рабочая папка\УПК РФ.mht"
Set ieApp = New InternetExplorer
ieApp.FullScreen = True ' во весь экран
ieApp.AddressBar = True ' во весь экран не показывает строку адреса - это чтобы ее вывести
ieApp.Navigate ieURL ' перейти по адресу
While ieApp.ReadyState < 4 'READYSTATE_COMPLETE - страница загружена
DoEvents
Wend
ieApp.Visible = True ' показать окно браузера
ieApp.ExecWB 32, 1 '32(OLECMDID_FIND) - внутренняя функция IE "поиск", 1(OLECMDEXECOPT_PROMPTUSER) - показать диалог с пользователем
Set ieApp = Nothing
Неизвестный
11.05.2010, 19:38
общий
Измалков Эдуард Леонидович:
Dim ieApp As InternetExplorer 'на этой строке получаю ошибку user-defined type not defined
Но я открыл файл по своему скрипту указанному в вопросе
На этой строке
IE.ExecWB 32, 1 '32(OLECMDID_FIND) - внутренняя функция IE "поиск", 1(OLECMDEXECOPT_PROMPTUSER) - показать диалог с пользователем
выделяет, не пропускает, также сообщение об ошибке:
Рун тайм эррор Метод ExecWB 32 of object IWEBBrowser2 falied
Но Виндус поиск открывает с окошком для поиска и как я понял в окошко Папка попадает «"D:\Рабочая папка\УПК РФ.mht"» и конечно же такой папки нет. А нужно папка "D:\Рабочая папка", файл УПК РФ.mht.
Неизвестный
11.05.2010, 19:52
общий
Ципихович Эндрю:
в редакторе кода vba зайдите tools- references и поставьте галочку напротив "Microsoft Internet Controls"
Неизвестный
11.05.2010, 20:36
общий
Измалков Эдуард Леонидович:
Всё тоже саме за исключением того, что файл запускает строго по Вашему скрипту
Ошибка та же только окно поиска чуть другое внешне хотя ранее пробовал на работе а сейчас дома видимо отличий нет но ошибка точно есть
Еще посмотрел по сети, нашёл вроде то что мне нужно, но до завтра проверить не смогу, возможно это более лучший способ или тоже не плохой способ???? Возможно я его не пойму!!!
Посмотрите, пожалуйста, если то что нужно, может надо подкорректировать, тогда оформляйте как ответ.

Sub TestHL()
HighLight "Document", "http://www.sql.ru/forum/actualthread.aspx?tid=551484"
End Sub
Function HighLight(strFind As String, strUrl As String)
Dim ie As Object
Dim re As Object
Dim sHTML As String
Dim strReplace As String

Set ie = CreateObject("InternetExplorer.Application")
With ie
.Navigate strUrl
While .busy
Sleep 200
DoEvents
Wend
sHTML = .Document.body.innerHTML
strReplace = "<span style=" & """" & "background-color:#AA0000;" & """" & ">" & strFind & "</span>"
Set re = CreateObject("VBScript.RegExp")
With re
.Pattern = strFind
.Global = True
.IgnoreCase = True
sHTML = .Replace(sHTML, strReplace)
End With
.Document.body.innerHTML = sHTML
.Visible = True
End With

Set re = Nothing
Set ie = Nothing

End Function


Неизвестный
11.05.2010, 21:58
общий
Ципихович Эндрю:
Это то что Вам и нужно, мой способ только выводил окно поиска для ввода нужного значения, а тут необходимый текст выделяется другим фоновым цветом. Давайте немного поправлю и добавлю комментарии
Код:
Sub TestHL()
Const чтоИскать As String = "что-то важное"
Const гдеИскать As String = "D:\Рабочая папка\УПК РФ.mht"
HighLight чтоИскать, гдеИскать 'вызывается функция для поиска и выделения искомого текста
End Sub

Function HighLight(strFind As String, strUrl As String) ' функция для выделения искомого текста в Html-страницах
Dim ie As Object
Dim re As Object
Dim sHTML As String
Dim strReplace As String

Set ie = CreateObject("InternetExplorer.Application") ' создаем объект InternetExplorer
With ie
.Navigate strUrl ' открываем нужный файл
While .Busy ' ждем, когда он откроется.
Sleep 200 '
DoEvents '
Wend
sHTML = .Document.body.innerHTML ' сохраняем в отдельную переменную html-код страницы
strReplace = "<span style=" & """" & "background-color:#AA0000;" & """" & ">" & strFind & "</span>" ' на эту строку нужно заменить то, что найдем. здесь background-color:#AA0000 задает цвет фона
Set re = CreateObject("VBScript.RegExp") ' создаем объект VBScript для работы с регулярными выражениями
With re
.Pattern = strFind ' св-во Pattern содержит регулярное выражение, которое нужно найти.
.Global = True ' True - ищет все соответсвия, False - только первое
.IgnoreCase = True ' не учитывать регистр букв
sHTML = .Replace(sHTML, strReplace) ' заменяем в html-коде все найдены слова на них же, но с фоновым цветом, и сохраняем результат
End With
.Document.body.innerHTML = sHTML ' заменяем html-код страницы на поправленный
.Visible = True ' выводим на экран окно с IE
End With

Set re = Nothing ' освобождаем память
Set ie = Nothing ' освобождаем память

End Function


Коды цветов для выделения можно посмотреть тут. Если всё нормально, то могу оформить как ответ.
Неизвестный
12.05.2010, 06:11
общий
Измалков Эдуард Леонидович:
Это и есть правильный ответ
осталось уточнить, то что нужно нашли, подкрасили а передвигаться IE к тому месту где нашли IE может и как в этой строке
.Global = False 'True - ищет все соответсвия, False - только первое
указать что нужно последнее найденное?
Потом в скриптах смотрю где пишут так:
Sleep 1000 'задержка, то есть пауза выражается в миллисекундах, 1000 миллисекунд это 1 секунда
Do While IE.ReadyState <> 4 'нужно писать <> 4, потому что это код, который показывает, что ВЭБ страница полностью загружена. Так написано в документации по ReadyState
Loop
DoEvents
Где так:
While .Busy
Sleep 200
DoEvents
Wend
Как лучше? и что такое .Busy? и вот Sleep пишут внутри While и снаружи, как лучше и правильней???
Неизвестный
12.05.2010, 11:18
общий
Ципихович Эндрю:
С помощью регулярных выражений не смог найти последнее слово. Могу предложить немного другой вариант с использованием только функций VBA.
Код:
Sub TestHL()
Const чтоИскать As String = "что-то важное"
Const гдеИскать As String = "D:\Рабочая папка\УПК РФ.mht"
HighLight чтоИскать, гдеИскать 'вызывается функция для поиска и выделения искомого текста
End Sub

Function HighLight(strFind As String, strUrl As String) ' функция для выделения искомого текста в Html-страницах
Dim ie As Object
Dim re As Object
Dim sHTML As String
Dim strReplace As String
dim z As Long, i As Long

Set ie = CreateObject("InternetExplorer.Application") ' создаем объект InternetExplorer
With ie
.Navigate strUrl ' открываем нужный файл
While .ReadyState < 4 ' ждем, когда он откроется.
Sleep 200 '
DoEvents '
Wend
sHTML = .Document.body.innerHTML ' сохраняем в отдельную переменную html-код страницы
strReplace = "<span style=" & """" & "background-color:#AA0000;" & """" & ">" & strFind & "</span>" ' на эту строку нужно заменить то, что найдем. здесь background-color:#AA0000 задает цвет фона
z = 0
Do
i = z
z = InStr(i + 1, sHTML, strFind, vbTextCompare) ' находим последнее вхождение искомого слова в коде страницы
Loop While z > 0
If i > 0 Then sHTML = Left(sHTML, i - 1) & Replace(sHTML, strFind, strReplace, i, -1, vbTextCompare) ' заменяем его

.Document.body.innerHTML = sHTML ' заменяем html-код страницы на поправленный
.Visible = True ' выводим на экран окно с IE
End With

Set re = Nothing ' освобождаем память
Set ie = Nothing ' освобождаем память

End Function


Насчет передвижения к какому-либо месту в IE ничего пока не нашел. .Busy показывает, занят ли в данный момент браузер чем-нибудь или нет, не зависимо от того, чем он занимается (т.е. после загрузки самой страницы могут начать подгружаться и дополнительные флеш-элементы, реклама, в этом случае IE будет выставлять Busy = True). Для целей этого задания думаю лучше будет использовать .ReadyState.

Где писать Sleep и DoEvents решайте сами, как считаете более правильным для себя. Если Sleep стоит до цикла, то сначала выжидается указанное время, потом идет проверка занятости браузера, и если он занят - то цикл до его освобождения. Sleep Внутри цикла - первая проверка идет без ожидания, зато потом, прежде чем в очередной раз проверить состояние браузера, программа подождет указанное время.
Неизвестный
12.05.2010, 16:35
общий
Измалков Эдуард Леонидович:
Завтра выложу сам файл там нарисовалась проблема и есть одна мысль
Неизвестный
13.05.2010, 17:52
общий
Измалков Эдуард Леонидович:
Вот я протестировал Ваш код от 12 мая 2010 г. 11:18
Если Вы загрузите с форума файл УПК РФ.mht
Ссылка для скачивания
https://rfpro.ru/upload/2363
без пароля
без описания
строку сделайте Const чтоИскать As String = "Статья 77"
Когда протестируете код, поймёте, что файл откроется, и те ссылки, которые будут вначале документа будут «мёртвыми» то есть, щёлкнув по ней, появится сообщение невозможно открыть страницу. Затем щелкаем обратно на IE и всё становится на место, ссылки работают. То есть такое открытие файла не приемлимо.
Затем протестировал код от 11.05.2010, 21:58 эффект тот же, удивился, не буду утверждать, но вроде за день до этого ссылки в открытой странице открывались всегда.
Это проблемы, посмотрите можно ли уладить, чтобы ссылки открывались всегда и без сбоев?, а мысль в том, что Вы говорите:
Насчет передвижения к какому-либо месту в IE ничего пока не нашел
Может можно найдя первое вхождение, выделив его щёлкнуть ссылку??
Искать я всегда предполагаю, что-то вроде Статья 77 только цифры разные и их всегда на странице 2, в оглавлении и тексте.

Неизвестный
14.05.2010, 08:29
общий
Ципихович Эндрю:
Т.е. Вам нужно перейти по ссылке, которая содержит в своем названии определенный текст. Тогда предлагаю воспользоваться следующим:
Код:
Sub ИспользованиеЭксплорера2()
Dim IE As Object
Dim iLinks As Variant
Set IE = CreateObject("InternetExplorer.Application")

IE.navigate "d:\work\разработка\vba\iexplorer\УПК РФ.mht" 'открывает указанный согласно адреса .... и имени ... файл
While IE.ReadyState < READYSTATE_COMPLETE 'это код, который показывает, что ВЭБ страница полностью загружена. Так написано в документации по ReadyState
DoEvents
Wend
IE.TheaterMode = True ' Во весь экран (браузер раскрывается во весь экран, как при FullScreen) а панели инструментов делаются всплывающими, т.е. автоматически прячутся за краями экрана и появляются оттуда при наведении мыши
For Each iLinks In IE.Document.links ' просмотр всех внутренних ссылок в документе
If InStr(1, iLinks.innerText, "Статья 77", vbTextCompare) > 0 Then ' если в тексте ссылки содержится искомый текст
iLinks.click ' перейти по ссылке
Exit For
End If
Next iLinks
IE.Visible = True 'открывает, делает видимым Микрософт Интернет Эксплоер
'apiShowWindow IE.hwnd, SW_MAXIMIZE 'сделать окно IE во весь экран, для своей работы должна быть добавлена apiShowWindow Lib
Set IE = Nothing 'установка объекта в значение Nothing требуется для освобождения памяти, которая была выделена для нового объекта
End Sub
Неизвестный
14.05.2010, 09:10
общий
Измалков Эдуард Леонидович:
Спасибо, оформляйте ответом
Неизвестный
14.05.2010, 09:45
общий
14.05.2010, 23:59
это ответ
Здравствуйте, Ципихович Эндрю.
Как выяснилось при уточнении вопроса в мини-форуме задача состоит в том, чтобы на html-странице найти ссылку с определенным текстом и перейти по ней. Это можно сделать следующим способом:

Код:
Sub gotoLink()
Dim IE As Object
Dim iLinks As Variant
Const fURL As String = "D:\Рабочая папка\УПК РФ.mht" ' адрес файла, который необходимо открыть
Const fLinkText as String = "Статья 77" ' текст ссылки, по которой нужно перейти
Set IE = CreateObject("InternetExplorer.Application") ' создаем новый экземпляр Internet Explorer

IE.navigate fURL 'открывает указанный согласно адреса .... и имени ... файл
While IE.ReadyState < READYSTATE_COMPLETE 'это код, который показывает, что ВЭБ страница полностью загружена
DoEvents
Wend
IE.TheaterMode = True ' Во весь экран (браузер раскрывается во весь экран, как при FullScreen) а панели инструментов делаются всплывающими, т.е. автоматически прячутся за краями экрана и появляются оттуда при наведении мыши
For Each iLinks In IE.Document.links ' просмотр всех внутренних ссылок в документе
If InStr(1, iLinks.innerText, fLinkText, vbTextCompare) > 0 Then ' если в тексте ссылки содержится искомый текст
iLinks.click ' перейти по ссылке
Exit For
End If
Next iLinks
IE.Document.Title = "УПК РФ" 'заголовок WEB страницы, указывется в самом верху страницы
IE.Visible = True 'открывает, делает видимым Internet Explorer
Set IE = Nothing 'установка объекта в значение Nothing требуется для освобождения памяти, которая была выделена для нового объекта
End Sub
Неизвестный
14.05.2010, 12:43
общий
Измалков Эдуард Леонидович:
В ответе DoEvent заменить на DoEvents и всё хорошо, оценить не успел, ушёл в рассылку
давно
Посетитель
7438
7205
15.05.2010, 00:01
общий
Измалков Эдуард Леонидович:
Подправил
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа