0/5 (12 avis)
Snippet vu 23 733 fois - Téléchargée 37 fois
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
29 oct. 2011 à 14:52
3 mai 2007 à 17:36
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
3 mai 2007 à 17:28
il faut insérer l'égalité aussi sinon il manquera toujours un champs au formulaire
While i <= rst.Fields.Count
3 mai 2006 à 10:27
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
18 mai 2005 à 11:08
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.
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.