2014-05-21 3 views
0

Я успешно автоматизирован VBA Excel макроса для итерации через петлю и ударил серию URL, чтобы вызвать серверный скрипт - это просто сделано с:Excel Internet Explorer Автоматизация вызывает IE Environment врезаться

myIE.Navigate ("http://someURL.php?VARIABLE=" & var_string) 

, где var_string назначается внутри цикла, когда он итерации проходят. До этого я очистили кэш, куки и историю с:

Shell "RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess # 

я пробовал много # 'ы в том числе 8,2, 16 и т.д., чтобы увидеть, если любой из них имели эффект (и сочетание # «s).

Проблема, с которой я сталкиваюсь, заключается в том, что хотя весь сценарий SOMETIMES работает, если я должен был запустить его во второй раз, строка, в которой я перемещаюсь по URL-адресу, не может вызывать URL-адрес, даже если домен/URL-адрес полностью включен и функциональный. Любой другой URL, который я вручную вношу в окно IE, работает просто отлично - просто не тот, который я вызываю внутри цикла. IE временно блокирует меня из этого домена. Если я вернусь к сценарию через несколько часов после последнего его запуска, он вообще работает.

Опять же, домен функциональный, и скрипт в порядке - я проверяю его все время на другой машине.

Это как если бы я настраивал что-то экологически и нарушая Internet Explorer в VBA, хотя сценарий абсурдно прост.

Я пробовал CreateObject(), GetObject а также InternetExplorerMedium для объекта myIE.

+0

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

+0

@TimWilliams К сожалению, нет. Код выполняется в miliseconds, и я владею доменом, поэтому я убедился, что разрешения также были 755/777 и т. Д. Я могу легко щелкнуть по URL самому, чтобы вызвать код на другом компьютере. Он просто ломается, когда VBA выполняет его, а затем всю мою среду IE на той машине, где макрос запускался, прерывается. – FullMetalProgrammer

+0

Если все, что вам нужно сделать, это вызвать URL-адрес, чтобы вызвать какой-либо процесс на сервере, а затем вместо этого использовать XMLHTTP. Вам нужно получить возвращаемое значение? –

ответ

1

Если вам нужно только «прикоснуться» к этому URL-адресу для его побочных эффектов, вы также можете использовать объект XMLHTTP. В VBA перейдите в меню «Инструменты», затем «Ссылки» и выберите «Microsoft XML», версия 6.0. Тогда:

Dim Request As New XMLHTTP 
Request.open "GET", Url & "?VARIABLE=" & var_string, False 
Request.send 
' Check Request.status, probably for 200 

Некоторые примечания:

  • Вы можете использовать POST вместо GET, если у вас возникли проблемы с кэшированием
  • Вы должны передать данные в теле POST, если сервер может обрабатывать его
  • значение var_string должны быть экранированы, в этом случае, URL закодирован
  • Если вы не хотите блокировать ожидание ответа, вы можете делать запросы асинхронно (True третий аргумент open)

После этих заметок, вот более сложный пример:

Dim Request As New XMLHTTP 
Request.open "POST", Url, True 
Dim Handler As New CXMLHTTPHandler 
Handler.Initialize Request 
Set Request.onreadystatechange = Handler 
Request.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"  
Request.send UrlEncode("VARIABLE") & "=" & UrlEncode(var_string) 
' This returns immediately, the check must now be done in the Handler 

Для недостающих частей, вот the code for CXMLHTTPHandler, что я на самом деле нашел through stackoverflow и a definition of UrlEncode at stackoverflow.

Для ваших нужд вы должны специализироваться на CXMLHTTPHandler, возможно, даже примите его к процедуре и вызовите ее в действительной процедуре по умолчанию. Процедура по умолчанию должна установить m_xmlHttp на Nothing, если m_xmlHttp.readyState - 4.


EDIT 1: Если ваш код запроса в цикле, вы должны разорвать Dim ... New заявления на две части, чтобы гарантировать, что Вы используете свежие объекты:

Dim Request As XMLHTTP 
Set Request = New XMLHTTP 
Request.open "POST", Url, True 
Dim Handler As CXMLHTTPHandler 
Set Handler = New CXMLHTTPHandler 
Handler.Initialize Request 
Set Request.onreadystatechange = Handler 
Request.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"  
Request.send UrlEncode("VARIABLE") & "=" & UrlEncode(var_string) 
' This returns immediately, the check must now be done in the Handler 
+0

«Как новый XMLHTTP» вызывает странные сообщения. Заменяет ли Set Request = CreateObject («MSXML2.XMLHTTP»), а затем выполняет запрос Request.open и Request.send в этом отношении? – FullMetalProgrammer

+0

Если он жалуется на незнание о 'XMLHTTP', я бы предпочел добавить ссылку на MSXML (см. Первый абзац в ответе), чем создавать его динамически, но это« удовлетворительно », то есть работает. – acelent

+0

Если у вас есть другие проблемы, например. с выражением 'Dim' внутри цикла, вы должны разделить оператор на две части:' Dim Request As XMLHTTP: Set Request = New XMLHTTP'; потому что в противном случае он будет повторно использовать один и тот же объект в каждой итерации (т. е. переменная инициализируется только один раз), а не создает новую. – acelent

Смежные вопросы