Rechercher : dans
Par :

[VBA Excel] Boucle sur CheckBox ?

Dernière réponse le 31 jui 2008 à 16:30:36 salim2103, le 3 mai 2007 à 16:09:08 
 Signaler ce message aux modérateurs

Bonjour à tous !

Voilà j'ai un petit problème avec les CheckBox (cases à cocher). J'ai créé un Userform sur Excel avec 52 CheckBox numérotées de 1 à 52 respectivement aux semaines (CheckBox1 -> S01, ... , CheckBox52 -> S52), et j'ai ajouté un bouton "Sélectionner tout" pour pouvoir toutes les sélectionner automatiquement. Mon problème est le suivant : je n'arrive pas à programmer une boucle sur les CheckBox pour que ça marche... J'ai essayé le code suivant :

Dim i As Integer
For i = 0 To 52
CheckBox.i.Value = True
Next i

mais ça ne marche pas. J'ai même essayé d'utiliser des crochets, des parenthèses ou des accolades, mais rien n'y fait... (CheckBox[i], CheckBox(i) ...). Il me met un message d'erreur à chaque fois.
Je voudrais donc vous demander si vous savez comment créer une boucle avec les CheckBox, sachant que ce bouton "Sélectionner tout" n'est que le 1er (et le plus simple) de mes soucis...
Merci infiniment !

Salim

Configuration: Windows XP
Internet Explorer 6.0
Office 2003

1

sncf, le 3 mai 2007 à 16:42:10

Bonjour

Met tous tes checkb0x dans un cadre (frame1)

ensuite essaie

for i = 0 to 51 (on commence la numérotation à 0 pour le 1er controle dans le cadre)
frame1(n)=true
next i

Répondre à sncf

39

 latuque, le 31 jui 2008 à 16:30:36

Bonjour, mais quand tu dit de mettre les checkbox dans un cardre je ne trouve pas l'objet cadre j'ai un groupe d,option mais cela me permet pas de cocher plus d'une case a la fois et a par ca je vois juste le rectangle mais je ne croi pas que cela soi ça

merci de bien vouloi me répondre le plus rapidement possible

Répondre à latuque

2

salim2103, le 3 mai 2007 à 16:54:03

Merci sncf pour ta réponse rapide :)

J'ai essayé ce que tu m'as donné, mais tout ce qu'il me fait c'est qu'il me coche la 1re CheckBox (CheckBox1) uniquement quand je clique sur le bouton "Sélectionner tout"... Il y a donc un problème.
Quand j'ai regardé de plus près, j'ai remarqué que le "i" de l'incrémentation n'apparaissait pas dans la ligne de commande, je me dis que c'est donc normal qu'il n'y ait qu'une seule CheckBox de cochée...
Tu en penses quoi ?

Salim

Répondre à salim2103

3

sncf, le 3 mai 2007 à 17:03:21

Toutes mes excuses
voici le bon code

Dim i As Integer
For i = 0 To 51
Me.Frame1(i) = True
Next i

Répondre à sncf

4

xjl, le 3 mai 2007 à 17:09:17

Désolé, je vous coupe, mais est-ce que quelqu'un sait pourquoi ce code là ne fonctionne pas:

For Each CheckBox In Sheets(1).CheckBoxes
CheckBox.Value = True
Next CheckBox

J'ai l'impression qu'il ne trouve pas les CheckBox dans la collection et je ne comprends pas pourquoi, mais si quelqu'un arrive à faire fonctionner ce code, ça résoudra le problème...

Répondre à xjl

5

salim2103, le 3 mai 2007 à 17:18:19

Ca marche toujours pas... Je pense que ça vient du "Me" dont je comprend pas le sens.
En plus, la réponse à xjl m'intéresse beaucoup également.
Merci d'avance ;)

Répondre à salim2103

6

sncf, le 3 mai 2007 à 17:24:02

Remplace Me par userform1 (le nom de ton formulaire)

Répondre à sncf

7

salim2103, le 3 mai 2007 à 17:37:56

Super !! Merci beaucoup sncf ;) Ca a l'air de marcher.
Je vais essayer ça tout de suite sur mon projet et voir si ça peut arranger mes soucis. Je te rend la réponse dès que les tests seront faits.
Merci encore ! :)

Répondre à salim2103

8

salim2103, le 3 mai 2007 à 17:52:14

Aïe ! J'ai un petit problème encore... Sur mon Userform, il n'y a pas que des CheckBox, mais aussi des Label (Intitulés) pour indiquer justement que telle semaine est concernée par telle case à cocher... Ces label sont numérotés de la même manière que les CheckBox. Donc quand j'exécute ton programme, il me change le nom des Label (les Label passent de "S01", "S02"... à "True").
Que de problèmes !! lol
J'ai essayé de sortir les Label de la Frame mais la Frame reste toujours au premier plan... Et j'ai aussi essayé d'utiliser Userform1.Frame1(i).Value = True, mais il me met un message d'erreur...

Répondre à salim2103

9

sncf, le 3 mai 2007 à 18:01:21

Je ne comprend pas, ta première case à cocher s'appelle comment et ta première étiquette s'appelle comment et quel est le libellé
Les etiquettes sont elles égalemnt dans le frame1 ?

Répondre à sncf

10

sncf, le 3 mai 2007 à 18:07:50

Quelle est l'utilité de mettre une étiquette pour indiquer S01 alors que dans les propriétés de checkbox tu as caption qui te mertmet de le faire (en plus ça fit moitié moins de controles)

Répondre à sncf

12

salim2103, le 3 mai 2007 à 18:15:09

Ben c'est pour celui qui va utiliser le Userform, s'il ne sait pas quelle CheckBox concerne quelle semaine (car il aura à cocher certaines ou toutes les cases...), le Userform en lui-même n'a pas lieu d'exister...

Répondre à salim2103

13

sncf, le 3 mai 2007 à 18:17:37

OK lmais la propriété "Caption" de la chockbox te permet justement de la faire (c'est en fait une étiquette intégrée à la checkbox) d'ou ma question
Pourquoi ne pas utiliser cette propriété de chaque checkbox et supprimer toutes ces étiquettes devenue inutiles

Répondre à sncf

15

salim2103, le 3 mai 2007 à 18:25:34

J'ai modifié la propriété Caption mais le nom n'apparait pas sur le Userform. C'est normal ??

Répondre à salim2103

16

sncf, le 3 mai 2007 à 18:29:48

Pour y voir plus clair, peux tu m'envoyer ton formulaire (exporter dans le menu fichier du visual basic editor (CTRL+E) pour générer un fichier frm). Je t'envoie un message privé pour t'indiquer mon adresse e mail

Répondre à sncf

11

salim2103, le 3 mai 2007 à 18:12:34

Pour être clair, chaque semaine i est concernée par une CheckBox numérotée i (CheckBox25 pour la semaine 25 par exemple), et chaque CheckBox i est accompagnée par un Label du même numéro i (Label25 pour la CheckBox25, dont le libellé est "S25").
Donc la semaine 25 est indiquée par une case à cocher juste à coté d'une étiquette "S25". Forcément, les Label font aussi partie de la Frame...
C'est clair j'espère :) Sinon n'hésite pas à me demander

Répondre à salim2103

14

sncf, le 3 mai 2007 à 18:22:54

Pour y voir plus clair, peux tu m'envoyer ton formulaire (exporter CTRL+E pour générer un fichier frm). Je t'envoie un message privé pour t'indiquer mon adresse e mail

Répondre à sncf

17

salim2103, le 3 mai 2007 à 18:41:15

C'est envoyé ;)
Le but de ce Userform est de simplifier l'utilisation d'un programme VBA. L'utilisateur pourra choisir les semaines qu'il veut sur le Userform, et ce dernier s'occupera d'exécuter le programmes pour ces semaines. Le bouton Sélectionner tout n'est qu'un début comme je disais dans mon 1er post

Répondre à salim2103

18

sncf, le 3 mai 2007 à 18:54:44

solutions pour résoudre ton problème
Solution 1

Suppression de l’étiquette Label1 ( en fait je l’ai seulement déplacé sous S02)
Redimensionnement de la Chekbox1 (elle masquait tout ce que tu pouvais écrire dans caption)
Caption = S01
Alignment = 0 –fmAlignmentLeft
TextAlign = fmTextAlignRight
En redimensionnant légèrement en hauteur tu obtiens le résultat souhaité et tu supprimes du même coup la moitié des controles (toutes les Labels)


Répondre à sncf

19

salim2103, le 3 mai 2007 à 19:05:26

J'étais justement en train de t'écrire que la 2e solution ne marchait pas... Elle aurait eu le mérite d'être plus rapide... Dommage !
Je vais m'atteler à la 1re, qui doit forcément marcher ;)

Répondre à salim2103

20

us, le 3 mai 2007 à 19:21:55
  • +1

Bonjour,

Oui, bien sur ! Excel (plutot VBA) ne possède pas de collection à proprement parlé ! Contrairement à VB...

Tout les problèmes que vous rencontrez viennent de là ! IL est donc impossible d'attribuer un numéro dans une collection d'un type particulier d'objet. LA seule collection qu'il connaisse (Excel) est l'Userform1... Tous les objets dans une Userform sont dans une seule collection (quelque soit le type)... Ainsi les checkbox ou Label et autre sont indexés les l'un à la suite des autres sans distinction.

LA "ruse" pour se ballader dans un seul type d'objet est d'utiliser par exemple le début du nom générique. Par exemple pour mettre toutes les CheckBox cochées (TRUE), il suffit de regarder si le début du nom commence par checkBox et ensuite de passer en revue chaque objet...

Concrètement, mettez quelques CheckBox dans une Userform1 et un bouton.

Derrière le bouton mettez le code suivant :

=

Private Sub CommandButton1_Click()

Dim ole1 As Control
For Each ole1 In UserForm1.Controls
If Left$(ole1.Name, 8) = "CheckBox" Then ole1.Value = True
Next

End Sub

=

et quand vous cliquez sur le bouton, tous les checkbox seront cochées... Bien sur le principe est exploitable pour d'autres objets...

ICI j'utilise le début du Nom (Name) de l'objet, mais on pourrait utiliser une autre propriété. GroupName est ici fait pour cela...
A+
Amicalement, Us.

Répondre à us

21

sncf, le 3 mai 2007 à 19:24:49

Effectivement je n'avais pas pensé à cette solution à vrai dire assez élégante.
Merci de l'info (je garde ça sous le coude, on ne sait jamais)

Répondre à sncf

22

us, le 3 mai 2007 à 19:43:35
  • +1

Oui effectivement...

J'AI été un peu radicale en disant qu'il n'y avait que l'userform... EN fait on peut aussi utiliser les FRAME qui possèdent aussi la collection CONTROLS... Ainsi on peut passer en revue que dedans... Ce qui encore plus élégant... Avec : For Each ole1 In Frame1.Controls

Enfin, tu auras compris le principe, je pense...
Amicalement, Us.

Répondre à us

23

salim2103, le 3 mai 2007 à 19:55:19

Merci infiniment les gars !!
J'ai opté pour la solution de sncf, qui marche très bien, parce que je m'étais déjà engagé sur cette voie, mais la solution de Us m'a l'air d'être très ingénieuse aussi.
En tous cas, j'ai réussi à faire ce que je voulais, merci à vous ! ;)
Deux toutes petites questions pour la route :
1. comment faire appel au Userform à partir des macros ?
2. en cliquant sur OK, le Userform va me générer le programme que je veux, mais je voudrais que le Userform se ferme automatiquement juste après. Comment faire ?

Salim

EDIT : j'ai trouvé la solution pour la 1re question ;) je suis allé sur les modules, j'ai tapé :

Sub UserForm()
UserForm1.Show
End Sub

et ça m'a créé une macro pour afficher mon Userform

EDIT bis : de même, j'ai trouvé la solution pour la 2e question (décidément, je suis chaud aujourd'hui lol). Cette fois-ci, il faut mettre à la fin du Private Sub du bouton Valider : Userform1.Hide... Simplement ;)
Merci encore de votre gentillesse, de votre compétence et de votre patience :)
A bientôt

Salim

Répondre à salim2103

26

us, le 3 mai 2007 à 20:22:33

Salim, regarde les réponses postées à la suite... Amicalement, Us.

Répondre à us

27

salim2103, le 3 mai 2007 à 20:25:44

Ui ui j'ai bien vu :)
Je préfère nettement Unload à Hide, par contre je garde mon Show, je l'aime bien lol
Merci pour ces précisions très instructives :)

Salim

Répondre à salim2103

29

sncf, le 3 mai 2007 à 20:40:36

Salim je suis d'accord avec us
Pour fermer le formulaire il faut etre sur que 'on a plus besoin des données contenues dans ce dernier sinon c'est galère Pascal

Répondre à sncf

28

us, le 3 mai 2007 à 20:36:06

Oui, le plus souvent on utilise SHOW et UNLOAD ! mais dès que tu utilises plusieurs USERFORM, tu trouveras plus élégant de seulement cacher les Userform, c'est plus avantageux (enfin plus simple pour coder)... En effet, comme cela tu peux toujours lire les données entrées sans avoir à les mettre dans des variables auxiliaires... Voilà, A+ Amicalement, Us.

Répondre à us

24

us, le 3 mai 2007 à 20:13:35

USERFORM1.SHOW = Charge et lance l'useform1

USERFORM1.LOAD = Charge l'userform1 (mais ne l'affiche pas)
USERFORM1.HIDE = Cache l'userform1 (elle reste en mémoire à condition qu'elle soit chargée)

UNLOAD USERFROM1 = Décharge l'Userform1 ! donc ferme l'userform (elle n'est plus visible)

En général , on l'utilise cette dernière derrière un bouton où l'on code :

Unload Me

Voilà un peu de vocabulaire... :-);
Amicalement, Us.

Répondre à us

25

sncf, le 3 mai 2007 à 20:14:49

Pour fermer un formulaire nommé unserform1
unload userform1 Pascal

Répondre à sncf

30

Philippe, le 26 jui 2007 à 10:27:09

Bonjour à tous,
C'est mon premier post ici
J'ai une petite question toute bête (j'espère qu'elle n'a pas trouvé de réponse ailleurs)
J'ai créé des checkbox sur un userform et des scripts qui s'exécutent lorsqu'on les active. Ex : un autre userform s'ouvre en indiquant que l'utilisateur s'est trompé en activant cette checkbox.
Je voudrais qu'en fermant ce nouveau userform, la checkbox activée par erreur se désactive automatiquement.
Y'a-t-il un code pour ça?
D'avance merci vous me rendriez un GRAND service

Répondre à Philippe