Verificare se esiste una maschera

di il
15 risposte

Verificare se esiste una maschera

Caio a tutti!

Vorrei verificare se esiste una determinata maschera da vba.

Grazie per l'aiuto

15 Risposte

  • Re: Verificare se esiste una maschera

    Per prima cosa scrivi la seguente funzione, che tra l'altro ti consentirà di verificare l'esistenza anche degli altri oggetti nel database corrente:

    Public Function VerificaOggetto(ByVal strName As String, ByVal ObjectType As Integer) As Boolean
    
    On Error GoTo VerificaOggetto_err
    
    VerificaOggetto = True
    
    Dim obj As AccessObject, dbs As Object
    
    Select Case ObjectType
        Case 0
            Set dbs = Application.CurrentData.AllTables(strName)
        Case 1
            Set dbs = Application.CurrentData.AllQueries(strName)
        Case 2
            Set dbs = Application.CurrentProject.AllForms(strName)
        Case 3
            Set dbs = Application.CurrentProject.AllMacros(strName)
        Case 4
            Set dbs = Application.CurrentProject.AllModules(strName)
        Case 5
            Set dbs = Application.CurrentProject.AllReports(strName)
        Case Else
            Set dbs = Application.CurrentProject.AllDataAccessPages(strName)
    End Select
    
    VerificaOggetto_Exit:
        On Error GoTo 0
        Exit Function
        
    VerificaOggetto_err:
        VerificaOggetto = False
        Resume VerificaOggetto_Exit
        
    End Function

    Poi per richiamarla:

    If VerificaOggetto(NomeOggetto, TipoOggetto) = True Then
         MsgBox "ESISTE"
    Else
         MsgBox "NON ESISTE"
    End If

    Prima, ovviamente, assegna il giusto codice ad ogni oggetto:

    • 0 = Tabella;
    • 1 = Query;
    • 2 = Maschera;
    • 3 = Macro;
    • 4 = Modulo;
    • 5 = Report
  • Re: Verificare se esiste una maschera

    Grazie

  • Re: Verificare se esiste una maschera

    La forma più snella se serve solo per le Forms, pure io però ho una Funzione simile a quella di Ettore che consente di testare tutti gli oggetti, e poi richiamo la singola:

    Public Function FormExist(mProject As Object, NomeForm As String) As Boolean
        On Error Resume Next
        Dim varName As Variant
        varName = mProject.AllForms(NomeForm).Name
        FormExist = Err.Number = 0
    End Function

    Da chiamare così:

    If FormExist(ApplicationInstance.CurrentProject, ObjectName) Then
  • Re: Verificare se esiste una maschera

    Giusto per completezza se può servire a qualcuno avevo un modulo BAS con questo condice che chiaramente può essere usato anche per Applicazioni esterne non solo il DbCorrente… basta passare l'istanza esterna di Access:

    Option Compare Database
    Option Explicit
    
    Public Enum ErrorCodes
        ApplicationNotCompiled = 65000
        ApplicationOpenDatabaseFailure
        ApplicationCompactRepairFailure
        'Export Failures
        RemoveUnnecessaryDataFailure
        ExportObjectFailure
        ExportFormFailure
        ExportReportFailure
        ExportMacroFailure
        ExportModuleFailure
        ExportQueryFailure
        ExportTableFailure
        ExportReferenceFailure
        ExportRelationFailure
        ExportDatabasePropertiesFailure
        ExportNavPaneFailure
        'Import Failures
        ImportObjectFailure
        ImportFormFailure
        ImportReportFailure
        ImportMacroFailure
        ImportModuleFailure
        ImportQueryFailure
        ImportTableFailure
        ImportReferenceFailure
        ImportRelationFailure
        ImportDatabasePropertiesFailure
        ImportNavPaneFailure
        'File Utility Failure
        FileReadFailure
        FileWriteFailure
        FileNameFailure
        FileNotExistFailure
        FileAlradyExistFailure
        FileFolderNameFailure
        FileFolderExistFailure
        'Utilities Failures
        DbPropAutoexecActive
        DbPropStartUpFormActive
        DbPropPasswordActive = 3031
        DbPropAllowByPassKeyActive
        'Object Failures
        ExistObjectFailure
        ExistTableFailure
        ExistQueryFailure
        ExistFormFailure
        ExistReportFailure
        ExistMacroFailure
        ExistModuleFailure
        ExistReferenceFailure
        ExistRelationFailure
        ExistCommandbarFailure
        ExistRibbonFailure
        ObjectNotIncludedFailure
        ObjectDeleteFailure
        ' ReplaceTextFailure
        ReplaceTextFailure
    End Enum
    
    Public Enum AllObjectTypes
        acForm = AcObjectType.acForm
        acReport = AcObjectType.acReport
        acMacro = AcObjectType.acMacro
        acModule = AcObjectType.acModule
        acQuery = AcObjectType.acQuery
        acTable = AcObjectType.acTable
        acReference = 5000
        acRelation = 5001
        acDatabaseProperties = 5002
        acObjectProperties = 5003
        acRibbon = 5004
        acCommandBar = 5005
        acNavPane = 5006
        acSpecFile = 5007
    End Enum
    
    Public Function DatabaseObjectExist(ByRef ApplicationInstance As Access.Application, ByVal ObjectName As String, ByVal TypeOfObject As AllObjectTypes) As Boolean
    On Error GoTo Err_DoesObjectExist
        DatabaseObjectExist = False
        Dim X As Variant
        Select Case TypeOfObject
            Case AllObjectTypes.acForm
                DatabaseObjectExist = FormExist(ApplicationInstance.CurrentProject, ObjectName)
            
            Case AllObjectTypes.acReport
                DatabaseObjectExist = ReportExist(ApplicationInstance.CurrentProject, ObjectName)
    
            Case AllObjectTypes.acMacro
                DatabaseObjectExist = MacroExist(ApplicationInstance.CurrentProject, ObjectName)
    
            Case AllObjectTypes.acModule
                DatabaseObjectExist = ModuleExist(ApplicationInstance.CurrentProject, ObjectName)
            
            Case AllObjectTypes.acQuery
                DatabaseObjectExist = QueryExist(ApplicationInstance.CurrentDb, ObjectName)
    
            Case AllObjectTypes.acTable
                DatabaseObjectExist = TableExist(ApplicationInstance.CurrentDb, ObjectName)
    
            Case AllObjectTypes.acRelation
                DatabaseObjectExist = RelationExist(ApplicationInstance.CurrentDb, ObjectName)
                
            Case AllObjectTypes.acReference
                DatabaseObjectExist = ReferenceExist(ApplicationInstance, ObjectName)
                
            Case AllObjectTypes.acDatabaseProperties
                DatabaseObjectExist = PropertyExist(ApplicationInstance.CurrentDb, ObjectName)
            
            Case Else
                Err.Raise ErrorCodes.ExistObjectFailure, "Utilities::DoesObjectExist", "Unknown ObjectType: " & TypeOfObject
        End Select
    Exit_Here:
        Exit Function
        
    Err_DoesObjectExist:
        Select Case Err.Number
            Case ErrorCodes.ExistObjectFailure
    
                MsgBox "ErrNum #" & Err.Number & vbNewLine & _
                       Err.Description, vbCritical, "ROUTINE FAILURE"
            
            Case Else
                MsgBox "Err(DoesObjectExist = " & ObjectName & ") N# " & Err.Number & vbNewLine & Err.Description
        End Select
    
        DatabaseObjectExist = False
        Resume Exit_Here
    
    End Function
    
    Public Function ReferenceExist(ma As Access.Application, NomeRelazione As String) As Boolean
        On Error Resume Next
        Dim varName As Variant
        varName = ma.References(NomeRelazione).Name
        ReferenceExist = Err.Number = 0
    End Function
    
    Public Function RelationExist(mDB As DAO.Database, NomeRelazione As String) As Boolean
        On Error Resume Next
        Dim varName As Variant
        varName = mDB.Relations(NomeRelazione).Name
        RelationExist = Err.Number = 0
    End Function
    
    Public Function TableExist(mDB As DAO.Database, NomeTabella As String) As Boolean
        On Error Resume Next
        Dim varName As Variant
        varName = mDB.TableDefs(NomeTabella).Name
        TableExist = Err.Number = 0
    End Function
    
    Public Function QueryExist(mDB As DAO.Database, NomeQuery As String) As Boolean
        On Error Resume Next
        Dim varName As Variant
        varName = mDB.QueryDefs(NomeQuery).Name
        QueryExist = Err.Number = 0
    End Function
    
    Public Function FormExist(mProject As Object, NomeForm As String) As Boolean
        On Error Resume Next
        Dim varName As Variant
        varName = mProject.AllForms(NomeForm).Name
        FormExist = Err.Number = 0
    End Function
    
    Public Function ReportExist(mProject As Object, NomeReport As String) As Boolean
        On Error Resume Next
        Dim varName As Variant
        varName = mProject.AllReports(NomeReport).Name
        ReportExist = Err.Number = 0
    End Function
    
    Public Function MacroExist(mProject As Object, NomeMacro As String) As Boolean
        On Error Resume Next
        Dim varName As Variant
        varName = mProject.AllMacros(NomeMacro).Name
        MacroExist = Err.Number = 0
    End Function
    
    Public Function ModuleExist(mProject As Object, NomeModule As String) As Boolean
        On Error Resume Next
        Dim varName As Variant
        varName = mProject.AllModules(NomeModule).Name
        ModuleExist = Err.Number = 0
    End Function
    
    Public Function PropertyExist(obj As Object, NomeProperty As String) As Boolean
        On Error Resume Next
        Dim varName As Variant
        varName = obj.Properties(NomeProperty).Name
        PropertyExist = (Err.Number = 0)
    End Function
    
    Public Function FieldExist(tdf As DAO.TableDef, NomeField As String) As Boolean
        On Error Resume Next
        Dim varName As Variant
        varName = tdf.Fields(NomeField).Name
        FieldExist = (Err.Number = 0)
    End Function
    
  • Re: Verificare se esiste una maschera

    Grazie Alex

  • Re: Verificare se esiste una maschera

    Mi chiede di dichiarare la variabile per ApplicationInstance “Variabile non definita”

    If FormExist(ApplicationInstance.CurrentProject, ObjectName) Then
    
    Application.CurrentProject ' questo è corretto
  • Re: Verificare se esiste una maschera

    Perdonate una domanda…

    Quando creo un programma so cosa ci metto dentro. Magari non so se un form è avviato, ma non capisco il senso di verificare che il form stesso esista..

    A che serve sapere se esiste un oggetto che ho messo nel progetto che sia a runtime che a design time?

  • Re: Verificare se esiste una maschera

    05/06/2024 - AlbertoL ha scritto:


    Mi chiede di dichiarare la variabile per ApplicationInstance “Variabile non definita”

    If FormExist(ApplicationInstance.CurrentProject, ObjectName) Then
    
    Application.CurrentProject ' questo è corretto

    devi passare l'istanza corrente, quindi Application, pensavo fosse evidente.

    If FormExist(Application.CurrentProject, ObjectName) Then
  • Re: Verificare se esiste una maschera

    05/06/2024 - sihsandrea ha scritto:


    Perdonate una domanda…

    Quando creo un programma so cosa ci metto dentro. Magari non so se un form è avviato, ma non capisco il senso di verificare che il form stesso esista..

    A che serve sapere se esiste un oggetto che ho messo nel progetto che sia a runtime che a design time?

    In linea di principio è corretto, ma dipende da cosa fa l'applicativo sviluppato.

    Nel mio caso ad esempio, sviluppai un tool di scanning di applicaitivi (mdb/accdb) per rilevare coerenza tra codice ed oggetti e per fare la modifica dei Nomi degli oggetti nel progetto ed assicurarmi di non perdere pezzi per strada.

    “Tu dirai che Access già lo fa questo”… io ti risponderei che non è così perchè oggetti come Form/ListBox/Combo ed anche Controlli supportano nelle varie proprietà definizioni di riferimenti ad oggetti del DB, vedi la possibilità di scrivere predicati SQL nella proprietà RecordSource/RowSource, o funzioni di aggregazione sui domini(DMAX/DLOOKUP…) in DefaultValue, nonchè riferimenti esterni ad altri controlli in Validation Roules…, ma anche Descrizioni, o proprietà come Descrizione Controllo, quella che esce quando si stazione su un controllo, oppure le Macro ecc.

    Tutte queste eccezioni l'automatismo di Access non le copre e, in caso di progetti un poco più complessi della contabilità casalinga, andare a recuperare in tutto il DB i riferimenti non è cosa banale…

    Il mio Tool, peraltro pubblicato anni ed anni fa, partendo dal progetto chiuso, lo apriva ed iniziava uno scanning e faceva tutto questo ed altro… quindi nel mio caso l'esigenza di verificare l'esistenza degli OIggetti era fondamentale.

    Detto ciò… nel complesso concordo.

  • Re: Verificare se esiste una maschera

    06/06/2024 - @Alex ha scritto:


    05/06/2024 - sihsandrea ha scritto:


    Perdonate una domanda…

    Quando creo un programma so cosa ci metto dentro. Magari non so se un form è avviato, ma non capisco il senso di verificare che il form stesso esista..

    A che serve sapere se esiste un oggetto che ho messo nel progetto che sia a runtime che a design time?

    In linea di principio è corretto, ma dipende da cosa fa l'applicativo sviluppato.

    Nel mio caso ad esempio, sviluppai un tool di scanning di applicaitivi (mdb/accdb) per rilevare coerenza tra codice ed oggetti e per fare la modifica dei Nomi degli oggetti nel progetto ed assicurarmi di non perdere pezzi per strada.

    “Tu dirai che Access già lo fa questo”… io ti risponderei che non è così perchè oggetti come Form/ListBox/Combo ed anche Controlli supportano nelle varie proprietà definizioni di riferimenti ad oggetti del DB, vedi la possibilità di scrivere predicati SQL nella proprietà RecordSource/RowSource, o funzioni di aggregazione sui domini(DMAX/DLOOKUP…) in DefaultValue, nonchè riferimenti esterni ad altri controlli in Validation Roules…, ma anche Descrizioni, o proprietà come Descrizione Controllo, quella che esce quando si stazione su un controllo, oppure le Macro ecc.

    Tutte queste eccezioni l'automatismo di Access non le copre e, in caso di progetti un poco più complessi della contabilità casalinga, andare a recuperare in tutto il DB i riferimenti non è cosa banale…

    Il mio Tool, peraltro pubblicato anni ed anni fa, partendo dal progetto chiuso, lo apriva ed iniziava uno scanning e faceva tutto questo ed altro… quindi nel mio caso l'esigenza di verificare l'esistenza degli OIggetti era fondamentale.

    Detto ciò… nel complesso concordo.

    ancora grazie per la spiegazione

  • Re: Verificare se esiste una maschera

    Quando creo un programma so cosa ci metto dentro. Magari non so se un form è avviato, ma non capisco il senso di verificare che il form stesso esista..

    A che serve sapere se esiste un oggetto che ho messo nel progetto che sia a runtime che a design time?

    Utilizzo la stessa maschera (che rinomino a seconda se openargs è =1 oppure =2 con due sottomaschere differenti.

      strFrm(0) = "M_Inviomiefatt"
     strFrm(1) = "M_Inviosollpag"
     If FormExist(Application.CurrentProject, strFrm(1)) Then
       DoCmd.Rename strFrm(0), acForm, strFrm(1)
     End If
     Arg = 2
     DoCmd.OpenForm strFrm(0), , , , , , Arg

    questo è il motivo

  • Re: Verificare se esiste una maschera

    Cantava quella cantante “pazza idea”.

    Stai cercando di sapere se ESISTE un form che TU hai creato… esiste, magari non sai cosa sta mostrando.

    Crea una variabile o cambi il titolo del form in base ai dati che sta mostrando.

    Comunque i form sono aggratis… 

    Se non vuoi riscrivere tutto lo duplichi e lo chiami in altro modo.

    Il cervello in fase di programmazione si rilassa senza capire cosa mostrare cosa filtrare e cosr simili…

    Anche se il form costasse 10 euro lo psicologo prende 100 a seduta per almeno 10 sedute… fai un form dedicato. Magari hai la necessità di lavorare contemporaneamente con l'uno e con l'altro…

  • Re: Verificare se esiste una maschera

    07/06/2024 - sihsandrea ha scritto:


    Cantava quella cantante “pazza idea”.

    Stai cercando di sapere se ESISTE un form che TU hai creato… esiste, magari non sai cosa sta mostrando.

    Crea una variabile o cambi il titolo del form in base ai dati che sta mostrando.

    Comunque i form sono aggratis… 

    Se non vuoi riscrivere tutto lo duplichi e lo chiami in altro modo.

    Il cervello in fase di programmazione si rilassa senza capire cosa mostrare cosa filtrare e cosr simili…

    Anche se il form costasse 10 euro lo psicologo prende 100 a seduta per almeno 10 sedute… fai un form dedicato. Magari hai la necessità di lavorare contemporaneamente con l'uno e con l'altro…

    ho un pc obsoleto e un programma già carico di oggetti…

    in piu' i campi nelle tb email sono legate al nome delle form per l'invio di determinate email

    quindi non ho potuto fare diversamente.

  • Re: Verificare se esiste una maschera

    07/06/2024 - AlbertoL ha scritto:


    Quando creo un programma so cosa ci metto dentro. Magari non so se un form è avviato, ma non capisco il senso di verificare che il form stesso esista..

    A che serve sapere se esiste un oggetto che ho messo nel progetto che sia a runtime che a design time?

    Utilizzo la stessa maschera (che rinomino a seconda se openargs è =1 oppure =2 con due sottomaschere differenti.

      strFrm(0) = "M_Inviomiefatt"
     strFrm(1) = "M_Inviosollpag"
     If FormExist(Application.CurrentProject, strFrm(1)) Then
       DoCmd.Rename strFrm(0), acForm, strFrm(1)
     End If
     Arg = 2
     DoCmd.OpenForm strFrm(0), , , , , , Arg

    questo è il motivo

    Quindi sappiamo che il form esiste e fa pure gli staordinari..

    Metti una variabile intera valori:

    0: libera

    1: inviomiefatture

    2: fai quell'altra cosa

    N: etc etc…

    Se la variabile è libera carichi le impostazioni e setti la variabile

    Se la variabile è<> zero messaggino “attendere prego…” pulsanti riprova e annulla… 

    L'avevi quasi previsto…

     If FormExist(Application.CurrentProject, strFrm(1)) Then

    Mancava lo stato neutrale…

Devi accedere o registrarti per scrivere nel forum
15 risposte