Developpez.com

Une très vaste base de connaissances en informatique avec
plus de 100 FAQ et 10 000 réponses à vos questions

FAQ MS-AccessConsultez toutes les FAQ

Nombre d'auteurs : 140, nombre de questions : 926, dernière mise à jour : 30 mars 2017 

 
OuvrirSommaireVBAInteraction avec d'autres applicationsApplications OfficeAccess

Dans une application complexe comportant plusieurs modules applicatifs (plusieurs fichiers .mdb), vous souhaitez ouvrir, à partir d'une application "Portail", les formulaires des autres applications.
_ Il faut, dans chaque "Portail", créer une référence à chacune des applications que le portail va appeler : dans VBA, menu Outils, Références, Parcourir, choisir le type de fichier "Base de données (*.mdb)"...
Conseil, à ce propos : installez toutes les applications dans le même dossier, sur les postes des utilisateurs. Vous éviterez ainsi des erreurs de référence au moment de l'exécution, après l'installation chez le client.
_ Vous pourrez alors accéder à chacune des fonctions déclarées comme publiques dans des modules standard, donc :
_ dans chaque application, vous créez une fonction publique dans un module standard, qui ouvre les formulaires. Exemple de fonctions génériques :

 
Sélectionnez
  ' Intégration d'applications :
Public Function FormOpen(FormName As String, _
                Optional View As AcFormView = acNormal, _
                Optional FilterName As String, _
                Optional WhereCondition As String, _
                Optional DataMode As AcFormOpenDataMode = acFormPropertySettings, _
                Optional WindowMode As AcWindowMode = acWindowNormal, _
                Optional OpenArgs As String)
 ' Appelée depuis le portail, pour ouvrir les formulaires de cette application
    DoCmd.OpenForm FormName, View, FilterName, WhereCondition, DataMode, WindowMode, OpenArgs
End Function

Public Function ReportOpen(ReportName As String, _
                Optional View As AcView = acNormal, _
                Optional FilterName As String, _
                Optional WhereCondition As String)
 ' Appelée depuis le portail, pour ouvrir les états de cette application
    DoCmd.OpenReport ReportName, View, FilterName, WhereCondition
End Function

_ C'est une de ces fonctions que vous appelez depuis l'application "Portail", pour ouvrir un formulaire ou un état de l'autre. Pour être sûr de ne pas se tromper d'application, faites précéder le nom de la fonction par le nom de projet (Menu VBA : Outils, Propriétés de ApplicationXxx...) de l'application appelée, comme dans :

 
Sélectionnez
ApplicationXxx.FormOpen "NomFormulaire", acDesign
Créé le 25 octobre 2004  par Papy Turbo

Dans un module :

 
Sélectionnez

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_MAXIMIZE)
            'le premier appel à  ShowWindow semble rester sans effet
            lngRet = apiShowWindow(.hWndAccessApp, SW_MAXIMIZE)
            .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 fermé 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

L'appel se fera de la manière suivante :

 
Sélectionnez

Call fOpenRemoteForm("chemin_de_ma_base\base.mdb", "Form_a_ouvrir")
Créé le 10 mai 2005  par Morsi

Pour exécuter ce code, il faut activer la référence : Microsoft DAO 3.x Object Library.

Il est possible d'intégrer le mot de passe au code lors de l'ouverture de la base de données :

 
Sélectionnez
Dim db as Dao.DataBase

Set db = DBEngine.OpenDatabase("C:\MaBase.mdb", False, False, ";pwd=password")

' Effectuer le traitement sur la base de données ici.

db.Close
Créé le 20 novembre 2005  par Lo²

Lien : Définition et manipulation de données avec DAO par Tofalu
Lien : Comment déclarer une référence dans MS Access ?

Voici un code permettant d'accéder au code d'une base Access non ouverte.

 
Sélectionnez
Function MajCodeVBA(PathBase As String) As Boolean
Dim db_encours As DAO.Database
Dim db_temporaire As DAO.Database
Dim RS As DAO.Recordset
Dim strSQL As String
 
Dim temp As VBComponent
Dim AppAccess As Access.Application
Dim Accmodule As Module
Dim i As Integer
Dim j As Integer
'On Error GoTo fin
Dim oAccess As New Access.Application
Dim oDb As DAO.Database
    
    strSQL = "SELECT ancienne_valeur, nouvelle_valeur from T_CONVERSION_Queries;"
    Set RS = CurrentDb.OpenRecordset(strSQL)
    
    With oAccess
        .OpenCurrentDatabase (PathBase)
        Set oDb = .CurrentDb
    End With
    
    
        
    For i = 1 To oAccess.VBE.VBProjects(1).VBComponents.Count
        For j = 1 To oAccess.VBE.VBProjects(1).VBComponents.Item(i).CodeModule.CountOfLines
            Do Until RS.EOF
                Debug.Print oAccess.VBE.VBProjects(1).VBComponents.Item(i).CodeModule.Lines(j, 1)
                oAccess.VBE.VBProjects(1).VBComponents.Item(i).CodeModule.ReplaceLine j, Replace(oAccess.VBE.VBProjects(1).VBComponents.Item(i).CodeModule.Lines(j, 1), RS!ancienne_valeur, RS!nouvelle_valeur)
                RS.MoveNext
            Loop
            RS.MoveFirst
        Next j
    Next i
    RS.Close
    'Set CurrentDb = db_encours
    Set oAccess = Nothing
    oDb.Close
    Set oDb = Nothing
    MajCodeVBA = True
Exit Function
 
'fin:
'    MajCodeVBA = False
End Function
Créé le 31 mars 2008  par Lou Pitchoun, Philippe JOCHMANS, jpcheck
  

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2013 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.