6/8 Dans cette fiche...    

Début de page Introduction

L'instruction OpenForm et OpenReport servent respectivement à ouvrir un formulaire ou un état en Visual Basic. Comment ça marche ?

Pour utiliser ce qui suit, vous avez besoin de savoir définir un événement dans un formulaire, compiler du code, et exécuter du code.

 

Début de page L'instruction OpenForm

Astuce
Pour découvrir ces 2 instructions, passez d'abord par l'Assistant du bouton de commande, qui crée un code VB standard, que vous pourrez aménager par la suite.

La syntaxe générale pour ouvrir un formulaire (normalement sur une seule ligne) est :
DoCmd.OpenForm "Nom du formulaire", type d'ouverture, "nom du filtre", "condition Where"

D'autres paramètres existent encore en fin de ligne, si vous êtes amateur !
Les 4 paramètres ci-dessus sont :

  • Nom du formulaire : le nom du formulaire, tel qu'il apparaît dans la fenêtre de base de données.
  • Type d'ouverture : une constante Access qui indique comment ouvrir le formulaire (en général, cette valeur sera acNormal; le formulaire est alors ouvert comme si vous aviez double-cliqué dessus dans la fenêtre de base de données).
  • Nom du filtre : rarement utilisé (on préférera la condition Where, ci-après)
  • Condition Where : il s'agit d'une condition permettant de filtrer le formulaire (de n'avoir qu'une partie des enregistrements). Ceci équivaut à une clause Where en SQL (mais sans le mot Where).

Quelques exemples :

Par exemple, pour ouvrir le formulaire Clients de façon classique, il suffit d'écrire l'une des 2 lignes :
DoCmd.OpenForm "frmClients"
DoCmd.OpenForm "frmClients", acNormal
 
Plus intéressant, la possibilité de filtrer les clients :
DoCmd.OpenForm "frmClients", acNormal, , "CA>100000"

Ici, on ouvre le formulaire Clients en limitant l'affichage aux clients dont le CA est supérieur à 100000 F (ceci suppose qu'un champ CA de type Numérique ou Monétaire existe). Notez aussi que pour omettre le paramètre "Nom du filtre", on doit placer 2 virgules sur la ligne.

 
Si le champ à filtrer est de type Texte, la syntaxe se corse :
DoCmd.OpenForm "frmClients", acNormal, , "CodePostal='56000'"

Comme le CodePostal est un champ de type Texte, il faut l'entourer en théorie de guillemets. Mais comme la condition Where est elle-même déjà entre guillemets, on transforme le "56000" en '56000' (avec des apostrophes).

 
Si, en plus, le nom du champ comporte des signes cabalistiques (espace, aspotrophe...), il faut l'inclure entre crochets, comme ci-contre :
DoCmd.OpenForm "frmClients", acNormal, ,
"[Code postal]='56000'"
 
Il est possible de placer 2 conditions ou plus, comme par exemple :
DoCmd.OpenForm "frmClients", acNormal, ,
"[Code postal]='56000' AND CA>100000"

Le mot-clef AND (ET en français), permet de combiner les conditions. Le mot-clef OR (OU) permet de retenir les clients qui respecteraient la 1ère condition ou la 2ème.

Un peu plus loin avec Visual Basic :

Si les valeurs proviennent d'une variable Visual Basic, il faut respecter les même règles, mais en "collant" la variable hors de la condition Where.

Les lignes ci-contre sont incorrectes :
Dim sngCA As Single
sngCA = 100000
DoCmd.OpenForm "frmClients", acNormal, , "CA>sngCA"

Ceci ne fonctionne pas, car la variable sngCA figure entre les guillemets. Access va donc chercher tous les CA supérieurs à la valeur sngCA, ce qui n'a pas de sens.

Dans ce cas, Access se comportera comme dans le cas d'une requête paramétrée, et affichera une boîte pour demander la valeur du paramètre sngCA.

 
Voici une version améliorée :
Dim sngCA As Single
sngCA = 100000
DoCmd.OpenForm "frmClients", acNormal, , "CA>" & sngCA

Cette fois, ça marche !
L'opérateur & sert à coller la chaîne "CA>" à la valeur réelle désignée par sngCA, soit 100000. Comme si vous aviez écrit directement "CA>100000".

 
Encore plus vicieux (si, si) : la condition est basée sur une chaîne de caractères. L'idée, comme plus haut, est d'obtenir :
DoCmd.OpenForm "frmClients", acNormal, ,
"[Code postal]='56000'"

...sachant que le 56000 est contenu dans une variable.
Si vous avez compris le principe, il suffit de remplacer le 56000 par une variable "hors des guillemets". Ce qui donne :

Dim strCP As String
strCP = "56000"
DoCmd.OpenForm "frmClients", acNormal, ,
"[Code postal]='" & strCP & "'"

Faites attention aux guillemets et aux apostrophes : la condition finale doit être un collage entre [Code postal]=' (avec une apostrophe ouvrante) puis la valeur de strCP puis une apostrophe fermante.

 
Tout ceci devient sérieusement pénible :o) quand vous devez établir une condition double :
Dim strCP As String, sngCA as Single
strCP = "56000"
sngCA = 100000
DoCmd.OpenForm "frmClients", acNormal, ,
"[Code postal]='" & strCP & "' AND CA>" & sngCA
 
Pour terminer en beauté, on peut imaginer que les variables elles-mêmes sont renseignées par des zones de texte d'un formulaire :
Dim strCP As String, sngCA as Single
strCP = Forms!frmSaisieValeurs![Code postal]
sngCA = Forms!frmSaisieValeurs![CA minimum]
DoCmd.OpenForm "frmClients", acNormal, ,
"[Code postal]='" & strCP & "' AND CA>" & sngCA

On a supposé que le formulaire de saisie s'appelait frmSaisieValeurs, et que les 2 zones de saisies (zones de texte) s'appelaient Code postal et CA minimum.

 
Vous croyiez que c'était fini ? Mais avez vous pensé aux dates ? Dim dtDebut As Date, dtFin As Date
dtDebut = Forms!frmSaisieValeurs![Date Début]
dtFin = Forms!frmSaisieValeurs![Date Fin]
DoCmd.OpenForm "frmClients", acNormal, ,
"
[Dernier contact] BETWEEN " & DateUS(dtDebut) & "
AND " & DateUS(dtFin)

Lorsque vous travaillez en VBA ou SQL (en programmation en général), les dates Access sont au format #mm/jj/aaaa#. Pour éviter de faire cette conversion à chaque fois (ça va vous arriver souvent !), utilisez la fonction DateUS() proposée dans le "grenier" du site. La syntaxe devient - un peu - plus simple.

Si vous souhaitez quelques compléments sur les variantes possibles, consultez également la fiche Clause WHERE en SQL.

 

Début de page L'instruction OpenReport

Après ce qui précède, le OpenReport va vous paraître facile ! La syntaxe pour ouvrir un état est :

DoCmd.OpenReport "Nom de l'état", type d'ouverture, "nom du filtre", "condition Where"
  • Nom de l'état : le nom de l'état, tel qu'il apparaît dans la fenêtre de base de données.
  • Type d'ouverture : une constante Access qui indique comment ouvrir l'état (en général, cette valeur sera acViewPreview pour un aperçu, acViewNormal pour une impression directe).
  • Nom du filtre : rarement utilisé (on préférera la condition Where, ci-après)
  • Condition Where : il s'agit d'une condition permettant de filtrer l'état.

Vous pouvez reprendre tous les exemples ci-dessus en remplaçant OpenForm par OpenReport et frmClients par rptClients (le nom de votre état).

 << 5. Un formulaire "Mot de passe" générique [ Sommaire ] 7. Exécuter une action à une heure précise >> 
Cette section vous intéresse ? Abonnez-vous ! Hit-Parade  

 

 
Notions de base
Jargon Access :o)
Syntaxe SQL
Programmation ASP
Scripting Runtime

Le Grenier [FAQ Access]
Les tutoriaux Self-Access
Les Assistants Access

Les livres sur Access !

Cliquez sur un ouvrage
pour plus de détails

 
 
Forums Access
Abonnement gratuit
Télécharger...
 
 
Le saviez-vous ?
Dans Access 2000, la correction automatique de noms provoque la perte de mise en page des états. Désactivez-la dans Outils/Options...

A demain pour une nouvelle astuce !