Excel получает данные из веб-формы?

#html #excel #forms #vba

#HTML #excel #формы #vba

Вопрос:

Заранее прошу прощения, потому что у меня возникли проблемы с формулировкой этого вопроса.

Нам нужно иметь диалоговое окно в Excel, которое может динамически изменяться на основе данных с нашего сервера.

Как я могу заставить Excel отображать форму, сгенерированную из HTML (которая должна быть напрямую получена с веб-сервера), а затем преобразовать результаты отправки этой формы в строку VBA, которой я затем могу манипулировать?

(Предположим, что у пользователя постоянное надежное соединение с Интернетом и что наш сервер никогда не отключается.)

Есть ли способ заставить Excel открывать окно браузера, поведение которого я могу перехватить следующим образом? Или мне придется использовать Ajax и самому анализировать HTML, чтобы создать форму из VBA?

Я надеюсь, что вопрос даже имеет смысл! Спасибо!

Комментарии:

1. Что вы запускаете на сервере? Обязательно ли это должна быть HTML-страница? Прямое подключение к базе данных (например, MySQL) могло бы быть намного удобнее — я не знаю, насколько хорошо Excel обрабатывает их, хотя

2. Почему бы просто не использовать функцию Excel для извлечения данных с веб-страницы (Для 2007/2010; Вкладка «Данные» на ленте, опция «Из Интернета»)?

3. Это часть более крупного проекта по написанию макросов, у меня нет контроля над тем, что поступает с сервера. Это HTML, хотя я мог бы убедить их предоставить мне XML.

Ответ №1:

Используйте элемент управления ActiveX Internet Explorer. Вот полное руководство по Excel VBA:

http://vba-corner.livejournal.com/4623.html

Ответ №2:

Если у вас есть Excel 2010, вы можете попробовать Data->From Web довольно классную функцию. Я уверен, что вы можете интегрировать его с VBA

Комментарии:

1. Интригующе.. Интересно, есть ли способ заставить его отображать форму пользователю без всех этих уродливых стрелок повсюду (по крайней мере, уродливые стрелки отображаются в эквиваленте Excel 2003) и разрешить вставку данных POST. Я изучу этот вариант.

Ответ №3:

Вы можете использовать экземпляр XMLHttp для запроса и получения информации с веб-сервера. Если «веб-сервис», к которому вы обращаетесь, находится под вашим контролем, то было бы намного лучше возвращать данные в виде csv / обычного текста или XML, если вам нужен более структурированный набор данных.

Если вам нужно передать какую-либо информацию в запросе, вы можете использовать GET или POST (в зависимости от того, сколько вам нужно отправить). Это будет имитировать публикацию обычной формы веб-страницы.

Вот простая функция, которая извлекает информацию из переданного ей URL:

 Private Function WebResponse(sURL As String) As String

    Dim XmlHttpRequest As Object
    Set XmlHttpRequest = CreateObject("MSXML2.XMLHTTP")
    XmlHttpRequest.Open "GET", sURL, False
    XmlHttpRequest.send
    WebResponse = XmlHttpRequest.responseText

End Function
  

Ваш URL-адрес может быть в форме:http://yourserver/page.php?id=22

Где «22» — это информация, которую вы передаете в запрос, чтобы определить, какой информацией сервер должен ответить.

Комментарии:

1. Я знаю об AJAX, но хитрость в том, что мне нужно взять HTML-форму с веб-сервера и отобразить ее пользователю, что позволит им отправить форму, а затем использовать выходные данные отправленной формы для манипулирования ею.

2. MSXML2.ServerXMLHTTP был бы более подходящим в этом случае для взаимодействия с сервером. @Josh — Вы могли бы создать экземпляр IE, но это медленно и грязно. Или используйте MSXML2.ServerXMLHTTP и загрузите текст ответа в HTML-документ, например, установите HTMLDoc = New HTMLDocument, затем HTMLDoc.body.innerHTML = XMLHTTP.responseText и отобразите документ. Это также может помочь

3. @osknows — из исходного вопроса было неясно, была ли обязательной форма ввода HTML, или они просто копируются на существующей странице. Я предположил, что они могли бы обойтись без этого, преимущество которого заключается в том, что не нужно разбирать данные из HTML. Я думаю, что ServerXMLHTTP оптимизирован для использования на сервере, а не на стороне клиента ( support.microsoft.com/kb/290761 ).