FAQ MS-Access
FAQ MS-AccessConsultez toutes les FAQ
Nombre d'auteurs : 140, nombre de questions : 926, dernière mise à jour : 15 juin 2021
- 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"
, acDesign
Dans 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
Function
L'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.Close
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.
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