** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Localizar proceso específico
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Localizar proceso específico

 Responder Responder
Autor
Mensaje
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 11824
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita xavi Cita  ResponderRespuesta Enlace directo a este mensaje Tema: Localizar proceso específico
    Enviado: 16/Abril/2019 a las 12:05
Hola,

En mis aplicaciones a menudo relleno ficheros Excel mediante automatización. Esos ficheros son copia de un "master" almacenado en el servidor. El procedimiento es, más o menos, así:

- Copia del master con el nombre definitivo. Si el fichero definitivo ya existiera, se renombra insertando en el nombre el momento de modificación.
- Instancia de Excel
- Abrir el fichero a rellenar de forma oculta
- Insertar todos los datos
- Cerrar fichero salvando
- "matar" instancia de Excel
- Abrir el fichero rellenado

Imaginemos un "master" llamado PlantillaClientes.xlsx
Imaginemos un fichero destino llamado Cliente_IndustriasPEPE.xlsx

Al iniciar el proceso el sistema verifica que no exista un Cliente_IndustriasPEPE.xlsx. De existir lo renombra como Cliente_industriasPEPE_20190416_120000.xlsx

El problema surge cuando el proceso se rompe con algun error incontrolado que hace abortar el proceso dejando una instancia de Excel colgada con el fichero Cliente_IndustriasPEPE,xlsx abierto.

Cuando el usuario vuelve a lanzar el proceso, al verificar la existencia de un fichero con ese nombre el sistema intenta cambiar el nombre. Dado que el fichero está abierto, obtenemos el error 70 (Permiso denegado). El usuario flipa porque no tiene ningun Excel a la vista y no entiende nada. Ese error 70 se podria producir por 2 causas distintas: el propio usuario o otro usuario. En el segundo caso poco a hacer salvo informar al usuario actual (en mis aplicaciones dificilmente se daria pero no está de mas controlarlo). El primer caso es el que quiero controlar.

Todo este rollo para un par de preguntas

1. ¿Cómo recorro los procesos abiertos buscando si alguno de ellos tiene "pillado" el fichero Cliete_IndustriasPEPE.xlsx?
2. Una vez obtenido, ¿como instancio ese Excel concreto?. La idea es cerrar el archivo sin guarder y eliminarlo posteriormente. Si simplemente mato la instancia, cuando el usaurio abra cualquier Excel, le aparecerá el fichero en la ventana de recuperación de la parte izquierda.

Un saludo
Xavi, un minyó de Terrassa

Mi web
Arriba
happy Ver desplegable
Moderador
Moderador


Unido: 29/Enero/2005
Localización: España
Estado: Sin conexión
Puntos: 3021
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita happy Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 16/Abril/2019 a las 12:33
Hola Xavi, a ver si te puede servir el método que utilizo yo ...

Lo que hago es en el procedimiento en el que manipulo ese excel, en el control de errores, pongo unas líneas de código para identificar el libro en el cual se ha producido el error (se supone que será el libro activo, ya que justo lo estamos, eso, manipulando) y desde ahí cerrar el libro (es necesario hacerlo en este orden) y después, si vemos que en esa instancia de Excel ya no hay más libros abiertos, cerrar también esa instancia de Excel, que se está ejecutando de manera oculta. Más o menos sería así:

Dim oExcel As Object

    ' definición del control de errores
    On Error GoTo ErrorHandler

    ' abrimos una instancia de Excel
    Set oExcel = CreateObject("Excel.Application")

    ' aquí vendría el código rellenando el excel o lo que sea que hagas con esa plantilla ...

' Código de salida del procedimiento o función
ExitProcedure:

    Set oExcel = Nothing

    Exit Sub

' Control de errores
ErrorHandler:
    ' por si las moscas, desactivo el control de errores
    On Error Resume Next
    ' comprobamos si la instancia de Excel existe
    If Not oExcel Is Nothing Then
        ' comprobamos que exista al menos un libro abierto
        If oExcel.Workbooks.Count > 0 Then
            ' si es así, lo cerramos sin guardar cambios (pa qué?)
            oExcel.ActiveWorkbook.Close False
        End If
        ' cerramos la instancia actual de Excel
        oExcel.Quit
       
    End If
    On Error GoTo 0
   
    MsgBox Err.Number & " - " & Err.Description, vbExclamation
    Resume ExitProcedure

Si aplicas este código o lógica verás que no se queda ninguna instancia abierta del Excel (en todo caso, provoca un error a propósito y mira a ver si se queda o no abierta la instancia)

Espero que te sirva

Editado: Se me olvidaba, no se si ya lo haces, pero es importante desactivar los mensajes de Excel mientras esté en modo oculto (si acaso, al terminar los vuelves a activar)

oExcel.DisplayAlerts = False
oExcel.DisplayAlerts = True


Editado por happy - 16/Abril/2019 a las 13:18
Saludos,

Juan M. Afan de Ribera
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable