FAQ MS-Access

FAQ MS-AccessConsultez toutes les FAQ
Nombre d'auteurs : 140, nombre de questions : 926, dernière mise à jour : 15 juin 2021
Sommaire→VBA→Interaction avec d'autres applications→Applications Office→Access- Comment ouvrir un formulaire ou un état depuis une autre application Access (intégration d'applications) ?
- Comment ouvrir par le code une autre base Access et ouvrir un de ses formulaires ?
- Comment travailler sur une autre base de données Access protégée par un mot de passe ?
- Comment récupérer le code d'une base Access non ouverte par VBA ?
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 :
' 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 :
ApplicationXxx.FormOpen "NomFormulaire", acDesignDans un module :
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 FunctionL'appel se fera de la manière suivante :
Call fOpenRemoteForm("chemin_de_ma_base\base.mdb", "Form_a_ouvrir")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 :
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.CloseLien : 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.
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


