** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Es posible tener el Contro de IE desde Access?
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoEs posible tener el Contro de IE desde Access?

 Responder Responder
Autor
Mensaje
Jose35 Ver desplegable
Habitual
Habitual


Unido: 05/Noviembre/2017
Localización: Aljaraque
Estado: Sin conexión
Puntos: 104
Enlace directo a este mensaje Tema: Es posible tener el Contro de IE desde Access?
    Enviado: 15/Julio/2019 a las 14:10
Necesito tener el control de las ventanas de iExplorer que abro desde Access para poder cerrarlas de manera selectiva, ¿es posible?.

Me explico mejor....

Por motivos de seguridad y aplicaciones que usamos, todo super-rentringido, capado y controlado, en mi trabajo usamos ie11, me ocurre que si desde access abro una ventana de iExplorer, solo la puedo cerrar dandole al aspa superior.

Si utilizo la siguiente funcion que tengo implantada y la que hago llamadas

Function AbreUrlB(Url)
Dim web1 As Object
On Error Resume Next
Set web1 = CreateObject("InternetExplorer.Application")
With web1
.Visible = False
.navigate (Url)
Sleep (1000)
.Quit
End With
Set web1 = Nothing
End Function

Da igual que sea el  .visible= false o que este el .Quit, la abre y no la cierra.

Hay ventanas de iExplorer que lanzo para sacar datos de la pagina o aplicaciones web con las que trabajo, que una vez abiertas y extraido los datos me gustaria que se cerraran automaticamente desde access sin tener que dar yo a la aspa de cerrado.

¿Es posible?, no se como hacerlo, ni lo encuentro, por cierto no puedo usar Firefox o Edge ni Crhome (por motivos de seguridad) y por incompatibilidad con esas mismas aplicaciones de las que tengo que sacar los datos.

Un Saludo.





Editado por Jose35 - 15/Julio/2019 a las 14:10
Arriba
mounir Ver desplegable
Colaborador
Colaborador


Unido: 09/Febrero/2009
Localización: Asturias-España
Estado: Sin conexión
Puntos: 5183
Enlace directo a este mensaje Enviado: 15/Julio/2019 a las 16:08
Hola!

Este código cierra todas la ventanas abiertas de IE:

Public Sub CerrarIE()
    Dim Shell As Object
    Dim IE As Object

    Set Shell = CreateObject("Shell.Application")

    For Each IE In Shell.Windows
        If TypeName(IE.Document) = "HTMLDocument" Then
            IE.Quit
        End If
    Next
End Sub
Un Saludo.
Arriba
Jose35 Ver desplegable
Habitual
Habitual


Unido: 05/Noviembre/2017
Localización: Aljaraque
Estado: Sin conexión
Puntos: 104
Enlace directo a este mensaje Enviado: 15/Julio/2019 a las 17:21
Gracias Mounir, pero como he dicho necesito ser selectivo y cerrar lo que abro y ya no necesito, no puedo cerrar todo, sino me llevaría toda la mañana abriendo las aplicaciones, casi todas con las que trabajamos son de nuestra intranet.
Arriba
lbauluz Ver desplegable
Administrador
Administrador
Avatar

Unido: 29/Marzo/2005
Localización: Binghamton
Estado: Sin conexión
Puntos: 3379
Enlace directo a este mensaje Enviado: 16/Julio/2019 a las 03:26
Prueba algo así

function AbreUrlB(Url)
Dim web1 As Object
On Error Resume Next
Set web1 = CreateObject("InternetExplorer.Application")

web1.Visible = False
web1.navigate (Url)

    Do While web1.Busy
        DoEvents
    Loop

web1.Quit

Set web1 = Nothing
DoEvents
End Function

CREO que lo que te falta es la espera a que IE esté libre (bucle do while busy)

luis
Estos son mis principios. Si no le gustan... tengo otros
Arriba
guarracuco Ver desplegable
Moderador
Moderador
Avatar

Unido: 24/Abril/2004
Localización: EEUU
Estado: Sin conexión
Puntos: 3016
Enlace directo a este mensaje Enviado: 16/Julio/2019 a las 06:40
Puedes colocar al inicio del formulario Dim WithEvents IE As SHDocVw.InternetExplorer
y obtener todos los eventos del objeto.

luego, un evento para abrir una ventana IE:

-->
Dim strUrl As String
    If IsObject(IE) Then
        Set IE = Nothing
    End If
    Set IE = CreateObject("InternetExplorer.Application")

    scope = "com.intuit.quickbooks.accounting"
    response_type = "code"
    redirect_uri = "http://localhost/quickbook/redirecturl/oauth.php"
    strUrl = "https://appcenter.intuit.com/connect/oauth2?client_id=" + client_id + "&scope=" + scope + "&response_type=" _
    + response_type + "&redirect_uri=" + redirect_uri + "&state=none"
   
    IE.Navigate strUrl
    IE.Visible = True
   
    Do While IE.Busy
        Me.Caption = "Please, wait..."
    Loop
<--

Yo utilizo el evento Title_change para controlar y/o saber en donde esta la ejecucion:

Private Sub IE_TitleChange(ByVal text As String)
On Error GoTo lbl_err
    If InStr(1, text, "http://localhost/quickbook/redirecturl/oauth.php?state=none&code=", vbTextCompare) > 0 Then
        'Debug.Print text
        Dim arr
        arr = Split(text, "&")
        If IsArray(arr) Then
            For i = 0 To UBound(arr) - 1
                arr2 = Split(arr(i), "=")
                If IsArray(arr2) Then
                    If arr2(0) = "code" Then
                        strData = arr2(1)
                    End If
                End If
            Next
        Else
            MsgBox "bad server response"
            Exit Sub
        End If
        IE.Visible = False
        IE.Quit
        Set IE = Nothing
        'Debug.Print "the code is:" + strData
        'solicitar el token con la autorizacion (code) recibida. este es el paso 4
        ' descrito en la URL: https://docs.connect.squareup.com/api/oauth/?q=token#post-token
        getToken (strData)
    End If
lbl_exit:
    Exit Sub
lbl_err:
    MsgBox Err.Description
    Resume lbl_exit
End Sub

Este ejemplo es parte de una conexion a Quickbook con OAuth2, y llamadas a su REST API.

https://tucondominioaldia.net
Arriba
Jose35 Ver desplegable
Habitual
Habitual


Unido: 05/Noviembre/2017
Localización: Aljaraque
Estado: Sin conexión
Puntos: 104
Enlace directo a este mensaje Enviado: 16/Julio/2019 a las 08:16
Buenos Dias.

Ibauluz!!, con lo que me has escrito:

Do While web1.Busy
        DoEvents
    Loop

se me queda en ejecucion, vamos en bucle y no continua el programa, tengo que terminar la ejecucion desde VBA.

Guarracuco!!, con lo de colocar al inicio del formulario la linea que me indicas

"Dim WithEvents IE As SHDocVw.InternetExplorer"

no te entiendo muy bien, pero vamos que la ponga en el formulario donde se declaran las variables si te refieres a eso con "el principio del formulario" o dentro de la rutina que tengo creada para hacer lo que quiero hacer, da error de macro y no funciona y eso es ya solo añadiendo esa linea, por no decir que no entiendo demasiado tus lineas aunque si intuyo lo que indicas.

Saludos.



 
Arriba
happy Ver desplegable
Moderador
Moderador


Unido: 29/Enero/2005
Localización: España
Estado: Sin conexión
Puntos: 3074
Enlace directo a este mensaje Enviado: 16/Julio/2019 a las 12:26
El código que se está poniendo aquí son rutinas o trozos de rutinas de ejemplo que tú deberías personalizar para lo que necesitas. Por ejemplo, el código que escribió mounir te podría servir perfectamente si simplemente le agregas una o dos líneas que puedan servir para localizar la o las pestañas concretas que quieras cerrar. Pongo aquí una muestra por si quisieras cerrar una pestaña cuya URL sea https://www.facebook.com/ (la página de entrada a facebook)

Public Sub CerrarIE()
    Dim Shell As Object
    Dim IE As Object
 
    ' creamos una instancia del explorador (explorer) de windows
    Set Shell = CreateObject("Shell.Application")
 
    ' recorremos las ventanas/pestañas que contenga el explorador de windows
    ' (que yo sepa pueden ser ventanas del tipo explorador de archivos
    ' o del tipo internet explorer para la web)
    For Each IE In Shell.Windows
        ' si el objeto Document del explorer es del tipo HTML
        If TypeName(IE.Document) = "HTMLDocument" Then
            ' si la URL de la ventana/pestaña es la que buscamos
            If IE.LocationURL = "https://www.facebook.com/" Then
                ' la cerramos
                IE.Quit
                Exit For ' salimos del bucle. Trabajo hecho!!
            End If
        End If
    Next
   
End Sub

Espero que te sirva
Saludos,

Juan M. Afan de Ribera
Arriba
happy Ver desplegable
Moderador
Moderador


Unido: 29/Enero/2005
Localización: España
Estado: Sin conexión
Puntos: 3074
Enlace directo a este mensaje Enviado: 16/Julio/2019 a las 12:47
Aprovechando el título que se le ha dado a esta pregunta "Es posible tener el control ..." me gustaría comentar, tanto para este hilo en concreto como para otros hilos en los que se preguntan cosas parecidas para controlar el internet explorer, que sí es posible tener el control de Internet Explorer (y de otros navegadores como Firefox, etc) desde VBA.

Pero ... tener el control del internet explorer, NO quiere decir que vayas con eso a controlar lo que hay dentro de él.

Internet Explorer o cualquier otro navegador es una aplicación que mayormente se utiliza para  "contener" documentos HTML, es decir páginas o aplicaciones o portales, etc WEB.

Normalmente, cuando alguien quiere controlar el navegador de internet, no es que se quiera controlar el mismo navegador, sino una o más páginas web que se pueden llamar y visualizar desde ese navegador.

La estructura de las páginas web se crea a partir de los siguientes elementos (muy básicamente explicado):

- uno o más documentos HTML (ficheros de texto diseñados a base de etiquetas o tags HTML)
- uno o más ficheros CSS (Cascade Style Sheet, traducido como "hojas de estilo", que es donde se resumen propiedades y comportamientos de las etiquetas HTML, redefinidas como clases CSS)
- uno o más ficheros adjuntos o vinculados de algún tipo de lenguaje Script (Javascript, VBScript, etc), donde se definan funciones que controlen la interacción entre el usuario y la parte de cliente del sitio web
- otras cosas ...

De todos estos elementos, el documento HTML es el único imprescindible, ya que tanto los estilos CSS como las funciones del lenguaje de SCript son opcionales y pueden estar contenidos en el documento HTML.

¿Por qué me enrollo explicando esto? Pues es simplemente para explicar lo que decía antes. Tener el control del navegador no quiere decir que puedas controlar lo que contiene. Para poder controlar lo que contiene el explorador web se debe, primero, conectar o instanciar el objeto del navegador (IE, Firefox, Chrome) y después a partir de ese objeto, conectar con el objeto Document, que ya será la página web que esté dentro de esa ventana o pestaña del navegador.

Pero cada página web es diferente. Para poder controlarla se deberá estudiar su estructura (etiquetas o controles HTML), estudiar el estilo CSS (comportamientos de las etiquetas o controles) e incluso estudiar o localizar al menos, las rutinas Script, que se necesite utilizar para que la página haga lo que se desee, mediante código.

Es decir, cada página o portal web que se quiera controlar necesitará de un estudio previo particular.

Espero que sirva un poco de ayuda a los que estén interesados ...


Editado por happy - 16/Julio/2019 a las 12:54
Saludos,

Juan M. Afan de Ribera
Arriba
Jose35 Ver desplegable
Habitual
Habitual


Unido: 05/Noviembre/2017
Localización: Aljaraque
Estado: Sin conexión
Puntos: 104
Enlace directo a este mensaje Enviado: 16/Julio/2019 a las 13:02
Gracias happy por la aclaracion, lo que pretendo es eso, controlar determinadas paginas que tengo que lanzar para extraer sus datos, pues las leo su contenido HTML y extraigo lo que necesito, una vez extraido si consigo cerrarlas automaticamente pues ideal.

Voy a probar ahora lo ultimo que has puesto, ya os contare.....

Saludos.
Arriba
Jose35 Ver desplegable
Habitual
Habitual


Unido: 05/Noviembre/2017
Localización: Aljaraque
Estado: Sin conexión
Puntos: 104
Enlace directo a este mensaje Enviado: 16/Julio/2019 a las 13:50
Muy buenas casi lo tengo conseguido, ya cierro la ventana en concreto que queria cerrar, pero la rutina da fallo en la linea que ahora os indicare, da el error despues del primer Next, la primera vez que pasa por ella no da error.

la linea es esta:
If TypeName(IE.Document) = "HTMLDocument" Then

y el error es este:


Se ha producido el error ‘2147467259(80004005)’ en tiempo de ejecución

Error en el método ‘Document’ de objeto IWebBrowser2’


Creo que es por que como bien dices recorre todas las ventanas del explorador abiertas, sean de explorador o de internet, y cuando llega a la 2 que entiendo que no es una ventana de explorador de internet da error, si la anulo no pasa nada, pero ya puestos me gustaria que saltara las que son de explorador de windows.

Saludos.
Arriba
happy Ver desplegable
Moderador
Moderador


Unido: 29/Enero/2005
Localización: España
Estado: Sin conexión
Puntos: 3074
Enlace directo a este mensaje Enviado: 16/Julio/2019 a las 14:37
Ese error podría ser también porque no se accede correctamente a la librería de objetos de HTML. Pero la verdad es que no lo se muy bien, sinceramente. Es posible que se encuentre con un tipo de ventana que simplemente no contemple el objeto Document ...

En todo caso, obvia el error y contrólalo de otra manera. Siguiendo con el ejemplo de antes

Public Sub CerrarIE()
    Dim Shell As Object
    Dim IE As Object
    Dim x As Variant
 
    ' creamos una instancia del explorador (explorer) de windows
    Set Shell = CreateObject("Shell.Application")
 
    ' recorremos las ventanas/pestañas que contenga el explorador de windows
    ' (que yo sepa pueden ser ventanas del tipo explorador de archivos
    ' o del tipo internet explorer para la web)
    For Each IE In Shell.Windows
        ' si el objeto Document del explorer es del tipo HTML
        x = ""
        On Error Resume Next
        x = TypeName(IE.Document)
        On Error GoTo 0
        If x = "HTMLDocument" Then
            ' si la URL de la ventana/pestaña es la que buscamos
            If IE.LocationURL = "https://www.facebook.com/" Then
                ' la cerramos
                IE.Quit
                Exit For ' salimos del bucle. Trabajo hecho!!
            End If
        End If
    Next
   
End Sub

A ver si eso te funciona ... (si no, ves probando tú cosas, que si no, te lo vamos a dar todo hecho)
Saludos,

Juan M. Afan de Ribera
Arriba
lbauluz Ver desplegable
Administrador
Administrador
Avatar

Unido: 29/Marzo/2005
Localización: Binghamton
Estado: Sin conexión
Puntos: 3379
Enlace directo a este mensaje Enviado: 17/Julio/2019 a las 02:42
Si pones todo a mano (abrir el explorador y la url), ¿funciona?, porque a mi me funciona en todos los casos  (salvo Wait, pero eso es otro tema)

Con tu función original me funciona

Function AbreUrlB(Url)
    Dim web1 As Object
    On Error Resume Next
    Set web1 = CreateObject("InternetExplorer.Application")
    With web1
    .Visible = False
    .navigate (Url)
     Application.Wait Now + TimeValue("00:00:100") ' Just in case
    .Quit
    End With
    Set web1 = Nothing
End Function

Sub xx()
    AbreUrlB "http://www.mvp-access.com"
End Sub

Solo he cambiado Wait por  Application.Wait (y 100 en lugar de 1000)
Estos son mis principios. Si no le gustan... tengo otros
Arriba
Jose35 Ver desplegable
Habitual
Habitual


Unido: 05/Noviembre/2017
Localización: Aljaraque
Estado: Sin conexión
Puntos: 104
Enlace directo a este mensaje Enviado: 17/Julio/2019 a las 07:56
Buenas Ibauluz, es verdad que la funcion original funciona y por eso la tengo, pero funciona en mi casa y con el iExplorer que yo tengo en mi PC, cuando lo hago desde el curro no funciona, debe ser debido a temas de permisos o cualquier historia que aqui tengan capada, ya te digo que si algo puedes estar capado, aqui lo esta, jaja.

Al final, como ademas esa solucion si funciona aqui en mi trabajo, me quedo con la solucion aportada por happy, aunque los ultimos cambios que me ha añadido tambien fallan.

la dejo asi:

Public Sub CerrarIE()
    Dim Shell As Object
    Dim IE As Object
            
    Set Shell = CreateObject("Shell.Application")
 
    For Each IE In Shell.Windows               
         
            If IE.LocationURL = Url Then
                IE.Quit
                Exit For
         End If
     
        Next
   
End Sub



Editado por Jose35 - 17/Julio/2019 a las 08:00
Arriba
Jose35 Ver desplegable
Habitual
Habitual


Unido: 05/Noviembre/2017
Localización: Aljaraque
Estado: Sin conexión
Puntos: 104
Enlace directo a este mensaje Enviado: 19/Julio/2019 a las 13:05
Este hilo se puede cerrar, me quedo con lo ultimo que puse y que funciona.

Gracias.
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable