<Retour Grenier>

Début de page Question

Les instructions 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 Réponse

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.

 

L'instruction OpenForm

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 :

 

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.

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

 

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"

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