#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:
Ответ №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 ).