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 exporter un état au format Word ?
- Comment annuler l'ouverture d'un état ?
- Comment exporter un état tout en conservant la mise en page ?
- Dans un état, comment dans le bas de page afficher la somme d'un champ du détail ?
- Comment faire du formatage conditionnel dans un état ?
- Comment afficher un état en plein écran et avec un zoom personnalisé ?
- Comment ajuster la prévisualisation d'un état à la fenêtre en VBA ?
- Comment insérer un numéro de ligne dans un état ?
- Pourquoi le message : "Alias de sortie 'Expr1' dupliqué" lorsque je lance mon état ?
- Problème d'affichage des chiffres dans les états. Pourquoi les chiffres ne sont-ils pas visibles à l'ouverture, ou à l'impression ?
- Comment compter le nombre d'enregistrements dans chaque groupe d'un état ?
- Comment masquer (ou réduire/ajuster la hauteur) d'une section en fonction des données ?
- Dans un état Access, on trouve une boite de dialogue "Trier / Regrouper", cette fonction est-elle programmable ?
- Comment empêcher la perte des marges d'un état ?
- Comment imprimer un état situé sur une base distante ?
- Comment choisir le mode d'affichage d'un état depuis un formulaire ?
- Comment ne pas perdre la mise en page d'un état ?
- Comment créer un graphique paramétrable depuis un formulaire vers un état ?
- Comment afficher un état en plein écran avec un zoom ajusté ?
- 8.1. Impressions (12)
- 8.2. États Trucs et Astuces (11)
DoCmd.OutputTo
acOutputReport, "Etat Utilisateur"
, acFormatRTF, "c:\mes documents\tmp.doc"
, True
Lorsqu'un état ne contient pas de donnée, son événement Sur Aucune Donnée (NoData) est levé.
Pour annuler l'ouverture de l'état, il suffit de fixer le paramètre Cancel de la procédure Report_NoData à True.
Exemple :
Private
Sub
Report_NoData
(
Cancel As
Integer
)
MsgBox
"Impossible d'ouvrir l'état : aucune donnée à afficher"
,VbCritical
Cancel =
True
End
Sub
Solution 1 : il faut acquérir le logiciel Adobe Acrobat Writer. Il suffit alors d'imprimer sur PDF writer.
Solution 2 : l'utilitaire Snapshot Viewer exporte votre état sur un fichier d'extension SNP. Ce fichier peut alors être envoyé attaché à un e-mail. Tout ce dont le destinataire a besoin, pour lire ce fichier, c'est l'utilitaire précité, sans qu'il ait à posséder Access.
Snapshot est téléchargeable sur le site de Microsoft.
Télécharger SnapShot pour Access 97/2000/2002 : http://www.microsoft.com/downloads/details.aspx?familyid=b73df33f-6d74-423d-8274-8b7e6313edfb&displaylang=fr
Pour obtenir une somme en bas de page, il suffit de créer un contrôle invisible dans la section détail qui contiendra la somme, puis y faire référence dans une zone de texte du pied de page.
Il faut utiliser l'événement Au formatage de la section concernée :
Private
Sub
Détail_Format
(
Cancel As
Integer
, FormatCount As
Integer
)
If
Me![nomControle] <
"0"
Then
Me![SourcEcr].ForeColor
=
16777215
Else
Me![SourcEcr].ForeColor
=
0
End
If
End
Sub
DoCmd.OpenReport
"Etat Utilisateur"
, AcView.acViewPreview
DoCmd.RunCommand
acCmdZoom150
DoCmd.Maximize
Plusieurs solutions :
- cette propriété non documentée :
DoCmd.OpenReport
"NomEtat"
, acViewPreview
Reports
(
"NomEtat"
).ZoomControl
=
0
- la méthode documentée qui correspond est :
DoCmd.OpenReport
"NomEtat"
, acViewPreview
DoCmd.RunCommand
acCmdFitToWindow
Procédure à suivre :
- insérer un contrôle TextBox ;
- dans l'onglet Données de la boîte de propriétés :
propriété Source contrôle, mettre la valeur "=1",
propriété Cumul : "Par groupe".
Cela veut dire que votre requête source essaie de renvoyer un jeu d'enregistrements avec deux colonnes ayant le même nom, et ce n'est pas possible.
Ceci concerne Access 2000. Il s'agit d'un aspect connu et recensé par Microsoft.
Une clé du registre (1025) a pour valeur 'On'.
La solution consiste à la mettre à Off dans l'éditeur de registre (Démarrer/Exécuter, taper regedit, puis Cliquer OK)
Voici son emplacement :
HKEY_CURRENT_USERS\Software\Microsoft\Office\9.0\Common\LanguageResources\1025.
Pour toute information supplémentaire à ce sujet, il est possible de se référer à la KB de Microsoft à cette adresse :
http://www.microsoft.com/intlkb/france/articles/F19/5/16.asp
Vous pouvez afficher le nombre d'enregistrements par groupe en utilisant
une zone de texte dans l'en-tête ou le pied du groupe. Dans la propriété
Source contrôle, vous saisirez =Compte([Champ]) en remplaçant
Champ par le nom d'un champ valide. Vous pouvez également utiliser l'astérisque.
Vous pouvez utiliser cette technique dans l'en-tête ou le pied de page de l'état.
Il suffit de jouer sur la propriété autoréductible du contrôle et de la section. Ceci est valable également pour les en-têtes et pieds de section.
L'équivalent de la boite de dialogue Trier/Regrouper doit se trouver dans la méthode CreateGroupLevel de l'objet Application, mais celle-ci n'est disponible que pour un état en mode création. Elle est notamment utile pour créer un assistant de création d'états.
CreateGroupLevel doit être utilisé en mode création, mais si le niveau de regroupement est déjà créé, on peut alors utiliser la propriété GroupLevel de l'état.
Cette propriété est utilisable dans tous les modes et s'accompagne d'autres propriétés utiles comme SortOrder, GroupOn, GroupInterval, KeepTogether et ControlSource.
Sur l'événement Open de l'état, vous pouvez changer ses propriétés selon vos besoins.
Exemple :
Me.GroupLevel
(
2
).ControlSource
=
"LeChampATrier"
Me.GroupLevel
(
2
).SortOrder
=
False
Il arrive fréquemment, lorsque l'on crée des états, d'être obligé de modifier la mise en page (marges ou orientation) pour des questions de place ou de positionnement (impression d'étiquettes par exemple)...
Mais il peut arriver qu'Access décide de remettre les paramètres par défaut.
Un moyen d'éviter ce problème (depuis Access 2000) :
allez dans le menu Outils/Options ;
dans l'onglet Général, décochez la case Suivi informations correction automatique.
En utilisant l'automation Access.
Les arguments de la fonction sont :
. chemin de la base distante ;
. nom de l'état ;
. page de départ ;
. page de fin.
Function
PrintRemoteReport
(
ByVal
strMDB As
String
, _
ByVal
strReport As
String
, _
Optional
ByVal
iStart As
Integer
=
1
, _
Optional
ByVal
iEnd As
Integer
=
9999
) As
Boolean
Dim
objAccess As
Access.Application
Dim
lngRet As
Long
' Gestion d'erreurs
On
Error
GoTo
PrintRemoteReport_Err
If
Len
(
Dir
(
strMDB)) >
0
Then
' Création de l'objet Access
Set
objAccess =
New
Access.Application
With
objAccess
' Ouverture de la base
.OpenCurrentDatabase
strMDB
' Les commandes sont les mêmes que pour la base en cours
' hormis le "objAccess."
' Ouverture de l'état
.DoCmd.OpenReport
strReport, acViewNormal
' Impression des pages
.DoCmd.PrintOut
acPages, iStart, iEnd, acHigh
' Fermeture de l'état sans sauvegarde
.DoCmd.Close
acReport, strReport, acSaveNo
End
With
End
If
PrintRemoteReport_Exit
:
' Libération des objets
On
Error
Resume
Next
objAccess.Quit
Set
objAccess =
Nothing
Exit
Function
PrintRemoteReport_Err
:
PrintRemoteReport =
False
Select
Case
Err
.Number
Case
7866
:
' MDB ouverte en mode exclusif
MsgBox
"La base demandée "
&
vbCrLf
&
strMDB &
_
vbCrLf
&
" est actuellement ouverte en mode exclusif. "
&
vbCrLf
_
&
vbCrLf
&
"Merci de la rouvrir en accès partagé."
, _
vbExclamation
+
vbOKOnly
, "Impossible d'ouvrir la base"
Case
2103
:
' L'état n'existe pas
MsgBox
"L'état '"
&
strReport &
_
"' n'existe pas dans la base "
_
&
vbCrLf
&
strMDB, _
vbExclamation
+
vbOKOnly
, "État non trouvé"
Case
7952
:
' L'utilisateur a fermé le fichier .mdb
PrintRemoteReport =
True
Case
Else
:
MsgBox
"Error#: "
&
Err
.Number
&
vbCrLf
&
Err
.Description
, _
vbCritical
+
vbOKOnly
, "Runtime error"
End
Select
Resume
PrintRemoteReport_Exit
End
Function
Exemple d'utilisation :
PrintRemoteReport "d:\temp\db.mdb"
, "MonEtat"
, 1
, 10
DocmdOpenReport, ReportName, acViewPreview
DoCmd.RunCommand
acCmdPreviewOnePage
Le code ci-dessus affichera les états en mode paysage (à l'italienne).
Si vous voulez les afficher sur deux pages les états en mode portrait (à la française) remplacez la seconde ligne par :
DoCmd.RunCommand
acCmdPreviewTwoPages
Un conseil : explorez les autres options de RunCommand acCmdPreview afin de découvrir d'autres possibilités qu'offre Access.
Il faut définir une mise en page spécifique pour un état via le menu [Fichier | Mise en page...] sans oublier, bien sûr, d'enregistrer l'état après la mise en page. Ainsi cette mise en page sera conservée et appliquée, quel que soit le poste utilisateur.
Il existe un défaut majeur d'Access 2000 qui perd les informations de mise en page.
Pour y remédier il faut :
>> mettre à jour Access/Office avec le package SR-1a (et au passage installer le SP3).
http://office.microsoft.com/fr-fr/of...226001036.aspx
>> à défaut, dans la boîte de dialogue des Options (obtenues via [Outils[Options...]), sélectionner l'onglet [Général] et désactiver les commandes de la section
[Correction automatique de nom..].
http://support.microsoft.com/default...b;en-us;240826
>> des utilisateurs indiquent que les infos de mise en page sont perdues si une imprimante spécifique est désignée et qu'elle n'est pas référencée sur le poste client.
Donc préférer l'imprimante par défaut.
Il suffit depuis votre formulaire d'attribuer le SQL à une requête et d'attribuer cette requête comme source de données à l'état ainsi ne reste plus qu'à changer le SQL à la volée et l'état s'en trouvera automatiquement modifié.
Pour exécuter ce code, il faut activer la référence : Microsoft DAO 3.x Object Library.
CurrentDb.QueryDefs
(
"MaRequeteGraph"
).SQL
=
strSQL
Lien : Définition et manipulation de données avec DAO par Tofalu
Ces codes permettent d'ouvrir un état avec le zoom ajusté à la taille de l'écran au lieu du zoom à 100 % par défaut.
Code OtObOx :
Code sur le principe de la Source de Tofalu (Simuler l'appui de n'importe quelle touche du clavier (exemple avec CAPSLOCK))
dans un module, mettre le code de Tofalu :
Public
Declare
Sub
keybd Lib
"user32"
Alias "keybd_event"
_
(
ByVal
bVk As
Byte, ByVal
bScan As
Byte, ByVal
dwFlags As
Long
, _
ByVal
dwExtraInfo As
Long
)
Public
Sub
appui_touche
(
T as
long
)
' Appuie sur la touche
keybd T, 0
, 0
, 0
' Relâche la touche
keybd T, 0
, 2
, 0
End
Sub
Ensuite dans le module de l'état mettre sur l'événement "sur ouverture" :
Private
Sub
Report_Open
(
Cancel As
Integer
)
' Agrandit la fenêtre au maximum
DoCmd.Maximize
' Ajuste l'affichage de la page à la taille de l'écran
appui_touche (
90
)
End
Sub
Code de FreeAccess
À partir d'un formulaire, mettre le code suivant sur l'événement "Sur clic" d'un bouton" :
Private
Sub
Commande0_Click
(
)
' Ouvrir état en mode Ajusté
DoCmd.OpenReport
"E_ESSAI"
, acViewPreview
DoCmd.Maximize
DoCmd.RunCommand
acCmdFitToWindow
End
Sub
L'état doit être "actif" AVANT que les commandes Maximize et acCmdFitToWindow ne soient exécutées.
Lien : Simuler l'appui de n'importe quelle touche du clavier (Exemple avec CAPSLOCK) par Christophe WARIN
Lien : Comment afficher un état en plein écran et avec un zoom personnalisé ?