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 15/09/2011, 17h26   #1
Invité de passage
 
Homme
Étudiant
Inscription : septembre 2011
Messages : 7
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : septembre 2011
Messages : 7
Points : 4
Points : 4
Par défaut Ajout de contrôle dans un formulaire

Bonjour tout le monde,
comme vous vous en doutez je viens poster ici car j'ai un problème

Voilà j'ai un form nommé "PlanDeControl" dans lequel je souahiterai à l'ouverture ajouter des contrôles de type checkBox en fonction du nombre d'onlgets d'un fichier access dans le répertoire. Jusque là je pensais savoir comment m'y prendre

Voici mon code :
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
Private Sub Form_Load()
 
'Déclarations
Dim xlApp As Excel.Application
Dim xlBook As Excel.Workbook
Dim CB As CheckBox
Dim i As Integer
Dim formName As String
 
formName = "PlanDeControl" 'Initilisation du nom du form
 
'ouverture du classeur excel
Set xlApp = New Excel.Application
Set xlBook = xlApp.Workbooks.Open("Chemin de mon fichier Excel") 'Il est bien renseigner (avant qu'on me pose la question ;) )
 
'fermeture et réouverture du formulaire en mode création
DoCmd.Close acForm, formName
DoCmd.openForm formName, acDesign
 
'création des différentes checkBox
For i = 1 To xlBook.Sheets.Count
    Set CB = CreateControl(formName, acCheckBox)
    With CB
        .name = "CB_" & i
        .Left = 50
        .Top = 40 + 10 * i
        .Height = 20
        .Width = 20
        .Visible = True
    End With
    Set CB = Nothing
Next
 
'fermeture et réouverture du formulaire en mode normal
DoCmd.Close acForm, formName, acSaveYes
DoCmd.openForm formName
 
'Libération de l'espace
Set xlApp = Nothing
Set xlBook = Nothing
 
End Sub
Voilà au début je taper en direct le nom de mon formulaire mais VBE me renvoyer l'erreur 29054 : "Microsoft access ne peut pas ajouter, modifier ou supprimer le(s) controle(s) sélectionné(s)." Ou quelque hose comme ça.
Je me suis renseigner sur plusieurs forum et les résultats sont les suivants

- Ecrire le nom du formulaire via une variable (solution de 2006 , que j'ai mis en application comme vous pouvez le voir), ... sa marche pas toujour la même erreur.

- changer la réfèrence à microsoft ado par microsoft doa, ... marche pas non plus

- et j'ai vu sur un autre forum qu'il fallait rentrer les paramètres de ma checkBox dans le createControl, ... sa change rien non plus.


J'ai lu beaucoup de chose et parfois sa fait peur mais je n'ai pas trouver la solution à mon porblème.
Je vous fais donc un petit récap de ce que je souhaite faire :
A l'ouverture de mon form "PlanDeControl" je souhaite que mon code VBA ouvre un fichier excel pour récupérer le nombre d'onglets (jusque là sa marche ) puis de créer un CheckBox pour chaque onglets, soit créer autant de checkBox que d'onglets.

Merci d'avance à ceux qui me lirons et encore plus à ce qui pourront me donner des conseils

je ne pense pas que mon code soit trop mauvais mais j'arrive pas à mettre le doigt sur l'erreur
Kaëléphine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 22h44   #2
Modérateur
 
Homme René MAROT
Inscription : octobre 2005
Messages : 5 475
Détails du profil
Informations personnelles :
Nom : Homme René MAROT
Localisation : Canada

Informations forums :
Inscription : octobre 2005
Messages : 5 475
Points : 7 561
Points : 7 561
Je n'ai pas de solution direct a ton problème mais je te suggères des voies de contournement :

1) Si tu as un nombre maximum connu d'onglets, pourquoi ne pas créer autant de CheckBox invisibles et les rendre visibles au fur et a mesure des besoins ?

2) Sinon, pourquoi ne pas utiliser une table temporaire dans un sous-formulaire en mode feuille de données pour enregistrer la liste des tes onglets et la sélection. Sa structure est très simple :
  • EstSelectionne (champs Oui/Non)
  • NomOnglet (champ Texte)

Après ton utilisateur peux simplement cocher les enregistrements qu'il veut. Il me semble qu'en A2010 tu peux définir le sous-form pour qu'il occupe toute la surface disponible donc cela ressemblerai à ce que tu veux faire.

3) Remplacer tes check-box par une liste à sélection multiple.

A+
__________________
Vous voulez une réponse rapide et efficace à vos questions téchniques ? Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
marot_r est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 15/09/2011, 23h56   #3
Expert Confirmé
 
Avatar de vodiem
 
Homme Diem VO
Vivre
Inscription : avril 2006
Messages : 2 644
Détails du profil
Informations personnelles :
Nom : Homme Diem VO
Âge : 40
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Vivre
Secteur : Conseil

Informations forums :
Inscription : avril 2006
Messages : 2 644
Points : 3 895
Points : 3 895
salut marot_r et bienvenu Kaëléphine,

je remarque à la lecture du code qu'il n'y a pas de reset des controles. il est possible que l'erreur vient de l'affection du nouveau control.name avec un déjà préexistant.
vodiem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2011, 08h56   #4
Invité de passage
 
Homme
Étudiant
Inscription : septembre 2011
Messages : 7
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : septembre 2011
Messages : 7
Points : 4
Points : 4
Bonjour marot_r et vodiem

Pour ta solution vodiem l'erreur ce produit au niveau du set CB = createControl au premier passage donc je ne pense pas qu'un reset aide mais je vais quand même essayer sa coute rien et je suis loin de tout connaitre .

Pour marot_r ta première solution ne marche pas car je n'ai strictement aucune idée de l'évolution du fichier, il peut gagner comme perdre des onglets avec le temps et même si excel ne peut pas sauvegarder des onglets à l'infini vu que je vais rassembler les onlgets de 3 fichiers par form en moyenne, je peux pas me permettre de prévoir des CheckBox. Je garde ta deuxième solution sous le coude, je n'aime pas utiliser les sous formulaires car je ne l'ai maitrise pas encore (mais si j'ai pas le choix je ne vais pas ignorer cette solution ). Donc je testerais en premier la liste à sélection multiple qui pour ma part devrais fonctionner sans trop de problèmes. A voir si le rendu me plait.

Je vous tiendrai au courant et je mettrais résolu si j'ai réglé mon problème.
Kaëléphine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2011, 10h16   #5
Invité de passage
 
Homme
Étudiant
Inscription : septembre 2011
Messages : 7
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : septembre 2011
Messages : 7
Points : 4
Points : 4
Rebonjour,
Bon alors petit bilan

Vodiem j'ai essayé de reset le control à chaque tour de boucle mais nada !
Je m'y prends peu-être mal

Toujours est il que j'ai créé des listBox à sélection multiple et que cette solution est plutôt bonne en remplacement, même mieu vu quel marche .

voilà donc ce que j'ai mis dans mon événement load :
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
Private Sub Form_Load()
 
'Déclarations
Dim strValeurs As String
Dim xlApp As Excel.Application
Dim xlBook As Excel.Workbook
Dim xlSheet As Excel.Worksheet
Dim i As Integer
 
'Init
Set xlApp = New Excel.Application
Set xlBook = xlApp.Workbooks.Open("Chemin de mon premier fichier")
strValeurs = ""
 
'Création de strValeurs
For i = 1 To xlBook.Sheets.Count
    Set xlSheet = xlBook.Sheets(i)
    strValeurs = strValeurs & xlSheet.name & ";"
    Set xlSheet = Nothing
Next
'Intégration des données dans la ListBox
Me.LsB_PDC.RowSource = Left(strValeurs, InStrRev(strValeurs, ";"))
'Fermeture du classeur
xlBook.Saved = True
xlBook.Close
Set xlBook = Nothing
 
'Init
Set xlBook = xlApp.Workbooks.Open("Chemin de mon deuxième fichier")
strValeurs = ""
 
'Création strValeurs
For i = 1 To xlBook.Sheets.Count
    Set xlSheet = xlBook.Sheets(i)
    strValeurs = strValeurs & xlSheet.name & ";"
    Set xlSheet = Nothing
Next
'intégration des données dans la ListBox
Me.LsB_AnxPC.RowSource = Left(strValeurs, InStrRev(strValeurs, ";"))
'Fermeture du classeur
xlBook.Saved = True
xlBook.Close
Set xlBook = Nothing
Set xlApp = Nothing
 
End Sub
Donc sur mon form j'ai deux listBox LsB_PDC et LsB_AnxPC pour lequelles je modifie la RowSource lors de l'ouverture du form.

Cette solution ralenti un peu le chargement du form mais vu les machines employées par les futurs utilisateurs, cette lenteur sera rapide pour eux

La solution du sous formulaire est peut être plus rapide mais je laisse quelqu'un d'autre la tester

Mon premier problème n'est pas résolu mais la solution de la ListBox est une très bonne alternative aux CheckBox même mieu dans le cas où il y en a beaucoup (Plus lisible, Plus facile à sélectionner) donc je mets résolu
Kaëléphine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2011, 10h23   #6
Expert Confirmé
 
Avatar de vodiem
 
Homme Diem VO
Vivre
Inscription : avril 2006
Messages : 2 644
Détails du profil
Informations personnelles :
Nom : Homme Diem VO
Âge : 40
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Vivre
Secteur : Conseil

Informations forums :
Inscription : avril 2006
Messages : 2 644
Points : 3 895
Points : 3 895
j'ai testé ce code en AC2007:
Code :
1
2
3
4
5
6
7
'création des différentes checkBox
For i = 1 To xlBook.Sheets.Count
    Set CB = CreateControl(formName, acCheckBox, acDetail, , "CB" & i, 50, 400 + 300 * i)
    Set CBL = CreateControl(formName, acLabel, acDetail, , "CB" & i, 300, 350 + 300 * i)
    Set CB = Nothing
    Set CBL = Nothing
Next
il faut néanmoins supprimer les précédents controles à l'ouverture pour ne pas effectivement les y retrouver mais ca fonctionne.
vodiem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2011, 11h21   #7
Invité de passage
 
Homme
Étudiant
Inscription : septembre 2011
Messages : 7
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : septembre 2011
Messages : 7
Points : 4
Points : 4
j'avais déjà essayer cette solution de tout mettre dans le createControl

Citation:
et j'ai vu sur un autre forum qu'il fallait rentrer les paramètres de ma checkBox dans le createControl, ... sa change rien non plus.
J'avais écris exactement ce que tu as fais mais j'ai toujours cette erreur 29054
donc je dois avoir un problème ailleur. il n'y as que cette partie du code qui bug. Peut-être un problème sur les DLL je sais pas.
Kaëléphine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2011, 16h48   #8
Expert Confirmé
 
Avatar de vodiem
 
Homme Diem VO
Vivre
Inscription : avril 2006
Messages : 2 644
Détails du profil
Informations personnelles :
Nom : Homme Diem VO
Âge : 40
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Vivre
Secteur : Conseil

Informations forums :
Inscription : avril 2006
Messages : 2 644
Points : 3 895
Points : 3 895
après p'tit test sous AC2010: pas de soucis pour le code...

mais j'ai trouvé effectivement l'erreur:
ce n'est pas possible d'exécuter ce code lorsque le formulaire est ouvert ou en cours de chargement. surement parce que le code étant attaché au formulaire il considère celui ouvert même s'il le ferme visuellement ce qui empêche toute modification.
pour pouvoir exécuter ce code tu peux (comme je l'ai fait ) exécuter la procédure à partir d'un module.
vodiem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2011, 08h28   #9
Invité de passage
 
Homme
Étudiant
Inscription : septembre 2011
Messages : 7
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : septembre 2011
Messages : 7
Points : 4
Points : 4
Effectivement une fois le code mis dans un module et quelques retouches, cela fonctionne .
je ne comprendrai donc jamais le fonctionnement de microsoft

Bon merci vodiem pour ton temps.
Kaëléphine 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 00h40.


 
 
 
 
Partenaires

Hébergement Web