Creer dynamiquement un formulaire

Soyez le premier à donner votre avis sur cette source.

Snippet vu 22 459 fois - Téléchargée 35 fois

Contenu du snippet

Cette fonction permet de créer un formulaire dynamique et de le mettre en page, d'ajouter aussi des évenements, ... il est conseillé d'utiliser un formulaire existant au lieu de créer un nouveau formulaire parce que Access aura du mal dans le cas de la création d'un nouveau formulaire à voir ce formulaire récemment crée. Dans cet exemple nous utilisons un formulaire existant soit "F_AFFICHAGE" que nous modifions à notre guise.

Source / Exemple :


Public Function create_form(sql As String) As Boolean
Dim frm As Form
Dim rst As Recordset
dim ctl as control
dim i, j as integer
' --Ouvrir le formulaire en mode modification et caché
DoCmd.OpenForm "F_AFFICHAGE", acDesign
, , , , acHidden
' --suppression de tous les contrôles avant de les créer de nouveau
For Each ctl In Forms!F_AFFICHAGE.Controls
        ctl.DeleteControl "F_AFFICHAGE", ctl.Name
Next ctl
' --Source de données de mon formulaire
Forms![F_AFFICHAGE].RecordSource = sql
Set rst = Currentdb.OpenRecordset(sql)  
' --nous ne pensons pas que vous aurez plus de 100 contrôles
Dim controle(1 To 100) As Control
' --Création des contrôles
If rst.RecordCount <> 0 Then
    i = 1
    j = 1000
    While i < rst.Fields.Count
    ' -- Créer le contrôle i
    Set controle(i) = CreateControl("F_AFFICHAGE", acTextBox)
    ' --lui affecter un nom
    controle(i).Name = "TXT_" & rst.Fields(i).Name
    ' --le positionner sur le formulaire
    controle(i).Left = 100 + j
    ' --Définir sa largeur
    controle(i).Width = 1150
    ' --Définir sa couleur de fond
    controle(i).BackColor = "14742270"
    ' --Définir son effet visuel
    controle(i).SpecialEffect = 0
    controle(i).BackStyle = 0
    controle(i).BorderStyle = 1
    ' --source de données de ce contrôle
    controle(i).ControlSource = rst.Fields(i).Name
    i = i + 1
    j = j + 1150
    Wend
End If
' --Création des entêtes
j = 1000
i = 1
While i < rst.Fields.Count
        Set controle(i) = CreateControl("F_AFFICHAGE", acTextBox, acHeader)
        controle(i).Name = "HD_" & rst.Fields(i).Name
        controle(i).Left = 100 + j
        controle(i).Width = 1150
        controle(i).Height = 700
        controle(i).BackColor = "10081789"
        controle(i).SpecialEffect = 0
        controle(i).BorderStyle = 1
        controle(i).TextAlign = 2
        controle(i).FontWeight = 700
        controle(i).ControlSource = "='" & rst.Fields(i).Name & "'"
        i = i + 1
        j = j + 1150
Wend
rst.close
set rst = Nothing
' --Sauvegarder le formulaire
DoCmd.Save acForm, "F_AFFICHAGE"
End Function

A voir également

Ajouter un commentaire Commentaires
Messages postés
2
Date d'inscription
samedi 14 octobre 2006
Statut
Membre
Dernière intervention
29 octobre 2011

merci
Messages postés
14
Date d'inscription
jeudi 16 mars 2006
Statut
Membre
Dernière intervention
31 mai 2006

Autres remarque le count des fields en VBA n'est pas le même que celui des controles
Les controles commencent bien à 1 d'ou le i = 1
par contre dans un recordset (rst) le count commence à 0 donc i-1 dans ce cas-ci
controle(i).Name = "TXT_" & rst.Fields(i-1).Name
Messages postés
14
Date d'inscription
jeudi 16 mars 2006
Statut
Membre
Dernière intervention
31 mai 2006

Petites incoherences dans le code
il faut insérer l'égalité aussi sinon il manquera toujours un champs au formulaire
While i <= rst.Fields.Count
Messages postés
75
Date d'inscription
vendredi 10 mars 2006
Statut
Membre
Dernière intervention
23 août 2006

Bonjour,
Je crée une interface utilisateur sur VBA Access et je souhaite dans un formulaire (Form1)créer un sous-formulaire (Form2) affichant les données d'une requête. Je me suis servie de ce code pour créer le sous-formulaire, et ça marche plutôt bien, avec quelques modifications :

' --suppression de tous les contrôles avant de les créer de nouveau
boucle:
i = 0

For Each ctl In Forms!F_AFFICHAGE.Controls
i = 1
DeleteControl "F_AFFICHAGE", ctl.Name
Next ctl

While i = 1
GoTo boucle:
Wend

ET

' --nous ne pensons pas que vous aurez plus de 100 contrôles
Dim controle(0 To 100) As Control


J'ai juste un petit problème: avec ce code, mon sous-formulaire (Form2) serait défini par défaut en mode création (je n'ai pas identifié le pourquoi du comment!) ce qui empêche donc l'ouverture du formulaire (Form1) en mode formulaire.

Si vous savez comment régler ce problème...

à bientôt
Messages postés
71
Date d'inscription
vendredi 13 septembre 2002
Statut
Membre
Dernière intervention
9 mars 2009

Salut amigos,
Ce code est une vraie aubaine.
J'ai eu la même difficulté que la personne précédente en fait.
Sinon, j'aimerais savoir comment créer objets (différents des texbox) qui soient en fonction des types de valeurs qu'il charge de la base (par exemple une checkbox si il trouve du bouléen...).
J'ai peut être un début de solution, mais c'est pas tellement satisfaisant à ce qu'il me semble.
Qu'en dites vous ?
A bientôt.
Marco.
Afficher les 12 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.