VBA + HTTP -> HTML -> DOM
От: juicy_emad  
Дата: 29.01.08 14:57
Оценка:
Доброго времени суток!
Задача такая: нужно написать на VBA программу, которая, при наличии подключения к интернет, сможет загрузить HTML-страницу по HTTP-протоколу (к примеру, http://mywebsite.org/) и получить, скажем, текстовое содержимое BODY этой странички. Я знаю, что очень легко это сделать в Delphi с использованием технологии VCL: там, кажется, есть классы IHtmlDocument и IHtmlElement и сотв. св-во IHtmlElement.innerText. Вопрос: можно ли это сделать в VBA? (Я, просто, с VBA мало знаком, так что извиняюсь, если вопрос является "баяном".)

Да, и ещё. Совершенно другой вопрос: каким образом можно использовать модуль COM-Server'а в VBA-проекте? Т.е. нужно создать объект, класс которого описан в модуле COM-Server'е и вызывать его методы. Это вообще возможно?

Просьба предоставить исходники.

Заранее спасибо.
Re: VBA + HTTP -> HTML -> DOM
От: ZAMUNDA Земля для жалоб и предложений
Дата: 29.01.08 16:26
Оценка: 10 (2)
Здравствуйте, juicy_emad, Вы писали:

_> Задача такая: нужно написать на VBA программу, которая, при наличии подключения к интернет, сможет загрузить HTML-страницу по HTTP-протоколу (к примеру, http://mywebsite.org/) и получить, скажем, текстовое содержимое BODY этой странички.

Sub test8465284()
    Dim myHTTP As Object
    
    Set myHTTP = CreateObject("MSXML2.XMLHTTP")
    
    myHTTP.Open "GET", "http://www.rsdn.ru/forum/message/2816117.1.aspx", False
    myHTTP.send Empty
    
    Debug.Print myHTTP.responseText'{Ctrl+G} нажми
    MsgBox Left$(myHTTP.responseText, 128) & "...", vbInformation, "Содержимое HTML"
End Sub



_> Да, и ещё. Совершенно другой вопрос: каким образом можно использовать модуль COM-Server'а в VBA-проекте? Т.е. нужно создать объект, класс которого описан в модуле COM-Server'е и вызывать его методы. Это вообще возможно?

Вот в моём примере, myHTTP это как раз экземпляр COM-объекта 'MSXML2.XMLHTTP', который написан мелкомягкими программерами (он в Windows установлен по-умолчанию).
Чтоб использовать COM-сервер в VBA проекте, надо чтоб его (COM-сервера) объекты IDispath имплементировали.
Наука изощряет ум; ученье вострит память.
(c) Козьма Прутков
Re[2]: VBA + HTTP -> HTML -> DOM
От: aloch Россия  
Дата: 29.01.08 18:44
Оценка: 13 (3)
Здравствуйте, ZAMUNDA, Вы писали:

> CreateObject("MSXML2.XMLHTTP")


Далеко не всякая Web-страничка является XML-файлом.

2juicy_emad: Нужно исползовать ActiveX-компонент WebBrowser (aka Internet Explorer). Интерфейс IHtmlElement найдете в библиотеке типов system32\mshtml.tlb.

ZAM>Чтоб использовать COM-сервер в VBA проекте, надо чтоб его (COM-сервера) объекты IDispath имплементировали.


Это совершенно не обязательно. Это нужно только для позднего связывания. Просто должна быть библиотека типов + типы должны быть Variant-совместимыми.

2juicy_emad: в проект нужно добавить ссылку на ActiveX-компонент. См. меню Tools\References.


Re[3]: VBA + HTTP -> HTML -> DOM
От: ZAMUNDA Земля для жалоб и предложений
Дата: 29.01.08 21:15
Оценка:
Здравствуйте, aloch, Вы писали:

>> CreateObject("MSXML2.XMLHTTP")

A>Далеко не всякая Web-страничка является XML-файлом.
А где ты там видишь IXMLDOMDocument??? Текст надо -- он получен. Давай ещё про HttpSendRequest и HttpOpenRequest бодягу разведём. ;-)

A>2juicy_emad: Нужно исползовать ActiveX-компонент WebBrowser (aka Internet Explorer). Интерфейс IHtmlElement найдете в библиотеке типов system32\mshtml.tlb.

О! Вот про это я забыл, ну бывает простите... Добавлю только, что в списке Tools->References называется она "Microsoft HTML Object Libary", если её там нет, то надо нажать "Browse..." и найти её (как уже сказано) тут "%SystemRoot%\system32\mshtml.tlb". Посмотреть про содержимое этой библиотеки можно в VBA'шном (если конечно хочется) "Object Browser", вызвать можно по {F2}.

ZAM>>Чтоб использовать COM-сервер в VBA проекте, надо чтоб его (COM-сервера) объекты IDispath имплементировали.

A>Это совершенно не обязательно. Это нужно только для позднего связывания. Просто должна быть библиотека типов + типы должны быть Variant-совместимыми.
A>2juicy_emad: в проект нужно добавить ссылку на ActiveX-компонент. См. меню Tools\References.
Знаю знаю... просто если человеку много сразу наговорить, то он ничего не запомнит. Прощще ж запомнить, что IDispath нужен остальное потом дойдёт.
Наука изощряет ум; ученье вострит память.
(c) Козьма Прутков
Re[4]: VBA + HTTP -> HTML -> DOM
От: aloch Россия  
Дата: 30.01.08 07:41
Оценка:
Здравствуйте, ZAMUNDA, Вы писали:

ZAM>А где ты там видишь IXMLDOMDocument??? Текст надо -- он получен.


В исходном вопросе я видел innerText.


Re[3]: VBA + HTTP -> HTML -> DOM
От: juicy_emad  
Дата: 01.02.08 07:29
Оценка:
Здравствуйте, aloch, Вы писали:

A>2juicy_emad: в проект нужно добавить ссылку на ActiveX-компонент. См. меню Tools\References.


Вот тут немного не понял.
Ситуация такая, что я написал COM-Server в среде Delphi 7.0. Получилась библиотека типов (*.TLB) и сам исполняемый файл (*.DLL). И я не особо понял что нужно указывать в Tools->References->Browse. Сначала я добавил библиотеку типов (предварительно я регистрировал COM-Server в системе с пом. вызова DllRegisterServer()), после долгого поиска, я нашел добавленный компонент в списке и назывался он что-то типа "MyClass Library". Потом я попытался создать этот объект:

  Dim myObj as Object
  Set Object = CreateObject("MyClass Library")


В результате при выполнении последней строчки получилась ошибка: ~"Cannot create obejct".
Думаю, что проблема в том, что я неправильно задал параметр функции CreateObject.
Вопросы:
1.) Так ли я подключил COM-Server к проекту?
2.) Как понять какой параметр задавать в фукнцию CreateObject?
Re[4]: VBA + HTTP -> HTML -> DOM
От: juicy_emad  
Дата: 01.02.08 07:30
Оценка:
Имелось ввиду:

  Set myObj = CreateObject("MyClass Library")
Re[4]: VBA + HTTP -> HTML -> DOM
От: ZAMUNDA Земля для жалоб и предложений
Дата: 01.02.08 23:22
Оценка: 3 (1)
Здравствуйте, juicy_emad, Вы писали:

A>>2juicy_emad: в проект нужно добавить ссылку на ActiveX-компонент. См. меню Tools\References.

ВОТ Я Ж ГОВОРИЛ!!! Если много сразу человеку сказать, то он ничё не поймёт!!!

_>Вот тут немного не понял.

_>Ситуация такая, что я написал COM-Server в среде Delphi 7.0. Получилась библиотека типов (*.TLB) и сам исполняемый файл (*.DLL).
_>И я не особо понял что нужно указывать в Tools->References->Browse.
А если ты её сразу зарегил, то она в Tools->References должна появиться и без Browse.

_>Сначала я добавил библиотеку типов (предварительно я регистрировал COM-Server в системе с пом. вызова DllRegisterServer()), после долгого поиска, я нашел добавленный компонент в списке и назывался он что-то типа "MyClass Library".

Библиотеку типов дельфя в Dll должно пихнуть, можно было просто указать указать dll.

_>Потом я попытался создать этот объект:

_>
_>  Dim myObj as Object
_>  Set Object = CreateObject("MyClass Library")'Написано ж "ProgID" - туда его и надо.
_>

Хотя после того как ты подключил в Ref-s свою либу, имя Co-class можно вместо Object писать.
Короче если твой класс COM зовётся TTestCls, то надо писать вот так:
  Dim myObj as New TTestCls
  ' И понеслась...


_>Вопросы:

_>1.) Так ли я подключил COM-Server к проекту?
Всё так. Нажми {F2} увидишь свою либу в списке библиотек (сверху слева Combo), выбери её и увидишь свой класс.

_>2.) Как понять какой параметр задавать в фукнцию CreateObject?

Нажать {Ctrl+Shift+Space} когда курсор в параметрах (внутри скобок) CreateObject увидишь подсказку.
Ещё раз скажу, что очень помогает {F2} там и поиск есть и все параметры как на ладони и даж маленький help к каждой функции и классу.
Наука изощряет ум; ученье вострит память.
(c) Козьма Прутков
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.