Regroupement de ToggleButton

Résolu
imperator63 - 27 nov. 2012 à 20:52
 imperator63 - 28 nov. 2012 à 19:05
Bonjour à tous,

je viens de récupérer une petite userform d'un fichier Excel mais je ne comprend pas une petite chose.

il y est utilisé le code suivant :

'premier jour du mois
D1 = CDate("1/" & ComboBox2.Value & "/" & ComboBox1.Value)
'dernier jour du mois
D2 = DateAdd("m", 1, D1) - 1
'premier jour (1 = Lundi)
az = Weekday(D1, 2)

'effacement
For i = 0 To 36
UF1(i).Visible = False
UF1(i) = False
UF1(i).Tag = ""
Next i

'création
For jcal = D1 To D2
UF1(az + Day(jcal) - 2).Visible = True
UF1(az + Day(jcal) - 2).Caption = Format(jcal, "d")
UF1(az + Day(jcal) - 2).Tag = jcal
Next jcal



UF1, c'est le nom de l'userform, ça ok, mais le i (ou les calculs) correspond à 37 ToggleButton et je ne saisis pas le lien entre entre i et les ToggleButton .

Merci pour vos réponses

14 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
28 nov. 2012 à 14:53
J'avais enfin du temps à perdre, suffisamment pour aller chercher où tu avais trouvé ce code.
J'ai trouvé où et ai vu !!!!!
1) il implique la présence de 37 Togglebuttons dans ton userform !!!!
2) sa vocation n'est pas de remplacer le contrôle Calendar, mais autre
3) il nécessite d'utiliser en parallèle les données d'une feuille de calcul
4) je confirme la qualité d'apprenti-sorcier de l'auteur de ce code (pour plusieurs raisons)
Ce n'est pas bien sérieux, tout cela !!!!
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
28 nov. 2012 à 15:53
En plus :
1) l'auteur de ce code a joué(dangereux) avec les tolérances de VB (utilisation de la propriété par défaut, lorsque non définie). Ainsi, par exemple :
UserForm1(3) devrait s'écrire plus proprement UserForm1.Controls(3) !
2) les indices de la collection controls d'un userform sont donnés par VB dans l'ordre de leur chargement sur le UserForm.
Pour que son code marche, il faut donc, NECESSAIREMENT, que VB charge en tout premier lieu (et dans le bon ordre) les 37 togglebuttons (sans quoi ===>> la cata !)
Dans son code (et uniquement si les choses se sont bien déroulées dans le bon ordre au chargement, ce que rien ne saurait garantir) : UF1(i), qui est ième contrôle chargé, est le ième togglebutton des 37 togglebuttons.
Ceci ne peut fonctionner que si le 1er contrôle chgargé est le premier togglebutton et que les 36 autres togglebuttons présents sont chargé immédiatement après et dans le bon ordre !!!

Tu veux mon avis ? Fuis à toutes jambes ce genre-là !!!!!
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
3
Utilisateur anonyme
28 nov. 2012 à 03:02
Bonjour,

Je ne sais pas si la boule de cristal de Jack va être d'accord avec la mienne, mais quand tu dis


UF1, c'est le nom de l'userform


Cela me laisse perplexe. Ma boule de cristal me dit que UF1, c'est une collection de boutons ou d'autre chose. Mais la garantie de ma boule de cristal est expirée...
0
Utilisateur anonyme
28 nov. 2012 à 03:11
Bonjour,

Si UF1 est vraiment une collection de boutons, cela voudrait dire qu'il y a une boucle pour en quelque sorte remettre les 37 boutons à zéro et i est un compteur pour indiquer c'est au tour de quel bouton à être effacé, ou caché.

La deuxième boucle sert à "partir" un nouveau mois en affichant les seuls boutons du mois et le numéro du jour ces boutons.

az sert de décalage pour débuter le mois sur la bonne journée de la semaine.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
28 nov. 2012 à 06:50
Bonjour,
Ce que je mets ici en rouge écarte l'hypothèse selon laquelle UF1 serait un userform
UF1(i).Visible = False
UF1(i) = False
UF1(i).Tag = ""
Ce ne saurait on plus être une collection de contrôles.
Je pencherais donc pour un tableau d'objets. Mais si tel était bien le cas, je pense que tu aurais (quand-même) eu le réflex de nous dire comment il était déclaré, puis chargé, hein ! . Et ti n'aurais tout de même pas écrit avec cette assurance :
UF1, c'est le nom de l'userform, ça ok


Il n'est pas normal que tu viennes ici avec un bout de code récolté sur le web et nous demandes de te l'expliquer sans que toi-même ne saches rien vraiment de ce qu'il traite.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
28 nov. 2012 à 07:18
Même pas un tableau d'objets. De Variants, peut-être ?
Peut également être une collection ???
Mais il reste en tout état de cause peu admissible que imperator63 ne sache pas nous dire ce qu'est UF1 !
Il devrait savoir que ce n'est pas son userform et devrait dans ce cas avoir localisé (et nous les rapporter) sa déclaration et son remplissage !!!!



________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
imperator63
28 nov. 2012 à 09:06
Bonjours à tous et merci de vos réponses.

Je dois vous préciser que je débute dans le VBA et que je me suis sûrement un peu avancer en affirment que UF1 était l'userform.

Ce qui m'a fait pensé à ça :
- l'userform a pour nom UF1
- si je remplace UF1 par Me dans mon code, il tourne parfaitement.

Sinon ,je n'ai trouvé aucun déclaration de tableau (ou alors, je ne sais pas ou chercher), la seul chose de déclaré, c'est i (Dim i As Integer) en début de programme.

Ca fait 2 jours que je ne comprend rien à ces quelques lignes...

Je précise aussi que le code était beaucoup plus grand quand je l'ai récupéré et je n'ai gardé que ce qui m'intéresserait (l'userform).

Si c'est une collection de contrôles, comment ça marche ? Elle doit être déclarée quelque part, mais ou ?

Merci encore de votre aide.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
28 nov. 2012 à 11:03
Impossible de travailler sur ces bases et imprécisions... !
Je dois vous préciser que je débute dans le VBA

Il vaudra alors peut-être mieux ne pas commencer par des démarches qui consisteraient à aller à la pêche de bouts de code non parfaitement compris, de les sortir de leur contexte ... de les insérer dans ton appli.
Maintenant : tu as un objectif ? Tu en définis les tenants et aboutissants (au lieu de nous étaler un bout de code trouvé quelque-part et sorti de son contexte) et nous serons alors peut-être en mesure de t'aider à l'atteindre (mais de cette manière là !)
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
imperator63
28 nov. 2012 à 11:37
Ce que je recherche: un bouton dans ma feuille qui me lance un petit calendrier.
De là, je choisi une année, un mois et un jour, je valide, et je recupère la date dans une cellule.

J'ai essayé avec le calendrier intégré mais il n'est pas disponible sur les ordinateurs de mon travail (et impossible de l'installer, les pc sont verrouillés).

Ce userform correspond parfaitement à ce que je cherche mais j'aimerais savoir comment ça fonctionne au lieu de le copier bêtement, et là, je ne comprend pas.

C'est pourquoi je me tourne vers vous pour m'expliquer !

Merci
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
28 nov. 2012 à 12:40
Et tu ne crois pas que, si tel est vraiment le cas d'absence totale de l'ocx Calendar, de l'ocx DtPicker et de l'ocx Monthview (je serais assez étonné de l'absence des trois à la fois sur cette machine), tu pourrais te contenter d'une textbox (pour l'année) d'une listbox (pour le mois) de 1 à 12 et d'une listbox (pour le jour) de 1 à 28, à 29, ou 30 ou 31 selon le mois et l'année ?
J'irais plus loin : d'une simple inputbox dont tu verifierais la validité de la saisie avec Isdate ? Non ?
Plutôt que d'aller chercher je ne sais trop quoi je ne sais où, sans le comprendre puisque pas à ton niveau (et dans quel but ? "faire plus pro" ?)


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
28 nov. 2012 à 12:42
Voire (si textbox sur userform) d'une simple textbox dont tu vérifierais la saisie avec Isdate ? Non ?


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
imperator63
28 nov. 2012 à 13:56
Il est vrai que je pourais faire beaucoup plus simple. D'ailleurs, j'utilise déjà un textbox pour saisir la date mais j'aime bien aller au bout des choses et je veux vraiment savoir comment cette boucle peux modifier
les ToggleButton.

C'est sûr, j'aurais du mettre le code complet dès le départ, cela aurais été plus compréhensible: Le voilà:


Dim i As Integer

Private Sub UserForm_Initialize()
Dim a As Single

Me.Height = 210
Me.Width = 300

For a = 2000 To 2020
ComboBox1.AddItem a
Next a

ComboBox1.Value = Year(Date)
ComboBox1.Enabled = True

ComboBox2.AddItem "Janvier"
ComboBox2.AddItem "Février"
ComboBox2.AddItem "Mars"
ComboBox2.AddItem "Avril"
ComboBox2.AddItem "Mai"
ComboBox2.AddItem "Juin"
ComboBox2.AddItem "Juillet"
ComboBox2.AddItem "Août"
ComboBox2.AddItem "Septembre"
ComboBox2.AddItem "Octobre"
ComboBox2.AddItem "Novembre"
ComboBox2.AddItem "Décembre"
ComboBox2.Text = "Janvier"
End Sub


Private Sub ComboBox1_Change()
ComboBox2_Change
End Sub

Private Sub ComboBox2_Change()
Dim D1, D2 As Date

'premier jour du mois
D1 = CDate("1/" & ComboBox2.Value & "/" & ComboBox1.Value)
'dernier jour du mois
D2 = DateAdd("m", 1, D1) - 1
'premier jour (1 = Lundi)
az = Weekday(D1, 2)

'effacement
For i = 0 To 36
UF1(i).Visible = False
UF1(i) = False
UF1(i).Tag = ""
Next i

'création
For jcal = D1 To D2
UF1(az + Day(jcal) - 2).Visible = True
UF1(az + Day(jcal) - 2).Caption = Format(jcal, "d")
UF1(az + Day(jcal) - 2).Tag = jcal
Next jcal
End Sub


Je préfère utiliser cet userform pour ma saisi, c'est pour un planning qui gère les vacances scolaires et l'userform, c'est pour saisir toutes les dates de toutes les vacances (c'est plus simple, à mon avis, de les saisir comme cela).

Encore merci ucfoutu de t'intéresser à mon pb.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
28 nov. 2012 à 14:27
Désolé de te dire que ce "code complet" ne nous en apprend absolument pas plus sur ce que serait UF1 ! Il n'est dont pas complet !
Il a par ailleurs été écrit par un apprenti-sorcier chaussé de gros sabots ! J'en veux pour preuve :
1) le fait de mettre en majuscules la première lettre d'un mois !
2) le fait d'ignorer ce qu'est la fonction MonthName
Ainsi donc (et entre autres) un développeur (même débutant) n'aurait pas écrit :
ComboBox2.AddItem "Janvier"
ComboBox2.AddItem "Février"
ComboBox2.AddItem "Mars"
ComboBox2.AddItem "Avril"
ComboBox2.AddItem "Mai"
ComboBox2.AddItem "Juin"
ComboBox2.AddItem "Juillet"
ComboBox2.AddItem "Août"
ComboBox2.AddItem "Septembre"
ComboBox2.AddItem "Octobre"
ComboBox2.AddItem "Novembre"
ComboBox2.AddItem "Décembre"
ComboBox2.Text = "Janvier" 

Mais :
For i = 1 To 12
  ComboBox2.AddItem MonthName(i)
Next

Ou, s'il voulaitt absoilument garder son erreur de français faite sur le nom des mois :
For i = 1 To 12
  ComboBox2.AddItem StrConv(MonthName(i), vbProperCase)
Next

et ce n'est pas tout (loin s'en faut) !
Conclusion ? ===>> laquelle, selon toi ?
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
imperator63
28 nov. 2012 à 19:05
Merci beaucoup ucfoutu pour tes réponses.

Maintenant, je comprends mieux.

Merci de toutes les précisions sur ce code que je vais donc éviter. Je vais essayer d'en batir un autre plus "propre".
0
Rejoignez-nous