** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Evitar apertura ventana código
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoEvitar apertura ventana código

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

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 14720
Enlace directo a este mensaje Tema: Evitar apertura ventana código
    Enviado: 30/Mayo/2020 a las 13:50
Hola,

Miro de poneros en situación. Estoy trabajando en un entorno de aplicación genérico que me sirva de base para desarrollar cualquier aplicación. Es un "framework" dónde ya hay un montón de funciones que he mirado de estandarizar y flexibilizar al máximo.

En un determinado momento puedo lanzar unas funciones destinadas a saber si la aplicación contiene una determinada función dentro del código.

Para ello utilizo un par de funciones (ExisteModulo y ExisteProcedimiento) que trabajan conjuntamente para devolver True/False.

Los procedimientos funcionan perfectos excepto por el pequeño detalle de que hay una línea que me abre la ventana de VBA (la marco en rojo).

¿Alguna idea de como evitar ese efecto? También se aceptan alternativas

Este es el código (he sacado cosas innecesarias)
Function ExisteModulo(strModule As String) As Boolean
    On Error GoTo ErrorHandler
    
    Dim mdl     As AccessObject
    
    For Each mdl In CurrentProject.AllModules
        If mdl.Name = strModule Then
            ExisteModulo = True
            Exit Function
        End If
    Next
    
    ExisteModulo = False

ExitProcedure:
    Err.Clear
    Exit Function
    
ErrorHandler:
    MsgBox "Error"
    Resume ExitProcedure
End Function

Function ExisteProcedimiento(strModule As String, strProcedureName As String) As Boolean
    On Error GoTo ErrorHandler
    
    Dim mdl         As Module
    Dim lngSLine    As Long
    Dim lngSCol     As Long
    Dim lngELine    As Long
    Dim lngECol     As Long
    Dim strLine     As String
    Dim strNewLine  As String
    Dim intChr      As Integer
    Dim intBefore   As Integer
    Dim intAfter    As Integer
    Dim strLeft     As String
    Dim strRight    As String

    If ExisteModulo(strModule) Then
        Set mdl = Modules(strModule)
    Else
        ExisteProcedimiento = False
        Exit Function
    End If
    
    If mdl.Find(strProcedureName, lngSLine, lngSCol, lngELine, lngECol) Then
        ExisteProcedimiento = True
        GoTo ExitProcedure
    Else
        ExisteProcedimiento = False
    End If

ExitProcedure:
    Set mdl = Nothing
    
    Err.Clear
    Exit Function
    
ErrorHandler:
    MsgBox "Error"
    Resume ExitProcedure
End Function


Muchas gracias
Xavi, un minyó de Terrassa

Mi web
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 13990
Enlace directo a este mensaje Enviado: 30/Mayo/2020 a las 14:09
Sin probar el detalle de la apertura de la ventanita .... Big smile

Yo me plantearía tener los nombre de las funciones / rutinas implementadas en un tabla de la aplicación ... a modo de MsysObjects personal.

Una posible opción para ocultar la ventana es cuando busques una función hacerlo por automatismo, ya que como lo puedes mantener visible = False no lo verías, la ejecución es muy rápida, así que si no son muchas consultas ese podría ser otro camino.

Una mezcla de los dos anteriores ...

Por cierto, una jilipo***z, ... ¿has probado Echo Off / Echo On?

Un saludo minyó.




Editado por Mihura - 30/Mayo/2020 a las 14:09
Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
pitxiku Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 27/Septiembre/2017
Localización: En mi casa
Estado: Sin conexión
Puntos: 1510
Enlace directo a este mensaje Enviado: 30/Mayo/2020 a las 14:17
¿Has probado con WizHook?

- http://www.mvp-access.es/juanmafan/wizhook/globalprocexists.htm
Arriba
happy Ver desplegable
Moderador
Moderador


Unido: 29/Enero/2005
Localización: España
Estado: Sin conexión
Puntos: 3192
Enlace directo a este mensaje Enviado: 30/Mayo/2020 a las 14:21
Xavi tienes que utilizar la librería Microsoft Visual Basic Applications Extensibility X.X. Con esa librería y sus objetos y métodos, los cuales si investigas con el examinador de objetos lo podrás comprobar, contienen los mismos métodos y propiedades que los objetos Module de Access. La ventaja es que si utilizas esa librería en vez de los objetos Module, cuando quieras acceder al código contenido en ellos (creo que son objetos del tipo vbComponent) no necesitas que se "abra" el módulo ni su ventana. Se puede hacer de manera invisible.

Yo imagino que las MzTools utilizan esa librería (además de otras cosas seguramente, claro).

Edito: mira, tengo por ahí una función de hace mucho tiempo que te puede servir como ejemplo. No recuerdo para qué la utilizaba, la verdad, pero todavía funciona:

Sub listarProcedimientosBd()
Dim vbc As Object 'VBComponent
Dim lineasModulo As Long
Dim lineasDeclaracion As Long
Dim claseProcedimiento As Long
Dim nombreProcedimiento As String
Dim nomProc As String ' para comparar
Dim i As Long

    For Each vbc In Application.VBE.ActiveVBProject.VBComponents
        lineasModulo = vbc.CodeModule.CountOfLines
        lineasDeclaracion = vbc.CodeModule.CountOfDeclarationLines
       
        Debug.Print "Nombre módulo: "; vbc.Name
        nombreProcedimiento = vbc.CodeModule.ProcOfLine(lineasDeclaracion + 1, claseProcedimiento)
        Debug.Print " - "; nombreProcedimiento
       
        For i = (lineasDeclaracion + 1) To lineasModulo
            nomProc = vbc.CodeModule.ProcOfLine(i, claseProcedimiento)
            If nombreProcedimiento <> nomProc Then
                Debug.Print " - "; nomProc
                nombreProcedimiento = nomProc
            End If
        Next
    Next
   
End Sub



Editado por happy - 30/Mayo/2020 a las 14:23
Saludos,

Juan M. Afan de Ribera
Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 14720
Enlace directo a este mensaje Enviado: 30/Mayo/2020 a las 14:28
@Jesus: El echo on/off ni cosquillas
@pitxiku: ClapClapClapClap
@Happy: lo miro pero lo de pitxiku no puede resultar más límpio. ¡¡Y encima viene de tu página!!

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: 3192
Enlace directo a este mensaje Enviado: 30/Mayo/2020 a las 14:43
LOL

Pero igualmente, lo que venga del Wizhook es sólo eso y ya no te deja hacer nada más. En la función que he pegado se muestra cómo acceder a elementos del código de un proyecto VBA (access, excel, word, ...) y poder "hacer cosas" sin que se abran las ventanas y pudiendo modificar cosas y todo eso (ahora recuerdo que tenía un fichero Excel con código en el que de manera dinámica e invisible, incluía algunas líneas de código (creo que eran los valores de unas constantes, que no eran tan constantes, jejeje. Y hacía servir, como no, la librería esa que menciono)

Saludos,

Juan M. Afan de Ribera
Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 14720
Enlace directo a este mensaje Enviado: 01/Junio/2020 a las 11:05
Vale, adaptado y funcionando 100%.

De todas formas me quedo con los 2 métodos

Un saludo
Xavi, un minyó de Terrassa

Mi web
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable