Certes, mais si on veut ajouter des contrôles, le sous-formulaire en tant qu'objet formulaire doit exister, même si il est vide à l'origine.Je ne comprends pas, on n'est pas obligé de renseigner un objet source dans un formulaire
Certes, mais si on veut ajouter des contrôles, le sous-formulaire en tant qu'objet formulaire doit exister, même si il est vide à l'origine.Je ne comprends pas, on n'est pas obligé de renseigner un objet source dans un formulaire
Quelle (s) modification (s) faire dans mon code pour intégrer une source ou un contrôle ?
pourquoi ne pas créer manuellement un formulaire vide ? Il pourrait servir de modèle aux autres sous-formulaires, d'ailleurs et dans ce cas, il est possible de le dupliquer avec Docmd.CopyObject
bonjour,
il faut charger l'objet source du contrôle en VBA, quelque chose comme :
Code : Sélectionner tout - Visualiser dans une fenêtre à part NomSousFormulaire.SourceObject = "NomduFormulaireCréé"
Merci
J'y suis presque, je te tiens informé
Bonjour,
J’ai donc réussi à créer toute la structure de mes formulaires, onglets et sous formulaires associés.
Mais je bloque toujours sur le positionnement du sous formulaire afin de pouvoir gérer mes controls.
Existe t il une commande permettant de connaître le chemin complet d’acces au sous formulaire ?
bonsoir,
en général j'utilise la fenêtre des variables locales de VBA, mais ce n'est pas forcément facile d'y arriver du premier coup surtout si on ne connait pas le fonctionnement.
Si cela peut t'avancer voici le chemin jusqu'à un contrôle du sous formulaire:
Code : Sélectionner tout - Visualiser dans une fenêtre à part Forms("NomFormulaire").NomOnglet.Pages("NomPage").Controls.("NomSousFormulaire").Form.[NomControle]
Bonsoir,
J’ai finalement utilisé la fenêtre des variables locales, ce qui m’a permis de comprendre certaines choses et surtout de régler mon problème
Toute ma structure formulaire/onglet/sous formulaire est opérationnelle, je n’ai plus qu’à créer mes champs
Merci encore pour ton aide
Bonjour,
Je croyais pourtant avoir compris mais ...
Voici la structure de mon "je ne sais même plus comment l'appeler"
toutes les saisies et consultations se font sur le sous-formulaire "sf_Projet_1_1"
J'ai tenté la syntaxe suivante pour créer mes TextBox sur le sous-formulaire mais je me fais jeter à chaque fois avec le message 438 "Propriété ou méthode non géré par cet objet"
Une idée de ce qui ne va pas ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 set ctl = Forms("DevisC_bis").Onglet_Activite.Controls("sf_projet_1").form.Onglet_projet.Controls("sf_projet_1_1").form
Merci d'avance
bonsoir,
je suis désolé mais pour moi, une ligne de code ne suffit pas à établir un diagnostic, c'est comme emmener un morceau d'une voiture chez un garagiste pour qu'il trouve pourquoi elle est en panne ...
Peut-on voir au moins la déclaration de ctl ? car à priori, tu essaies d'y affecter un objet formulaire
PS: un onglet dans un autre onglet, je n'avais jamais encore vu ...
Bonjour,
ci-joint le code complet.
Comme expliqué, je coince lorsque je veux commencer à remplir mes sous-formulaires avec des TextBox ( à la fin du module, juste avant l'appel de la procédure GesAction)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222 Sub GesForm() Dim strSql As String Dim dbBdeD As Database Dim rstCurseur As Recordset Dim sNomFormulaire As Variant Dim sNomFormulaire2 As Variant Dim sNomOnglet_L1 As Variant Dim sNomOnglet_L2 As Variant Dim sNomSFormulaire As Variant Dim Chemin Dim ctl As Control Dim ctl1 As Control Dim ctl2 As Control Dim ctl3 As Control Dim ctlPages As Page Dim ctlPages1 As Page Dim ctlTextBox As TextBox Dim ctlCurrent As Control Dim Largeur As Single Dim Hauteur As Single Dim haut As Single Dim gauche As Single Dim Def_Activite() ' 1 : Id_Onglet ' 2 : Nom_Onglet ' 3 : Date_debut_Onglet ' 4 : Date_fin_Onglet ' 5 : Flag_MAJ Dim Def_Pages(20, 5) ' 1 : Id Page ' 2 : Nom Page ' 3 : Index Page Dim Def_Domaine() ' 1 : Id_Domaine ' 2 : Id Type Activité ' 3 : Domaine ' 4 : LibDomaine ' 5 : Date_debut_Onglet ' 6 : Date_fin_Onglet ' 7 : Flag_MAJ Dim Nb_Domaine As Integer ' Dim Last_Index As Integer Dim Nb_Activite As Integer Dim Nb_Onglet_init As Integer Dim Nb_Pages As Integer Dim Num_Onglet As Integer Dim Num_Onglet1 As Integer Dim cas_trt As Integer Dim x As String Dim y Dim z Dim i_activite As Integer Dim i_pages As Integer Dim Nom_Page As String Dim num_page As Integer Dim cible As Control Dim destination As Variant Dim cptPages As Integer Call zz_Routine.conversion(32.085, Largeur) Call zz_Routine.conversion(32.614, Hauteur) Call zz_Routine.conversion(4.19, haut) Call zz_Routine.conversion(0.55, gauche) sNomFormulaire = "DevisC_bis" sNomOnglet_L1 = "Onglet_Activite" DoCmd.OpenForm sNomFormulaire, acDesign, , , , acHidden Set dbBdeD = CurrentDb VG_Chemin_DB = CurrentProject.FullName '========================================================================================= ' Etape 1 : Gestion des l'onglet dans le formulaire principal (Type d'activité) '========================================================================================= Set ctl = Forms(sNomFormulaire)!Onglet_Activite ' Chargement en table de tous les onglets en paramètre ReDim Def_Activite(20, 5) Call zz_GesForm.GesActivite(Def_Activite(), Nb_Activite) Set ctl = Forms(sNomFormulaire).Controls(sNomOnglet_L1) ' ' Chargement des activités identifiées dans la table tbTypeActivite" ' ' Last_Index = 0 With ctl For Num_Onglet = 0 To .Pages.Count - 1 Def_Pages(Num_Onglet, 1) = Right(.Pages(Num_Onglet).Name, 1) ' Def_Pages(Num_Onglet, 1) = Left( _ ' Right(.Pages(Num_Onglet).Name, InStr(1, .Pages(Num_Onglet).Name, ")") - InStr(1, .Pages(Num_Onglet).Name, "(")), _ ' InStr(1, x, ")") - 1) Def_Pages(Num_Onglet, 2) = .Pages(Num_Onglet).Name Def_Pages(Num_Onglet, 3) = Num_Onglet ' Last_Index = Num_Onglet Next Num_Onglet ' ' Traitement parallèle des 2 tables i_activite = 0 i_pages = 0 Call zz_GesForm.GesAnalyse(Def_Activite(), Def_Pages(), Nom_Page, num_page, i_activite, i_pages, cas_trt, sNomFormulaire, sNomOnglet_L1, 1, ctl) End With ' ' Traitement des pages de niveau 2 ' With ctl Set cible = Forms(sNomFormulaire).Controls(sNomOnglet_L1) Num_Onglet = 0 For Each ctlPages In cible.Pages ctlPages.Name = Def_Activite(Num_Onglet, 2) & "_" & Def_Activite(Num_Onglet, 1) Nom_Page = Def_Activite(Num_Onglet, 2) & "_" & Def_Activite(Num_Onglet, 1) ' création d'un sous-formulaire dans lequel sera déposé les onglets de chaque domaine Set ctl1 = CreateControl(sNomFormulaire, acSubform, acDetail, Nom_Page, , gauche, haut, Largeur, Hauteur) With ctl1 ' .Name = "sf_" & Nom_Page & "S" .Name = "sf_" & Nom_Page ' .SourceObject = "sForm_" & Nom_Page .SourceObject = "sf_" & Nom_Page z = .Name End With ' sNomFormulaire2 = "sForm_" & Nom_Page sNomFormulaire2 = "sf_" & Nom_Page ReDim Def_Domaine(20, 7) Call zz_GesForm.GesDomaine(Def_Activite(Num_Onglet, 1), Def_Domaine(), Nb_Domaine) ' création des onglets "Domaine" Set ctl1 = CreateControl(sNomFormulaire2, acTabCtl, acDetail, , , 1, 1, Largeur, Hauteur) With ctl1 .Name = "Onglet_" & Nom_Page .FontName = "Tahoma" .FontSize = 8 sNomOnglet_L2 = .Name ' ' création d'un sous-formulaire sur chacune des pages Domaine ' For Num_Onglet1 = 0 To .Pages.Count - 1 Def_Pages(Num_Onglet1, 2) = .Pages(Num_Onglet1).Name Def_Pages(Num_Onglet1, 3) = Num_Onglet1 Next Num_Onglet1 i_activite = 0 i_pages = 0 Call zz_GesForm.GesAnalyse(Def_Domaine(), Def_Pages(), Nom_Page, num_page, i_activite, i_pages, cas_trt, sNomFormulaire2, sNomOnglet_L2, 2, ctl1) cptPages = 0 For Each ctlPages1 In ctl1.Pages ctlPages1.Name = Def_Domaine(cptPages, 4) Set ctl2 = CreateControl(sNomFormulaire2, acSubform, acDetail, Def_Domaine(cptPages, 4), , 1, 1, Largeur, Hauteur) With ctl2 .Name = "sf_" & Def_Activite(Num_Onglet, 2) & "_" & Def_Domaine(cptPages, 2) & "_" & Def_Domaine(cptPages, 1) .SourceObject = "sf_" & Def_Activite(Num_Onglet, 2) & "_" & Def_Domaine(cptPages, 2) z = .Name End With '------------------------------------------------------------------------------------------------------------------------------------------------------- ' Remplissage de la forme ' c'est là où ça coince Set ctl3 = Forms(sNomFormulaire).Onglet_Activite.Controls("sf_projet_1").Form.Onglet_Projet.Controls("sf_projet_1_1").Form With ctl3 While .Controls.Count <> 0 DeleteControl .Name, .Controls(0).Name Wend Set ctlTextBox = CreateControl(sNomFormulaire22, acTextBox, acDetail, , "", 10, 10, 100, 100) With ctlTextBox .Format = ("dd/mm/yyyy") .Enabled = False .Visible = False .Locked = True ' .Name = "Screen_Date" .ControlSource = "=#" & Date & "#" .BorderColor = RGB(0, 0, 0) End With '------------------------------------------------------------------------------------------------------------------------------------------------------- Call zz_GesForm.GesAction(ctl2, sNomFormulaire2, Def_Domaine(cptPages, 1)) End With cptPages = cptPages + 1 Next ctlPages1 End With Num_Onglet = Num_Onglet + 1 Next ctlPages End With Set ctl = Nothing Fin: ' Fermeture du formulaire ' DoCmd.Close acForm, sNomFormulaire, acSaveYes ' Réouverture du l'onglet dans le formulaire principal ' Me.[Onglet-Config].SourceObject = sNomFormulaire Set ctlTextBox = Nothing End Sub
bonjour,
Je ne connais pas bien la syntaxe de création de contrôles en mode programmé mais je pense qu'il faut enlever le .Form à la fin de l'instruction, car il ne s'agit pas de l'objet formulaire mais du sous-formulaire en tant que contrôle dans l'onglet :
Code : Sélectionner tout - Visualiser dans une fenêtre à part Set ctl3 = Forms(sNomFormulaire).Onglet_Activite.Controls("sf_projet_1").Form.Onglet_Projet.Controls("sf_projet_1_1").Form
Merci pour ce retour, je vais tester cette solution.
Question subsidiaire : qu'elle serait la syntaxe avec toutes les informations formulaire/onglet/sous-formulaire en paramètre ?
bonjour,
désolé mais je n'ai pas compris le fondement de la question.
Il faudrait un exemple de la fonction à créer.
Mais sinon, le principe d'utilisation de paramètre obéit à un standard que tu dois connaître, à savoir: définition du type de l'objet utilisé avec As
Bonjour,
Désolé, je me suis mal exprimé
Je faisais reference à cette fonction : Set ctl3 = Forms(sNomFormulaire).Onglet_Activite.Controls("sf_projet_1").Form.Onglet_Projet.Controls("sf_projet_1_1")
pas plus compris, c'est même pire ...
ce n'est pas une fonction mais une instruction qui affecte une valeur à une variable objet et je ne vois pas ce que je peux en dire de plus ...
Bonjour,
Set ctl3 = Forms("DevisC").Onglet_Activite.Controls("sf_projet_1").Form.Onglet_Projet.Controls("sf_projet_1_1") = Instruction comprenant des éléments statiques.
Si je passe en dynamique, je remplace
Est ce que la syntaxe devient
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 "DevisC" par sNomFormulaire "Sf_projet_1" par sNomSFormulaire1 "Sf_projet_1_1" par sNomSFormulaire2 "Onglet_Activite" par Onglet "Onglet_Projet" par Onglet2
Set ctl3 = Forms(sNomFormulaire).Onglet1.Controls(sNomSFormulaire1).Form.Onglet2.Controls(sNomSFormulaire2)?
bonsoir,
non, car tous ces objets sont des contrôles du formulaire principal et on ne peut pas déclarer directement les variables avec du type String.Est ce que la syntaxe devient
Set ctl3 = Forms(sNomFormulaire).Onglet1.Controls(sNomSFormulaire1).Form.Onglet2.Controls(sNomSFormulaire2)?
Voici le plus simple, à mon sens :
Là encore il faut y aller pas à pas et utiliser la fenêtre des variables locales.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 Dim sNomFormulaire As Form Dim Onglet1 As Control Set sNomFormulaire = Forms("DevisC") Set Onglet1 = sNomFormulaire.Controls("Onglet_Activite") Dim sNomSFormulaire1 As Control Dim Onglet2 As Control Set sNomSFormulaire1 = sNomFormulaire.Controls("Sf_projet_1") Set Onglet2 = sNomSFormulaire1.Form.Controls("Onglet_projet") Dim sNomSFormulaire2 As Control Set sNomSFormulaire2 = sNomSFormulaire1.Form.Controls("Sf_projet_1_1") Dim ctl3 As Control Set ctl3 = sNomSFormulaire2
Bonjour,
Merci pour ton aide
Maintenant, mes sous-formulaires s'affichent bien et j'arrive à les remplir correctement.
Le problème venait en fait de mon sous-formulaire pour lequel je n'avais pas affecté la bonne source (Objet source dans la feuille de propriété)
C'est en testant ta dernière recommandation que j'ai repéré cette anomalie
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager