IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

IHM Discussion :

Ouvrir formulaire d'une autre base déjà ouverte


Sujet :

IHM

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 17
    Points : 12
    Points
    12
    Par défaut Ouvrir formulaire d'une autre base déjà ouverte
    Bonsoir

    Depuis une base A, je souhaite ouvrir un formulaire d'une base B. J'ai recherché dans le forum des questions similaires et j'ai trouvé un lien vers le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    Private Declare Function apiSetForegroundWindow Lib "user32" _
                Alias "SetForegroundWindow" _
                (ByVal hwnd As Long) _
                As Long
     
    Private Declare Function apiShowWindow Lib "user32" _
                Alias "ShowWindow" _
                (ByVal hwnd As Long, _
                ByVal nCmdShow As Long) _
                As Long
     
    Private Const SW_MAXIMIZE = 3
    Private Const SW_NORMAL = 1
     
    Function fOpenRemoteForm(strMDB As String, _
                                            strForm As String, _
                                            Optional intView As Variant) _
                                            As Boolean
    Dim objAccess As Access.Application
    Dim lngRet As Long
     
        On Error GoTo fOpenRemoteForm_Err
     
        If IsMissing(intView) Then intView = acViewNormal
     
        If Len(Dir(strMDB)) > 0 Then
            Set objAccess = New Access.Application
            With objAccess
                lngRet = apiSetForegroundWindow(.hWndAccessApp)
                lngRet = apiShowWindow(.hWndAccessApp, SW_NORMAL)
                'le premier appel à  ShowWindow semble rester sans effet
                lngRet = apiShowWindow(.hWndAccessApp, SW_NORMAL)
                .OpenCurrentDatabase strMDB
                .DoCmd.OpenForm strForm, intView
                Do While Len(.CurrentDb.Name) > 0
                    DoEvents
                Loop
            End With
        End If
    fOpenRemoteForm_Exit:
        On Error Resume Next
        objAccess.Quit
        Set objAccess = Nothing
        Exit Function
    fOpenRemoteForm_Err:
        fOpenRemoteForm = False
        Select Case Err.Number
            Case 7866:
                'mdb ouverte en mode exclusif
                MsgBox "The database you specified " & vbCrLf & strMDB & _
                    vbCrLf & "is currently open in exclusive mode.  " & vbCrLf _
                    & vbCrLf & "Please reopen in shared mode and try again", _
                    vbExclamation + vbOKOnly, "Could not open database."
            Case 2102:
                'ce formulaire n'existe pas
                MsgBox "The Form '" & strForm & _
                            "' doesn't exist in the Database " _
                            & vbCrLf & strMDB, _
                            vbExclamation + vbOKOnly, "Form not found"
            Case 7952:
                'l'utilisateur a fermer la base de données
                fOpenRemoteForm = True
            Case Else:
                MsgBox "Error#: " & Err.Number & vbCrLf & Err.Description, _
                        vbCritical + vbOKOnly, "Runtime error"
        End Select
        Resume fOpenRemoteForm_Exit
    End Function
    Ce code fonctionne très bien, sauf que...si j'ouvre de nouveau un formulaire depuis ma base A, le code me crée une nouvelle instance de ma base B !
    Est-il possible, une fois la base B ouverte, de détecter qu'elle est ouverte et d'ouvrir de nouveau un formulaire sans avoir à ouvrir une nouvelle instance Access ?

    J'ai également essayé le code fourni dans la FaqAccess mais malheureusement, il ne correspond pas à ce que j'aimerais faire...

    Merci d'avance pour votre aide,

    Daniel

  2. #2
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 396
    Points : 19 821
    Points
    19 821
    Billets dans le blog
    66
    Par défaut
    Bonsoir,

    tu peux tester si ta base est ouverte avec une fonction du style:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Function FichierEstOuvert(ByVal FichierTeste As String) As Boolean
        Dim Fichier As Long
        On Error GoTo Erreur
        Fichier = FreeFile
        Open FichierTeste For Input Lock Read As #Fichier
        Close #Fichier
        FichierEstOuvert = False
        Exit Function
    Erreur:
        FichierEstOuvert = True
    End Function

    -------------------------------------------------------------------------
    -------------------------------------------------------------------------

    AUTRE POSSIBILITE:


    Utiliser une instance d'application Access...avec le code:

    Tu déclare une variable public Access.Application en haut d'un module (partie déclaration):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Option Compare Database
     
    Public appaccess As Access.Application

    puis dans ton code à exécuter:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    On Error Resume Next
     
        If Not (appaccess Is Nothing) Then
           appaccess.CloseCurrentDatabase
           Set appaccess = Nothing
        End If
     
    Set appaccess = CreateObject("Access.Application")
     
    appaccess.OpenCurrentDatabase "c:\Access\bd1.mdb"
     
    appaccess.DoCmd.OpenForm "formulaire1"
     
    appaccess.Visible = True
    A tester,

    A+

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 17
    Points : 12
    Points
    12
    Par défaut Ca marche mais...
    Bonsoir,

    Merci pour ta réponse, cela résoud en grande partie mon problème...
    Mais comment faire si je à partir de ma base A, je veux ouvrir DEUX formulaires de ma base B ? Dans ton code, en fait, à chaque fois que j'ouvre un formulaire, il teste si la base est ouverte, la ferme le cas échéant et l'ouvre en créant un instance Acess puis en ouvre le formulaire.

    En résumé, comment ouvrir depuis une autre base plusieurs formulaires d'une base déjà ouverte?

    Merci pour votre aide

    Daniel

  4. #4
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 396
    Points : 19 821
    Points
    19 821
    Billets dans le blog
    66
    Par défaut
    Bonsoir,

    Essaie avec ce code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    On Error Resume Next
     
        If (appaccess Is Nothing) Then
           Set appaccess = CreateObject("Access.Application")
        End If
     
    appaccess.OpenCurrentDatabase "c:\Access\bd1.mdb"
     
    appaccess.DoCmd.OpenForm "formulaire1"
    appaccess.Visible = True
     
    appaccess.RunCommand acCmdAppMaximize
    A+

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 17
    Points : 12
    Points
    12
    Par défaut un seul mot : merci !!
    Bonjour,

    Un grand merci pour ton aide,tout marche exactement comme je le souhaitais. Il ne me reste plus qu'à gérer le masquage d'Access pourne pas avoir plusieurs 'onglets' Access dans la barre des tâches.

    Un grand merci pour ton aide

    Bon dimanche

    Daniel

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 17
    Points : 12
    Points
    12
    Par défaut Si possible....
    Bonsoir User,

    J'ai une autre question relative au code que tu m'as proposé... Il marche parfaitement si je veux ouvrir plusieurs formulaires d'une base 2 à partir de ma base 1. Mais cela ne fonctionne pas si je veux ouvrir un formulaire d'une troisième base, tout en gardant les formulaires de ma base 2 ouverts (en fait, je réalise une application avec une base centrale et plusieurs bases 'périphériques' contenant chacune plusieurs formulaires que j'appelle depuis la base 1).

    Aurais-tu une solution ?

    Merci d'avance pour ton aide

    Daniel

  7. #7
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 396
    Points : 19 821
    Points
    19 821
    Billets dans le blog
    66
    Par défaut
    Salut,

    Si tu as plusieurs bases périphériques, disons 3 bases péripheriques, alors je verrai bien la déclaration de 3 variables Access.Application:

    Une pour chaque base de données du style, avec en haut du module, dans la partie déclarative:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Option Compare Database
     
    Public appaccess1 As Access.Application
    Public appaccess2 As Access.Application
    Public appaccess3 As Access.Application
    A+

Discussions similaires

  1. Réponses: 6
    Dernier message: 24/11/2019, 09h16
  2. Réponses: 3
    Dernier message: 17/08/2009, 09h57
  3. Ouvrir un formulaire d'une autre base
    Par jzbtrax10n dans le forum VBA Access
    Réponses: 1
    Dernier message: 23/12/2007, 18h12
  4. Réponses: 6
    Dernier message: 03/04/2007, 10h19
  5. Réponses: 3
    Dernier message: 23/08/2006, 16h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo