Команда навигации не работает для макроса VBA - PullRequest
0 голосов
/ 28 апреля 2020

Я прилагаю следующий код, где я получаю сообщение «Ошибка автоматизации» в последней скопированной здесь строке (IE.Navigate). Этот код хорошо работал много раз, но сейчас я не знаю, что происходит. Ссылки активированы, P C, который запускает макрос, такой же, ничего не изменилось. Я также проверил, изменилась ли ссылка, но она все та же.

По сути, макрос выполняет открытие сайта inte rnet, он ждет, когда я войду (потому что у меня возникли проблемы при автоматическом входе) и затем это продолжается. Если я остановлю задание до того, как оно не выполнится, оно останется навсегда в DoEvents l oop, которое я имею перед последней строкой. Я не знаю, связано ли это с другой ошибкой, но этого также не случалось раньше. Конечно, я должен приостановить макрос, изменить строку выполнения на IE.Navigate, а затем я получаю сообщение, указанное выше.

Private Declare Function ShowWindow Lib "user32" _
         (ByVal hwnd As Long, ByVal nCmdSHow As Long) As Long
        Const SW_SHOWMAXIMIZED = 3

Sub Flujos_Valmer()


Dim URL As String
Dim IE As New SHDocVw.InternetExplorer, HTMLDoc As MSHTML.HTMLDocument
Dim ObjCollection As Object, ObjElement As Object, tdCollection As Object, cell As Object
Dim o As IUIAutomation
Dim e As IUIAutomationElement
Dim HTMLTables As MSHTML.IHTMLElementCollection, table As MSHTML.IHTMLElement
Dim i As Integer, j As Integer, t As Integer
Dim TV As String, Emisora As String, serie As String, user As String, pw As String

ultimo = Workbooks("Flujos Valmer.xlsm").Sheets("Macro").Cells(Rows.Count, "A").End(xlUp).Row
user = Workbooks("Flujos Valmer.xlsm").Sheets("Macro").Range("P5")
pw = Workbooks("Flujos Valmer.xlsm").Sheets("Macro").Range("P6")

URL = "http://www.valmer.com.mx/"
Set HTML_Content = CreateObject("htmlfile")
Set IE = CreateObject("InternetExplorer.Application")

IE.Visible = True
IE.navigate URL

Do While IE.Busy Or IE.readyState <> 4
    DoEvents
Loop
Set HTMLDoc = IE.document

Application.Wait (Now + TimeValue("00:00:03"))
ShowWindow IE.hwnd, SW_SHOWMAXIMIZED

Do While IE.Busy Or IE.readyState <> 4
    DoEvents
Loop

MsgBox "Por favor inicie sesión en Valmer", vbOKOnly

'HTMLDoc.all.Item("j_username").Value = user
'HTMLDoc.all.Item("j_password").Value = pw
'HTMLDoc.all.Item("btnIngresar").Click

Do While IE.Busy Or IE.readyState <> 4
    DoEvents
Loop

ShowWindow IE.hwnd, SW_SHOWMAXIMIZED
IE.navigate "http://www.valmer.com.mx/es/valmer/corporativo?idProceso=393"

1 Ответ

0 голосов
/ 29 апреля 2020

Ошибки автоматизации с IE могут иметь разные причины. Одним из них является повторное открытие IE после того, как оно было только что закрыто, если оно настроено на удаление файлов cookie и т.д. c. на выходе. Другое - слишком много «мертвых» экземпляров в памяти. Это можно проверить и при необходимости исправить с помощью диспетчера задач.

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

Option Explicit

Declare Function apiShowWindow Lib "user32" Alias "ShowWindow" _
            (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long

Global Const SW_MAXIMIZE = 3
Global Const SW_SHOWNORMAL = 1
Global Const SW_SHOWMINIMIZED = 2

Sub FlujosValmerLogIn()

  Const userName As String = "YourUserName@doit.com"
  Const passWord As String = "YourPassWord"

  Dim url As String
  Dim browser As Object

  url = "http://www.valmer.com.mx/"

  'Initialize Internet Explorer, set visibility,
  'call URL and wait until page is fully loaded
  Set browser = CreateObject("internetexplorer.application")
  browser.Visible = True
  apiShowWindow browser.hwnd, SW_MAXIMIZE
  browser.navigate url
  Do Until browser.readyState = 4: DoEvents: Loop

  'Set user name
  browser.document.getElementById("emailUsuario").Value = userName
  'Set password
  browser.document.getElementById("contrasenaUsuario").Value = passWord
  'Login
  browser.document.getElementById("btnIngresar").Click
  'Wait for the next page to load (Can be adjusted)
  'Application.Wait (Now + TimeSerial(hours, minutes, seconds))
  Application.Wait (Now + TimeSerial(0, 0, 5))

  'More of your code here
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...