Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > VBA Access
VBA Access Le forum pour les questions relatives au code VBA sous Access, et à son environnement de développement VBE.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 04/04/2011, 13h58   #1
Membre du Club
 
Inscription : août 2008
Messages : 86
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 86
Points : 43
Points : 43
Par défaut Supprimer un certain nombre de contrôles en dynamique

Bonjour,

Je voudrais supprimer un certain nombre de contrôles sur un formulaire de manière dynamique. Pour résumer, l'utilisateur clique sur un bouton "+" et des lignes avec des contrôles apparaîssent, et en cliquant sur "-" je voudrais détruire ces contrôles.

J'ai vu un certain nombre de messages sur cette thématique mais aucun ne répond à mon problème.

En effet, mon code semble fonctionner (je vérifie avec des msgbox par exemple), sauf qu'à la toute fin, access plante, purement et simplement, sans préavis!!
Je vois bien que tous les contrôles ont été supprimés, que la page est redevenue "acNormal", comme souhaité, etc.... Mais access plante.

J'aimerais avoir votre avis sur mon code, et ce qui pourrait faire planter access ! Merci beaucoup


Code :
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
 
Public Function moins_nomen(haut As Long, bas As Long)
 
'Je mets le focus sur un autre contrôle, "au cas ou"
Forms("Formulaire2").Controls("Quitter_nomen_radar").SetFocus
 
DoCmd.OpenForm "Formulaire2", acDesign
 
'On le fait en deux fois pour éviter les bugs : on sélectionne les contrôles à supprimer en leur changeant le nom
i = 1
For j = 1 To Forms("Formulaire2").Controls.Count - 1
 
    If Forms("Formulaire2").Controls(j).Top > haut - 10 And Forms("Formulaire2").Controls(j).Top < bas + 10 Then
        Forms("Formulaire2").Controls(j).Name = "Suppr_" & i
        i = i + 1
    End If
 
Next j
 
'Puis on les supprime
For j = 1 To i - 1
    DeleteControl "Formulaire2", "Suppr_" & j
Next j
 
DoCmd.OpenForm "Formulaire2", acNormal
 
'Et là, le crash surviendra....
 
End Function
Glherbier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/04/2011, 14h52   #2
Membre du Club
 
Inscription : août 2008
Messages : 86
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 86
Points : 43
Points : 43
Je suis sous Access 2003.

Il semble que l'erreur survienne lors de la suppression des contrôles de type Textbox. Pour les autres, la suppression marche...

Code :
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
 
Public Function moins_nomen(haut As Long, bas As Long, id As Long)
 
Dim objcontrol As Control
Dim ctr1 As Control, ctr2 As Control
 
hauteur = 250
largeur = 300
decal_gauche = 50
gauche = 250
decal_haut = 50
largeur_std = 500
 
 
Forms("Formulaire2").Controls("Quitter_nomen_radar").SetFocus
 
DoCmd.OpenForm "Formulaire2", acDesign
 
i = 1
For j = 1 To Forms("Formulaire2").Controls.Count - 1
On Error GoTo suite
If Forms("Formulaire2").Controls(j).Top > haut - 10 And Forms("Formulaire2").Controls(j).Top < bas + 200 Then
 
'Ca plante
    If TypeName(Forms("Formulaire2").Controls(j)) = "Textbox" Then
        DeleteControl "Formulaire2", Forms("Formulaire2").Controls(j).Name
    j = j - 1
    End If
 
'Ca marche
    If TypeName(Forms("Formulaire2").Controls(j)) = "Label" Or TypeName(Forms("Formulaire2").Controls(j)) = "Commandbutton" Then
    DeleteControl "Formulaire2", Forms("Formulaire2").Controls(j).Name
    j = j - 1
    End If
 
Else
 
    If Forms("Formulaire2").Controls(j).Top > bas + 10 Then
        Forms("Formulaire2").Controls(j).Top = Forms("Formulaire2").Controls(j).Top - hauteur - decal_haut - bas + haut
    End If
End If
 
Next j
 
suite:
 
Set ctr_plus = Forms("Formulaire2").Controls("BB_plus_" & id)
ctr_plus.Tag = "0"
 
 
DoCmd.OpenForm "Formulaire2", acNormal
 
End Function
Ces contrôles sont définis comme suit:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
    Set ctr_PN(i) = CreateControl(frm.Name, acTextBox, , "", "", ctr_BB_global(i).Left + ctr_BB_global(i).Width + decal_gauche, haut + (2 * decal_haut) * (i - 1) + hauteur * (i - 1), largeur_std * 3, hauteur)
    ctr_PN(i).Name = "BB_S_PN_" & rst.Fields(0).Value
    ctr_PN(i).DefaultValue = Chr(34) & rst.Fields(5).Value & Chr(34)
    ctr_PN(i).BackStyle = 1
    ctr_PN(i).TextAlign = 2
    ctr_PN(i).OnExit = "=recherche_PN_nomen(" & rst.Fields(0).Value & "," & Chr(34) & Chr(34) & ", 1)"
    ctr_PN(i).BackColor = couleur
 
    Set ctr_Q(i) = CreateControl(frm.Name, acTextBox, , "", "", ctr_PN(i).Left + ctr_PN(i).Width + decal_gauche, haut + (2 * decal_haut) * (i - 1) + hauteur * (i - 1), largeur_std, hauteur)
    ctr_Q(i).Name = "BB_S_Q_" & rst.Fields(0).Value
    ctr_Q(i).DefaultValue = rst.Fields(4).Value
    ctr_Q(i).BackStyle = 1
    ctr_Q(i).TextAlign = 2
    ctr_Q(i).BackColor = couleur
    ctr_Q(i).OnExit = "=valid_Q(" & Chr(34) & rst.Fields(0).Value & Chr(34) & ")"
Une idée?
Glherbier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/04/2011, 15h07   #3
Membre du Club
 
Inscription : août 2008
Messages : 86
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 86
Points : 43
Points : 43
En vérité, changer le nom d'une de ces textbox fait planter access... Je pense qu'il y a quelque chose à creuser par là, qu'à partir du moment ou j'aurais réussi à changer le nom j'aurais résolu mon problème.

Quelqu'un a une idée?
Glherbier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2011, 09h35   #4
Membre du Club
 
Inscription : août 2008
Messages : 86
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 86
Points : 43
Points : 43
Personne n'a d'ébauche de solution, faut il que je me fasse une raison?
Glherbier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2011, 10h44   #5
Membre Expert
 
Homme Pierre ANTOINE
Inscription : février 2008
Messages : 650
Détails du profil
Informations personnelles :
Nom : Homme Pierre ANTOINE
Âge : 43
Localisation : France, Côte d'Or (Bourgogne)

Informations professionnelles :
Secteur : Enseignement

Informations forums :
Inscription : février 2008
Messages : 650
Points : 1 302
Points : 1 302
Bonjour

Je peux me tromper, mais j'avais cru lire que dans le cas d'un déploiement d'application (mettre sur un poste et l'application et le runtime) il était interdit de travailler sur les formulaire en mode création.

Pourquoi je vous parle de cela ? Parce que l'ajout ou la suppression dynamique des contrôles n'est peut-être pas des plus pertinente.

Pourquoi ne pas rendre visible ou invisible les contrôles en question?


Pierre
pier.antoine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2011, 11h36   #6
Membre du Club
 
Inscription : août 2008
Messages : 86
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 86
Points : 43
Points : 43
En fait, je cherche à réaliser des formulaires les plus dynamiques possibles.

Ici, il s'agit de gérer des nomenclatures, un peu comme dans un ERP.

En ouvrant ce formulaire l'utilisateur voit la nomenclature au niveau 0.

Il peut ensuite cliquer sur des controles "+" pour déployer la nomenclature d'un sous-ensemble, et sur des controles "moins" pour l'enrouler et la fermer. Ainsi mon idée était de créer des controles quand l'utilisateur déroule un sous ensemble, et les supprimer quand il l'enroule, afin d'éviter d'atteindre le max de controles (784) trop vite.

Je rend les textbox invisibles, mais le problème survient quand l'utilisateur déroule un sous ensemble, le rentre, puis le déroule à nouveau (access chercher à créer un controle ayant le même nom qu'un controle invisible)

J'ai contourné ce problème de la manière suivante :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
 On Error Resume Next
    Set ctr_PN(i) = Forms("Formulaire2").Controls("BB_S_PN_" & rst.Fields(0).Value)
 
    If Err.Number <> 0 Then
        Set ctr_PN(i) = CreateControl(frm.Name, acTextBox, , "", "", ctr_BB_global(i).Left + ctr_BB_global(i).Width + decal_gauche, haut + (2 * decal_haut) * (i - 1) + hauteur * (i - 1), largeur_std * 3, hauteur)
    Else
        ctr_PN(i).Left = ctr_BB_global(i).Left + ctr_BB_global(i).Width + decal_gauche
        ctr_PN(i).Top = haut + (2 * decal_haut) * (i - 1) + hauteur * (i - 1)
        ctr_PN(i).Visible = True
    End If
 
    ctr_PN(i).Name = "BB_S_PN_" & rst.Fields(0).Value
    ctr_PN(i).DefaultValue = Chr(34) & rst.Fields(5).Value & Chr(34)
    ctr_PN(i).BackStyle = 1
    ctr_PN(i).TextAlign = 2
    ctr_PN(i).OnExit = "=recherche_PN_nomen(" & rst.Fields(0).Value & "," & Chr(34) & Chr(34) & ", 1)"
    ctr_PN(i).BackColor = couleur
Je pourrais très bien créer un nouveau formulaire de manière dynamique à chaque clic sur "+" (étant donné que je le crée déja de cette manière lors de la première génération de la page), mais je trouve que cette solution n'est pas très élégante pour l'utilisateur (temps de latence, ergonomie faible).

J'ai donc au final trouvé un moyen détourné de répondre au problème, mais cela frustre néanmoins mon intellect...

Ou as tu lu qu'il était interdit de travailler sur des formulaires en mode création ? Et pourquoi?
Glherbier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2011, 12h17   #7
Membre Expert
 
Homme Pierre ANTOINE
Inscription : février 2008
Messages : 650
Détails du profil
Informations personnelles :
Nom : Homme Pierre ANTOINE
Âge : 43
Localisation : France, Côte d'Or (Bourgogne)

Informations professionnelles :
Secteur : Enseignement

Informations forums :
Inscription : février 2008
Messages : 650
Points : 1 302
Points : 1 302
Dans le tutoriel Déploiement et empaquetage d'applications professionnelles Access 2003

je lis

Citation:
2-3-1. Caractéristique d'un MDE:
- Modification, création de formulaires, d'états ou de modules désactivés ;
- Modification, ajout ou suppression des références aux bibliothèques d'objets ou aux bases de données interdites avec bien entendu, l'impossibilité d'intervenir sur le code à l'aide des propriétés ou des méthodes de Microsoft Access ;
- L'importation ou l'exportation d'objets tels que formulaires états ou modules est impossible ;
- Seules les tables ou les requêtes peuvent être exportées ou importées vers ou depuis les bases de donnée ;
Bonne journée

Pierre
pier.antoine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2011, 12h40   #8
Membre du Club
 
Inscription : août 2008
Messages : 86
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 86
Points : 43
Points : 43
Merci pour ce tuto, mais cela ne me concerne pas vraiment je ne fais pas de déploiement (enfin pas encore, mais ca me donne des idées)...
Glherbier est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h12.


 
 
 
 
Partenaires

Hébergement Web