• 👏 Bienvenido a nuestra comunidad Excel

    ¿Todavía no estás registrado? 😲

    Registrate gratis aquí y podrás:

    💪 Hacer preguntas a los expertos
    ⬇️ Descargar ejemplos y plantillas
    🏅 
    Acceder a contenidos premium

Identificar procedencia de la llamada al Excel

ferrancc

Member
No sabia donde catalogar la pregunta. Espero no equivocarme.
Se puede saber si un Excel ha sido llamado por un usuario o por otro proceso? (vbs, otro excel, etc,)
 

Héctor Miguel

Well-known member
Se puede saber si un Excel ha sido llamado por un usuario o por otro proceso? (vbs, otro excel, etc,)
depende de "quien" haga la pregunta...
- el excel (o proceso) que lo llama ?
- el excel que fue llamado ?

haz pruebas (según la propia ayuda) con esta propiedad:
Application.UserControl (propiedad)
True si la aplicación está visible o si fue creada o iniciada por el usuario.
False si creó o inició la aplicación mediante las funciones CreateObject o GetObject y la aplicación está oculta.
Boolean de lectura y escritura.
 

ferrancc

Member
depende de "quien" haga la pregunta...
- el excel (o proceso) que lo llama ?
- el excel que fue llamado ?

haz pruebas (según la propia ayuda) con esta propiedad:
Application.UserControl (propiedad)
True si la aplicación está visible o si fue creada o iniciada por el usuario.
False si creó o inició la aplicación mediante las funciones CreateObject o GetObject y la aplicación está oculta.
Boolean de lectura y escritura.
Héctor Miguel gracias por enseñarme esta propiedad que desconocía.
He googleado un poco para enterarme mas del asunto y he hecho pruebas, bastantes pruebas, y hay una duda que quizá sea el meollo de la cuestión. (antes de empezar a enviar archivos, código y demás)
Asumiendo este código en un Excel (Programa.xlsm)
Código:
If Application.UserControl Then
    MsgBox "El programa ha sido llamado por " & Environ("ComputerName") & " - " & Environ("UserName")
Else
    MsgBox "El programa ha sido llamado por un procedimiento externo"
End If


y teniendo lo siguiente
1.- Un script VBS que llama al Programa.xlsm, y si ejecuto el script directamente, el Excel responde por Verdadero
2.- Ejecutando directamente Programa.xlsm, responde por Verdadero
3.- He creado un tercer programa Lanzador.xlsm, que tiene dos opciones (a)para llamar al script o (b)al excel, y en todos los casos el Excel responde por Verdadero.

Había supuesto que la opción 1 y la opción 3 en todos sus casos me respondería por Falso.
¿que no se ver? ¿en que estoy equivocado?

Tanto el script, como el Lanzador, como el ejecutado los tengo en sus versiones de productivo. Estoy preparando unas versiones únicamente con el código que nos ocupa par enviártelas si no tienes una respuesta clara.

Gracias y saludos
 

Héctor Miguel

Well-known member
He googleado un poco para enterarme mas del asunto y he hecho pruebas, bastantes pruebas, y
hay "detalles" que no se encuentran divulgadas con claridad por la web (p.ej.)
estas son las lineas de un *.vbs con dos opciones de mensaje
Código:
dim xlapp, wb
set xlapp = createobject("excel.application")
set wb = xlapp.workbooks.open("c:\pruebas\juego de caracteres.xlsx")
if xlapp.usercontrol then msgbox "excel en control del usuario"
if xlapp.usercontrol = false then msgbox "excel controlado por mecanismo de automatizacion"
wb.close false
xlapp.quit

en este caso, salta el segundo mensaje: "excel controlado por mecanismo de automatizacion"
sin embargo, cuando el vbs le da "visibilidad" a la instancia de excel (segundo vbs)
Código:
dim xlapp, wb
set xlapp = createobject("excel.application")
xlapp.visible = true
set wb = xlapp.workbooks.open("c:\pruebas\juego de caracteres.xlsx")
if xlapp.usercontrol then msgbox "excel en control del usuario"
if xlapp.usercontrol = false then msgbox "excel controlado por mecanismo de automatizacion"
wb.close false
xlapp.quit

el mensaje que salta es el primero: "excel en control del usuario"
el truco es NO hacer visible la instancia de excel (se supone que instanciando excel NO se quiere al usuario interactuando)
o... cancelar el control al usuario DESPUES de abrir un archivo (tercer vbs)
Código:
dim xlapp, wb
set xlapp = createobject("excel.application")
xlapp.visible = true
set wb = xlapp.workbooks.open("c:\pruebas\juego de caracteres.xlsx")
xlapp.usercontrol = false
if xlapp.usercontrol then msgbox "excel en control del usuario"
if xlapp.usercontrol = false then msgbox "excel controlado por mecanismo de automatizacion"
wb.close false
xlapp.quit
 

ferrancc

Member
Si, entiendo tus casos.
Pero usando tus ejemplos, el control de UserControl (valga la redundancia) necesito hacerlo dentro del excel "juego de caracteres.xlsx, y no en el propio vbs.
Es decir, es en el excel "juego de caracteres.xlsx", donde he de saber si se esta ejecutando porque lo llamo directamente el usuario o porque viene de un vbs, o llamado por otro excel, para actuar en consecuencia, y hacer una cosa u otra.
 

Héctor Miguel

Well-known member
es en el excel "juego de caracteres.xlsx", donde he de saber si se esta ejecutando porque lo llamo directamente el usuario o porque viene de un vbs, o llamado por otro excel, para actuar en consecuencia, y hacer una cosa u otra
bueno, ahora el tema cambia a tus intenciones de abrir de manera "automatizada" tanto la aplicacion (excel) como cualquier libro de excel (?)

por lo general, los medios de automatizacion abren las aplicaciones "NO visibles", por lo que el usuario NO tiene "el control"
como ya esta dicho: en cuanto la aplicacion queda visible, queda tambien a disposicion (y control) del usuario

a menos que tus procedimientos de trabajo "EN ese libro excel" se la pasen ".Select"(ionando) o ".Activate"(ando) sus objetos (?)
no es necesario mantener visible la aplicacion, por lo que puedes comprobar dicho estado en el evento '_open' del libro abierto

si te quedan "detalles en el tintero" ?... (es buen momento para comentarlos TODOS ?)
 

ferrancc

Member
por lo general, los medios de automatizacion abren las aplicaciones "NO visibles", por lo que el usuario NO tiene "el control"
como ya esta dicho: en cuanto la aplicacion queda visible, queda tambien a disposicion (y control) del usuario
Esta frase ha sido la que me ha quitado las orejeras de burro que he llevado todo el rato.
Comprobado y requetecomprobado.
Gracias
Y perdón por ir en cuentagotas, pero no sabia otra manera. Todo estaba en condicional, y si .......?, pero si? ...... o no....?
 
Arriba