FAQ MS-AccessConsultez toutes les FAQ

Nombre d'auteurs : 140, nombre de questions : 926, dernière mise à jour : 30 mars 2017 

 
OuvrirSommaireFormulaires

Dans le Tutoriel de recherche multicritère, cafeine, vous montre comment implémenter cette fonction indispensable qui rendra vos applications réellement productives.

Créé le 23 août 2003  par cafeine

Lien : Tutoriel de recherche multicritère

Menu Outils/Démarrage et le menu déroulant Afficher le formulaire.

Créé le 1er avril 2003  par Team Access

À partir d'Access 2000 vous pouvez faire :

 
Sélectionnez
currentproject.AllForms("NomDuForm").IsLoaded

Sinon :

il suffit de mettre ce code dans un module :

 
Sélectionnez
Function IsLoaded(ByVal strFormName As String) As Integer 
 ' Retourne True si le formulaire spécifié est ouvert.
    
    Const conObjStateClosed = 0
    Const conDesignView = 0
    
    If SysCmd(acSysCmdGetObjectState, acForm, strFormName) <> conObjStateClosed Then
        If Forms(strFormName).CurrentView <> conDesignView Then
            IsLoaded = True
        End If
    End If
End Function

Autre solution :

 
Sélectionnez
Public Function is_form_opened(fname As String) As Boolean 

On Error GoTo not_opened
Dim LeFichier As String

LeFichier = Forms(fname).Name
is_form_opened = True
Exit Function

not_opened: If (Err.Number = 2450) Then
     is_form_opened = False
     err.clear
End If

End Function
Mis à jour le 10 mai 2005  par Etienne Bar

Un formulaire peut devenir pénible à utiliser car la molette de la souris fait défiler les enregistrements.

Cette solution fonctionne pour MS Access 2000 et 2003. (Si vous avez testé pour d'autres versions n'hésitez pas à nous le faire savoir.)
Il arrive cependant que l'erreur "nom ambigu détecté" se manifeste pour les versions 2002 et ultérieures. Référez-vous dans ce cas au tutoriel dont le lien est en bas de cet article.

1re étape

Ouvrir un module VBA, aller dans Outils/Références, cliquer sur Parcourir et localiser la dll MouseWheel.dll puis cliquer sur Ouvrir. Cela permet d'enregistrer la dll dans les Références Access.

2e étape

Mettre le code suivant dans chaque formulaire qui requiert un contrôle de la roulette de la souris.

 
Sélectionnez
   ' Déclaration dans chaque formulaire après Option Explicit et Option Compare Database
Private WithEvents clsMouseWheel As MouseWheel.CMouseWheel

 ' Procédure à ajouter dans chaque formulaire
Private Sub clsMouseWheel_MouseWheel(Cancel As Integer)
    Cancel = True
End Sub

Private Sub Form_Load()
        ' Code à ajouter dans l'événement chargement de chaque formulaire   
    Set clsMouseWheel = New MouseWheel.CMouseWheel
    Set clsMouseWheel.Form = Me
    clsMouseWheel.SubClassHookForm
End Sub

Private Sub Form_Close()
    ' Code à ajouter dans l'événement fermeture de chaque formulaire
    If Not (clsMouseWheel Is Nothing) Then
        clsMouseWheel.SubClassUnHookForm
        Set clsMouseWheel.Form = Nothing
        Set clsMouseWheel = Nothing
    End If
End Sub

Pour plus d'information, voir le site de Microsoft.

Télécharger la DLL.

Créé le 1er avril 2004  par Frank

Lien : Gestion de la roulette de la souris dans les formulaires

Cela signifie que la requête source du formulaire ne retourne aucun résultat et que l'ajout est interdit. Il suffit donc de modifier les propriétés ou de prévoir ce cas.

Créé le 1er avril 2004  par MashiMaro
 
Sélectionnez
DoCmd.OpenForm "NomFormulaire", acFormDS ...
Créé le 1er avril 2004  par Gandalf24
 
Sélectionnez
Call Form_NomDuSousForm.Champ_AfterUpdate

Il faut que la sub (ici Champ_AfterUpdate) soit déclarée comme Public :

 
Sélectionnez
Public Sub Champ_AfterUpdate()
    'Code à exécuter
    ....
End Sub
Créé le 1er avril 2004  par STEF_1, Tofalu

Il faut utiliser la commande DoCmd.OpenForm :

Aide Access (f1) :

DoCmd.OpenForm nomformulaire[, affichage][, nomfiltre][, conditionwhere][, modedonnées][, modefenêtre][, openargs]

C'est la condition Where (" conditionwhere ") qu'il faut modifier.

Si on veut ouvrir en fonction de la valeur d'un contrôle d'un autre formulaire :

 
Sélectionnez
"[nom_champ] =" & Forms![nom_formulaire]![nom_contrôle dans autre formulaire]

Si on veut ouvrir en fonction de la valeur d'un contrôle du formulaire en cours :

 
Sélectionnez
"[nom_champ] =" & Me.[MonControle]
Créé le 12 mai 2004  par Demco, Tofalu

Lien : Comment inclure des champs d'un formulaire dans une requête ?
Lien : Pourquoi ma requête ne fonctionne-t-elle pas selon le type des variables qu'elle utilise ?

Il y a deux cas possibles.

On veut fermer le formulaire sur lequel on est :

 
Sélectionnez
DoCmd.Close

On veut fermer un autre formulaire :

 
Sélectionnez
DoCmd.Close acForm, "F_MonForm"
Créé le 12 mai 2004  par Demco

Propriété du formulaire Menu contextuel à non.

Ou bien en passant par le code :

 
Sélectionnez

Me.ShortcutMenu = False
Mis à jour le 15 novembre 2005  par Maxence HUBICHE, Demco

Lien : Comment interdire l'utilisation du clic droit de la souris sur un contrôle ?

Vous pouvez écrire du code dans un module et l'appeler depuis vos formulaires.

Exemple :
Dans un module écrivez le code suivant :

 
Sélectionnez
Sub MonMessage(txt As String)
    MsgBox txt
End Sub

Puis dans votre formulaire, écrivez simplement :

 
Sélectionnez
MonMessage "coucou"

Fonctionne pareillement avec les fonctions.

Créé le 3 septembre 2004  par Demco

Oui, à condition d'afficher les sous-formulaires en mode feuille de données.

Mis à jour le 15 mai 2011  par Etienne Bar
 
Sélectionnez
Forms!Form2!MonContrôle.SetFocus 

ou

 
Sélectionnez
DoCmd.SelectObject acForm, Form2, False  
Créé le 25 octobre 2004  par FRED.G
 
Sélectionnez
Private Sub Form_Unload(Cancel As Integer)
If MsgBox("Êtes-vous certain ?", vbYesNo) = vbNo Then Cancel = True
End Sub
Créé le 25 octobre 2004  par MC2
 
Sélectionnez
Forms!NomAutreForm.NomSub

Note : il faut que la procédure soit déclarée en Public Sub :

 
Sélectionnez
Public Sub NomSub()
    ' Code à exécuter
    ....
End Sub
Créé le 25 octobre 2004  par FRED.G

Lien : Comment déclencher un événement par le code ?

Pour exécuter ce code, il faut activer la référence : Microsoft DAO 3.x Object Library.

Tout d'abord, il faut que les colonnes soient ordonnées dans le même ordre que la présentation des champs dans la requête.

Si on a :

 
Sélectionnez
Select Nom, Prenom From Table

Il faut que la première colonne soit nom, la seconde prenom.

Ensuite dans le code du formulaire, coller la fonction suivante :

 
Sélectionnez
Private function Cells(Ligne as integer,Colonne as integer) as string
On error goto err
Dim R as dao.recordset
set r=me.recordsetclone
r.movefirst
While Ligne>0
r.movenext
ligne=ligne-1
Wend
Cells=R.fields(Colonne).value
err:
End Function


On accède à une cellule avec une syntaxe de cette forme :

 
Sélectionnez
MsgBox Cells(3,4)

N.B. Les indices commencent à 0. (La première colonne a pour numéro 0 et idem pour la première ligne.)

Si toutefois, vous ne voulez pas ordonner les colonnes comme les champs, cela donnera :

 
Sélectionnez
Private function Cells(Ligne as integer,Colonne as string) as string
On error goto err
Dim R as dao.recordset
set r=me.recordsetclone
r.movefirst
While Ligne>0
r.movenext
ligne=ligne-1
Wend
Cells=R.fields(Colonne).value
err:
End Function

Et au lieu du numero de la colonne, on passera son nom :

 
Sélectionnez
MsgBox Cells(2,"Nom")
Créé le 10 mai 2005  par Tofalu

Lien : Définition et manipulation de données avec DAO par Tofalu
Lien : Comment déclarer une référence dans MS Access ?

Le contrôle ActiveX Microsoft Web Browser vous permet de faire cela.

Créé le 20 novembre 2005  par Tofalu
 
Sélectionnez

DoCmd.GoToRecord acDataForm, Me.name, acNewRec
Créé le 20 novembre 2005  par cafeine

En VBA :

 
Sélectionnez
Me.Caption = "Nouveau nom du formulaire"
Créé le 3 septembre 2004  par Drosera

Vous pouvez modifier le paramètre Orientation de l'objet Printer depuis Access 2002.

 
Sélectionnez

DoCmd.OpenForm "F_AFFICHAGE"
Forms("F_AFFICHAGE").Printer.Orientation = acPRORLandscape
DoCmd.PrintOut
DoCmd.Close acForm, "F_AFFICHAGE"
Créé le 29 novembre 2006  par Arkham46

Pour exécuter ce code, il faut activer la référence : Microsoft DAO 3.x Object Library.

Vous pouvez vous inspirer de cet exemple. Attention, si la description n'a pas été renseignée, la propriété n'existe pas.

 
Sélectionnez
Public Function GetDescForm(strFormName As String) As String
Dim oDb As DAO.Database
Set oDb = CurrentDb
GetDescForm = oDb.Containers("Forms").Documents(strFormName).Properties("Description")
End Function

Sub test()
MsgBox GetDescForm("Formulaire1")
End Sub
Créé le 29 novembre 2006  par Tofalu

Lien : Définition et manipulation de données avec DAO par Tofalu
Lien : Comment déclarer une référence dans MS Access ?

Pour exécuter ce code, il faut activer la référence : Microsoft DAO 3.x Object Library.

 
Sélectionnez
Public Function GetDateUpdatedForm(strFormName As String) As Date
Dim oDb As DAO.Database
Set oDb = CurrentDb
GetDateUpdatedForm = oDb.Containers("Forms").Documents(strFormName).LastUpdated
End Function

Sub test()
MsgBox GetDateUpdatedForm("Formulaire1")
End Sub

Attention, un bogue est recensé sous Access 2000 : LastUpdated retourne la date de création du formulaire.

Créé le 29 novembre 2006  par Tofalu

Lien : Définition et manipulation de données avec DAO par Tofalu
Lien : Comment déclarer une référence dans MS Access ?

Il faut parcourir la collection Forms de l'application.

 
Sélectionnez

Public Sub CloseAllForms()
Do WHILE Forms.Count
    Docmd.Close acForm, Forms(0).Name
Loop
End Sub
Créé le 29 novembre 2006  par Papy Turbo

Lien : Comment fermer un formulaire en VBA ?

Le code suivant permet de trier l'affichage d'un formulaire tabulaire en cliquant sur l'étiquette d'une colonne.
Si l'orde est de A->Z lors du clic, l'ordre passe de Z->A et vice-versa

 
Sélectionnez
Global gBol as Boolean

Private Sub MonEtiquette_Click()
    Me.OrderByOn = True
    If gBol = False Then
        Me.OrderBy = "MaColonne asc"
        gBol = True
    Else
        Me.OrderBy = "MaColonne desc"
        gBol = False
    End If
 
End Sub
Créé le 14 octobre 2007  par kloun

Pour modifier la propriété Description d'un formulaire,
il faut accéder à l'objet en DAO via la collection containers et l'objet document.

L'exemple suivant insère la date et l'heure courante dans la propriété Description du formulaire "MonFormulaire"

Il faut ajouter la référence : Microsoft DAO 3.x Object Library.

 
Sélectionnez
Sub ecrireDecr()
On Error GoTo err
' Script qui affecte la date et l'heure à la propriété Description
' d'un formulaire
Dim oDb As DAO.Database
Dim oDoc As DAO.Document
Set oDb = CurrentDb
Set oDoc = oDb.Containers("Forms").Documents("MonFormulaire")
oDoc.Properties("Description") = Now
 
fin:
Exit Sub
 
err:
Select Case err.Number
    Case 3270 ' Si la propriété n'existe pas, la créer
        With oDoc
            .Properties.Append .CreateProperty("Description", dbText, Now)
            .Properties.Refresh
        End With
    Case Else
        err.Raise err.Number
End Select
Resume fin
End Sub
Créé le 14 octobre 2007  par Tofalu

Il suffit de mettre votre code dans l'événement Sur Activation de votre sous-formulaire.

Créé le 14 octobre 2007  par Faw

Ce code permet de tester, toutes les secondes, si le focus s'est déplacé ou si une touche a été enfoncée. Si ce n'est pas le cas, on incrémente de une seconde un compteur. Lorsque celui-ci atteint un seuil paramétré au départ, on affiche un message signalant la non-activité. On pourrait s'inspirer de ce code pour prendre d'autres actions telles que fermer le formulaire, fermer la base de données…

Voici le code du module du formulaire testé :

 
Sélectionnez
Option Compare Database

Public ExpiredTime
'

Sub Form_Timer()
' IDLEMINUTES détermine le temps d'inactivité avant de déclencher la procédure d'alerte.
         
         Const IDLEMINUTES = 0.05  'correspond à 3 secondes (5/100 de 60 secondes)
 
         Static PrevControlName As String
         Static PrevFormName As String
 
         Dim ActiveFormName As String
         Dim ActiveControlName As String
         Dim ExpiredMinutes

         On Error Resume Next
 
         ' Capte le formulaire actif et le nom du contrôle
 
         ActiveFormName = Screen.ActiveForm.Name
         If Err Then
            ActiveFormName = "No Active Form"
            Err = 0
         End If
 
         ActiveControlName = Screen.ActiveControl.Name
            If Err Then
            ActiveControlName = "No Active Control"
            Err = 0
         End If
         
         ' Vérifie ce qui est actuellement actif et réinitialise temps expiration si :
         '    1. Aucun enregistrement d'action encore (code roule pour
         '       la première fois);
         '    2. Les noms précédents sont différents des noms courants
         '       (l'utilisateur a fait une action pendant l'intervalle de temps.
           If (PrevControlName = "") Or (PrevFormName = "") _
           Or (ActiveFormName <> PrevFormName) _
           Or (ActiveControlName <> PrevControlName) Then
            PrevControlName = ActiveControlName
            PrevFormName = ActiveFormName
            ExpiredTime = 0
         Else
            ' ...si non, c'est que l'utilisateur a été inactif pendant ce laps de temps,
            ' dès lors, on incrémente ExpiredTime

            ExpiredTime = ExpiredTime + Me.TimerInterval
         End If
 
         ' Le temps d'inactivité a-t-il dépassé la limite définie (IDLEMINUTES)?
         ExpiredMinutes = (ExpiredTime / 1000) / 60
         If ExpiredMinutes >= IDLEMINUTES Then
            ' ...si oui, on remet le temps d'expiration à 0...
            ExpiredTime = 0
            ' ...et appelle la sous-routine idletimedetected.
            IdleTimeDetected ExpiredMinutes
         End If
End Sub

Sub IdleTimeDetected(ExpiredMinutes)
         Dim Msg As String
         Msg = "Aucune activite "
         Msg = Msg & ExpiredMinutes & " minute(s)!"
         MsgBox Msg, 48
End Sub

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
    If Not IsNull(KeyCode) Then
         ExpiredTime = 0
    End If
End Sub

Const IDLEMINUTES = 0.05 correspond à 3 secondes (pour les besoins de l'exemple).

Modifiez les propriétés du formulaire comme suit :
Aperçu des touches sur OUI ;
Intervalle minuterie = 1000.

Créé le 14 octobre 2007  par DMboup

Pour conserver le changement d'une étiquette après fermeture du formulaire, il faut d'abord l'ouvrir en mode création (acDesign) et caché (acHidden). Ensuite, on modifie le texte de l'étiquette, on sauvegarde le formulaire et on l'ouvre normalement.

 
Sélectionnez
DoCmd.OpenForm NomFormulaire, acDesign, , , , acHidden
    Forms![NomFormulaire]![NomEtiquette].Caption = "Nouvelle légende"
    DoCmd.Close acForm, NomFormulaire, acSaveYes
    DoCmd.OpenForm NomFormulaire

Nota : ne fonctionne pas pour les fichiers mde, ne fonctionne qu'avec des fichiers .mdb.

Créé le 14 octobre 2007  par Lou Pitchoun

Le code suivant permet de redéfinir la hauteur du formulaire en fonction du nombre d'enregistrements :

 
Sélectionnez
Private Sub Form_Load()
Me.InsideHeight = Me.Section(acHeader).Height + Me.Section(acFooter).Height + Me.RecordsetClone.RecordCount * Me.Section(acDetail).Height
End Sub
Créé le 14 octobre 2007  par Arkham46

Ce code permet d'ajuster la taille d'un sous-formulaire en fonction du nombre d'enregistrements qu'il contient.

Sur l'événement SurActivation du formulaire, il suffit de mettre le code suivant :

 
Sélectionnez
Private Sub Form_Current()
Me.LeSousForm.Form.InsideHeight = Me.LeSousForm.Form.Section(acHeader).Height _
     + Me.LeSousForm.Form.Section(acFooter).Height _
     + Me.LeSousForm.Form.Section(acDetail).Height _
         * (Me.LeSousForm.Form.RecordsetClone.RecordCount _
          -  Me.LeSousForm.Form.AllowAdditions)
Me.LeSousForm.Height = Me.LeSousForm.Form.WindowHeight
End Sub

Après, s'il y a des zones de texte en dessous, il suffit de modifier leur position en fonction du sous-formulaire, par exemple :

 
Sélectionnez
Me.LazoneDeTexte.Top = Me.LeSousForm.Top + Me.LeSousForm.Height + AutantDeTwipsQuOnVeut

... et ainsi de suite !





Évolution de micniv

Une évolution pour ce script intéressant :
  • limiter la hauteur du sous-formulaire à n lignes
  • afficher quand nécessaire la barre de défilement vertical
 
Sélectionnez
 Dim objSousForm As Object
    Dim frmSousForm As Form
    Dim nbMaxLignes As Long
 
    ' Vos déclarations
    Set objSousForm = Me!LeSousForm
    Set frmSousForm = objSousForm.Form
    nbMaxLignes = 3     'limite la hauteur à n lignes et affiche la barre de défilement verticale
 
    
    If frmSousForm.RecordsetClone.RecordCount <= nbMaxLignes Then
        frmSousForm.InsideHeight = frmSousForm.Section(acHeader).Height _
                                 + frmSousForm.Section(acFooter).Height _
                                 + frmSousForm.Section(acDetail).Height _
                                 * (frmSousForm.RecordsetClone.RecordCount _
                                  - frmSousForm.AllowAdditions)
        objSousForm.Height = frmSousForm.WindowHeight
        frmSousForm.ScrollBars = 0  'aucune barre de défilement
    Else
        frmSousForm.InsideHeight = frmSousForm.Section(acHeader).Height _
                                 + frmSousForm.Section(acFooter).Height _
                                 + frmSousForm.Section(acDetail).Height _
                                 * (nbMaxLignes - frmSousForm.AllowAdditions)
        objSousForm.Height = frmSousForm.WindowHeight
        frmSousForm.ScrollBars = 2  'barre de défilement verticale
    End If
 
 
    ' Après, s'il y a des zones de texte en dessous, il suffit de
    'modifier leur position en fonction du sous-formulaire,
    'par exemple :
 
    Me.LaZoneDeTexte.Top = objSousForm.Top + objSousForm.Height  + AutantDeTwipsQuOnVeut
 
 
    Set objSousForm = Nothing
    Set frmSousForm = Nothing
Créé le 14 octobre 2007  par The_Super_Steph, micniv
  

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2013 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.