Можно ли получить поток из веб-запроса Excel VBA? - PullRequest
3 голосов
/ 12 августа 2011

Я использую WebQuery в Excel VBA, используя что-то похожее на этот пример: (Этот пример фактически скопирован здесь: http://support.microsoft.com/kb/213730, и я использую другой URL с другими аргументами POST)

Sub URL_Post_Query()

With ActiveSheet.QueryTables.Add(Connection:= _
    "URL;http://webservices.pcquote.com/cgi-bin/excel.exe", _
    Destination:=Range("a1"))

    .PostText = _
        "QUOTE0=[""QUOTE0"",""Enter up to 20 symbols separated " & _
              "by spaces.""]"

   .BackgroundQuery = True
    .TablesOnlyFromHTML = True
    .Refresh BackgroundQuery:=False
    .SaveData = True
End With
End Sub

Мне нужно иметь возможность делать особо большие запросы (например, скажем, я получаю информацию о цене акций для 20 000 ценных бумаг), и когда я это делаю, Excel «зависает» и не показывает никакого прогресса, пока он работает, хотя запрос успешно завершен.

Используя этот синтаксис, есть ли способ получить доступ к потоку данных, как они поступают? Это помогло бы двумя способами: я мог обрабатывать данные небольшими порциями по мере их поступления, и я мог бы создать индикатор выполнения для отображения пользователю.

Спасибо.

Ответы [ 3 ]

1 голос
/ 06 октября 2015

Если вы хотите получить полный доступ к результатам веб-вызова, вы можете открыть URL-адрес как другую книгу вместо использования веб-запроса.

См. Мой ответ на этот вопрос: Как можно выполнить пост-обработку данных из веб-запроса Excel после завершения запроса?

Компромисс этого подхода заключается в том, что вы сами управляете обработкой возвращаемых данных - Excel не поместит их в определенное место для вас. Но это звучит так, как будто с тобой все в порядке?

Это синхронный вызов, но вы получаете индикатор выполнения, поэтому пользовательский интерфейс улучшается.

В итоге мы пошли по этому пути после того, как попробовали что-то похожее на то, что вы, похоже, делали.

1 голос
/ 12 августа 2011

Если вы хотите больше контроля, вы можете переключиться с веб-запроса на что-то вроде использования экземпляра xmlhttp: это можно использовать асинхронно (не очень просто, но вполне выполнимо):

http://www.dailydoseofexcel.com/archives/2006/10/09/async-xmlhttp-calls/

Обратите внимание, что нет гарантии, что при отправке большого блока символов веб-служба возвращает ответ для каждого символа в отдельности: для серверов характерно буферизовать содержимое до тех пор, пока весь ответ не будет завершен.

Возможно, вам лучше разбить ваши кавычки на несколько запросов, каждый с меньшим количеством символов.

0 голосов
/ 13 августа 2011

Если вы работаете с большим документом XML, то вы можете обнаружить, что обработка результатов с помощью SAX, а не DOM делает вещи менее подверженными зависанию. Вы можете найти этот ответ на связанный вопрос, который будет полезен

...