VBA : récupérer .caption d'un "Frame"
Bonjour à tous, Forum,
Je copie tout ça mardi au boulot et tenterais de finir ce projet (enfin) dans la foulée.
Juste une ou deux explications, s'il te plait, pour cette macro :
If (i + 3) Mod 4 = 0 Then
k = (i + 3) / 4
End IfLà, je n'ai pas tout compris...
For l = l To l + 1 'permet de boucler sur les options "Local" et "Communautaire"A quoi sert le +1 dans cette boucle ?
Merci encore à toi d'avoir consacré un peu (beaucoup) de temps pour moi.
Amicalement.
Fabrice,
Re,
Concernant le :
If (i + 3) Mod 4 = 0 Then
k = (i + 3) / 4
End IfEn fait dans ton userform UsfPExt, les listbox :
LstChantiers1 correspond aux OptionsButtons1, 2, 3, 4 ;
LstChantiers2 correspond aux OptionsButtons5, 6, 7, 8 ;
LstChantiers3 correspond aux OptionsButtons9, 10, 11, 12 ;
En bref :
1->1,2,3,4
2->5,6,7,8
3->9,10,11,12
J'ai juste fait une petite formule qui permet d'avoir les correspondances ci-dessus.
En pas à pas, ça fait:
i=1
si (i+3=4) est multiple de 4 alors k=(i+3)/4=1
on est donc dans la listbox k=1
i=2
si (i+3=5) est multiple de 4 alors k=(i+3)/4 -> ici le test est faux donc on reste dans la listbox k=1
i=5
si (i+3=8) est multiple de 4 alors k=(i+3)/4=2
ce qui signifie qu'en passant au bouton n°5, la listbox correspondante est la deuxième (k=2)
ainsi de suite...
Pour le :
For l = l To l + 1 'permet de boucler sur les options "Local" et "Communautaire"le +1 sert juste à boucler sur chaque couple d'optionbutton "Local" (l) et "Communautaire" (l+1)
Les boutons s'appelant "Typ" & l (l = 1,2,3,4,5,6) vu que tu as 6 boutons en tout pour les "Local" et "Communautaire"
Bon, pas facile d'expliquer tout ça clairement! En espérant que tu as un peu mieux compris
Bonjour à tous, vba-new,
Si, je crois que je commence à y voir plus clair. En tous cas, merci encore pour le code et tes explications.
Je remets tout ça en place mardi au boulot et passerai le fil en résolu.
Bon dimanche.
Amicalement.
Fabrice,
Bonjour à tous,
vba-new, si je peux t'embêter encore un tout petit peu...
Après tests un peu plus approfondis, il s'avère que la boucle sur les boutons "Local" et "Communautaire" ne fonctionne pas tout à fait comme il faut.
En effet, si je clique sur le bouton "Typ1" correspondant à "Local" et que je clique ensuite sur le bouton "Typ4" correspondant à "Communautaire" dans le Frame d'à côté, pas de problème, cela fonctionne bien et tout se met à jour dans l'onglet "Journal_enregistrements_PE".
En revanche, en cliquant toujours sur le bouton "Typ1" mais que je clique sur le bouton "Typ5" du Frame situé en dessous, je ne récupère que la donnée du "Typ1" dans l'onglet "Journal_enregistrements_PE".
Par contre, en choisissant un bouton "Typ" dans chacun des 3 Frame, cela fonctionne aussi...
Aurais-tu une explication ?
Merci d'avance.
Amicalement.
Fabrice,
Bonjour fabrice, forum,
Eh bien en fait, que les cases "Local" et "Communautaire" soient cochées ou non, si aucun des 4 boutons (0.25, 0.50, 0.75, 1.00) qui se trouvent dans le même frame n'est coché, alors la donnée du "Typx" ne sera pas récupérée.
En clair, si tu coches le bouton "Typ5" mais que tu ne coches ni "But9", "But10", "But11", "But12", alors la donnée "Typ5" (="Local") ne sera pas récupérée.
J'ai donc fait le code en fonction de ce principe. Il en va donc de même pour les infos concernant les chantiers.
Si aucun des 4 boutons (0.25, 0.50, 0.75, 1.00) n'est coché, alors l'information chantier ne sera pas récupérée, et ce, même si tu as sélectionné une info concernant le chantier.
Il me semble que cela vienne de là. Dis-moi si je me trompe.
Bonjour à tous, Forum, vba-new,
Désolé de te contredire vba-new mais le fait de ne pas cocher un des boutons de valeur de temps (0.25, 0.50, 0.75 ou 1) ne peut pas être la cause de la non-récupération de l'info "Typ5". En effet, si tu ne coches pas la valeur de temps, tu as un message te signalant qu'aucune valeur de temps n'a été saisie...
Merci en tout cas de m'aider encore un petit peu... On y est presque...
Bonne journée.
Fabrice,
Re,
Pas de quoi être désolé
Fabrice69 a écrit :En effet, si tu ne coches pas la valeur de temps, tu as un message te signalant qu'aucune valeur de temps n'a été saisie...
Je suppose que tu parles de cette condition là :
If Not comptPE > 1 Then
For i = 1 To 12 'numéro des 12 boutons ("But..")
If comptPE = 0 Then
MsgBox "IL VOUS FAUT SAISIR UNE VALEUR DE TEMPS !!!"
Exit Sub
End IfCette condition est vraie si AUCUN bouton (0.25, 0.50, 0.75 ou 1) de TOUS les frame n'est coché!
Donc si dans le premier frame : tu coches par exemple 0.25 et "Local"
et si dans le dernier frame tu ne coches que "Local" (Typ5) sans cocher de bouton (0.25, 0.50, 0.75 ou 1)
alors la donnée Typ5="Local" n'est pas récupérée.
Dis-moi si je me trompe.
Re-bonjour à tous,
vba-new, tu as parfaitement raison. Si je fais une saisie dans deux "Frame" et que j'omets la valeur de temps (0.25, 0.50, 0.75 ou 1) dans le deuxième par exemple, il ne me récupère pas la donnée... Et ce n'est pas bon pour moi...
Il faudrait, en fait, que l'utilisateur puisse cocher dans n'importe quel "Frame" et récupérer les données si la SOMME des valeurs n'est pas supérieure à 1. Ces boutons sont, comme tu l'as certainement compris, des quarts de journée et l'utilisateur saisit au jour le jour... Il peut donc saisir moins de "1" en charges (en congés l'après-midi par exemple) mais jamais une valeur > à 1.
L'idéal serait que l'on puisse saisir la charge globale dans 1, 2 ou 3 "Frame". Mais si une valeur de temps est cochée dans l'un des "Frame", il faut obligatoirement saisir un "Typ" (Local ou Communautaire) ET un "Chantier"... Tous cela sans jamais dépasser 1.
Je ne sais pas si je suis très clair
Mais sincèrement, je te remercie de me venir en aide car j'aurai été bien incapable de réaliser ce que tu m'as déjà fait...
Merci encore et bon après-midi.
Amicalement.
Fabrice,
re,
Fabrice69 a écrit :L'idéal serait que l'on puisse saisir la charge globale dans 1, 2 ou 3 "Frame".
Plutot que donner une explication, peux-tu donner un exemple de ce que tu voudrais faire? ça me faciliterait la tâche!
Fabrice69 a écrit :Mais si une valeur de temps est cochée dans l'un des "Frame", il faut obligatoirement saisir un "Typ" (Local ou Communautaire) ET un "Chantier"... Tous cela sans jamais dépasser 1.
ça doit pouvoir se faire sans trop de difficultés (en théorie)
Pour l'instant j'essaie de clarifier les choses au maximum. Je ne pourrais "travailler" en réel qu'à partir de ce soir ou demain, études oblige
bonne après-midi à tous!
Bonjour à tous,
Il me semblait bien que je n'étais pas clair...
Un exemple de saisie :
- Date : le 04/12/09
- Nom : BOON D.
Dans le "Fram1
- But2 coché (0.50)
- listbox "Chantiers" = Paramétrage
- "Fram4" (Type) = Local
Dans le "Fram3"
- But9 coché (0.25)
- listbox "Chantiers" = Formation
- "Fram6" (Type) = Communautaire
Les données sont à retranscrire dans l'onglet "Journal_enregistrements_PE" dans les bonnes colonnes (il y aura donc 2 lignes pour cette saisie). La somme des valeurs de temps est de 0.75 donc la saisie est valable...
Si une valeur de temps est cochée dans un "Fram", contrôle pour vérifier qu'un choix est fait dans la listbox, qu'un "typ" est coché. Si plusieurs valeurs de temps dans plusieurs "Fram", alors mêmes contrôles et en rajouter un supplémentaire sur la SOMME des valeurs de temps qui ne doit en aucun cas dépasser 1 (Saisie au jour le jour).
OUF !!! J'espère que tu y vois plus clair, sinon bien sur, n'hésite pas à me demander d'autres précisions...
Merci encore pour ton aide mais pense à tes études avant tout
Amicalement.
Fabrice,
re,
Voici le code :
Private Sub ButValiderPExt_click()
Dim i%, comptPE!
Dim j%, valTyp!
Dim k%, l%
Dim test As Boolean
If LstNoms = "" Then
LstNoms.SetFocus
MsgBox " *** VEUILLEZ SAISIR VOTRE NOM SVP !!! *** "
Exit Sub
End If
comptPE = 0
'valTyp = 0
Sheets("Journal_enregistrements_PE").Activate
With Sheets("Journal_enregistrements_PE")
For i = 1 To 12
If Me.Controls("But" & i) Then comptPE = comptPE + CSng(Me.Controls("But" & i).Caption)
Next
If Not comptPE > 1 Then
For i = 1 To 12
If comptPE = 0 Then
MsgBox "IL VOUS FAUT SAISIR UNE VALEUR DE TEMPS !!!"
Exit Sub
End If
If (i + 3) Mod 4 = 0 Then
k = (i + 3) / 4
l = (i + 1) / 2
End If
If Me.Controls("But" & i) Then
If Me.Controls("LstChantiers" & k).ListIndex = -1 Then
MsgBox "Vous devez choisir une option ""Chantiers"" dans le cadre " & k
Exit Sub
End If
test = True
For l = l To l + 1 'permet de boucler sur les options "Local" et "Communautaire"
If Me.Controls("Typ" & l) Then
test = False
End If
Next l
If test Then MsgBox "Veuillez sélectionner ""Local"" ou ""Communautaire""dans le cadre " & k: Exit Sub
End If
Next i
For i = 1 To 12 'numéro des 12 boutons ("But..")
If (i + 3) Mod 4 = 0 Then
k = (i + 3) / 4
l = (i + 1) / 2
End If
If Me.Controls("But" & i) Then
ligne = .[A65000].End(xlUp).Row + 1
.Cells(ligne, 1) = LstNoms.Value
.Cells(ligne, 2).Value = Me.Calendar1
.Cells(ligne, 3).Value = Me.Controls("But" & i).Tag
'permet de renseigner les informations concernant les chantiers
'.Cells(ligne, 4).Value = ""
.Cells(ligne, 4).Value = Me.Controls("LstChantiers" & k).List(Me.Controls("LstChantiers" & k).ListIndex)
.Cells(ligne, 5).Value = Me.Controls("Typ" & l).Caption
.Cells(ligne, 6).Value = Me.Controls("But" & i).Caption
End If
Next i
Else
MsgBox "Vous ne pouvez saisir une charge de travail > à 1 jour"
Exit Sub
End If
End With
Unload UsfPExt
Unload UsfNoms
End SubPar contre :
Fabrice69 a écrit :Si plusieurs valeurs de temps dans plusieurs "Fram", alors mêmes contrôles et en rajouter un supplémentaire sur la SOMME des valeurs de temps qui ne doit en aucun cas dépasser 1 (Saisie au jour le jour).
Est-ce que tu ne l'as pas déjà fait avec ce code ?
For i = 1 To 12
If Me.Controls("But" & i) Then comptPE = comptPE + CSng(Me.Controls("But" & i).Caption)
Next
If Not comptPE > 1 Then
...
...
...
Else
MsgBox "Vous ne pouvez saisir une charge de travail > à 1 jour"
Exit Sub
End IfTeste tout ça et dis moi si ça cloche quelque part!
Bonjour à tous, Forum,
Je viens de tester ton travail vba-new et j'ai encore un petit souci avec les "Type". En effet, même si je clique sur "Communautaire" et ce, dans n'importe quel cadre, le résultat reporté dans l'onglet "Journal_enregistrements_PE" est "Local"... On dirait qu'il ne veut jamais me retranscrire "Communautaire".
Sinon, les autres contrôles ont l'air parfait et pour répondre à ta question sur les compteurs de temps, oui, la boucle était déjà faite mais je le précisais pour tout récapituler...
Merci encore pour ton implication.
Amicalement.
Fabrice,
Bonjour fabrice, forum,
Effectivement, un petit oubli de ma part
Mise à jour du code :
Private Sub ButValiderPExt_click()
Dim i%, comptPE!
Dim j%, valTyp!
Dim k%, l%
Dim test As Boolean
If LstNoms = "" Then
LstNoms.SetFocus
MsgBox " *** VEUILLEZ SAISIR VOTRE NOM SVP !!! *** "
Exit Sub
End If
comptPE = 0
'valTyp = 0
Sheets("Journal_enregistrements_PE").Activate
With Sheets("Journal_enregistrements_PE")
For i = 1 To 12
If Me.Controls("But" & i) Then comptPE = comptPE + CSng(Me.Controls("But" & i).Caption)
Next
If Not comptPE > 1 Then
For i = 1 To 12
If comptPE = 0 Then
MsgBox "IL VOUS FAUT SAISIR UNE VALEUR DE TEMPS !!!"
Exit Sub
End If
If (i + 3) Mod 4 = 0 Then
k = (i + 3) / 4
l = (i + 1) / 2
End If
If Me.Controls("But" & i) Then
If Me.Controls("LstChantiers" & k).ListIndex = -1 Then
MsgBox "Vous devez choisir une option ""Chantiers"" dans le cadre " & k
Exit Sub
End If
test = True
For l = l To l + 1 'permet de boucler sur les options "Local" et "Communautaire"
If Me.Controls("Typ" & l) Then
test = False
End If
Next l
If test Then MsgBox "Veuillez sélectionner ""Local"" ou ""Communautaire""dans le cadre " & k: Exit Sub
End If
Next i
For i = 1 To 12 'numéro des 12 boutons ("But..")
If (i + 3) Mod 4 = 0 Then
k = (i + 3) / 4
l = (i + 1) / 2
End If
If Me.Controls("But" & i) Then
ligne = .[A65000].End(xlUp).Row + 1
.Cells(ligne, 1) = LstNoms.Value
.Cells(ligne, 2).Value = Me.Calendar1
.Cells(ligne, 3).Value = Me.Controls("But" & i).Tag
'permet de renseigner les informations concernant les chantiers
'.Cells(ligne, 4).Value = ""
.Cells(ligne, 4).Value = Me.Controls("LstChantiers" & k).List(Me.Controls("LstChantiers" & k).ListIndex)
For l = l To l + 1 'permet de boucler sur les options "Local" et "Communautaire"
If Me.Controls("Typ" & l) Then
.Cells(ligne, 5).Value = Me.Controls("Typ" & l).Caption
End If
Next l
.Cells(ligne, 6).Value = Me.Controls("But" & i).Caption
End If
Next i
Else
MsgBox "Vous ne pouvez saisir une charge de travail > à 1 jour"
Exit Sub
End If
End With
Unload UsfPExt
Unload UsfNoms
End SubS'il y a d'autres erreurs, manifeste-toi!
Par contre, il y a peut-être une amélioration à faire.
En effet, quand tu sélectionnes une valeur (0.25, 0.5, 0.75 ou 1) dans un frame, si tu t'es trompé, tu ne peux plus remettre à zéro ce frame! Vu qu'on ne peut apparemment pas déselectionner un OptionButton!
Si tu le souhaites, je peux peut-être regarder ce que je peux faire à ce sujet?
Si quelqu'un a également une astuce pour déselectionner un OptionButton...
Bonjour à tous,
vba-new, tout semble fonctionner à merveille... Les contrôles supplémentaires sur les "chantiers" et sur les "Types" finissent d'encadrer complètement la saisie et c'est exactement ce que je désirais (certains des collaborateurs qui vont saisir sont un peu réfractaires par rapport à l'informatique alors je préfère qu'ils ne puissent pas se tromper...).
Concernant la possibilité d'annuler la saisie d'une valeur de temps (0.25, 0.5, 0.75 ou 1), ce serait vraiment la cerise sur le gâteau et je ne voudrai pas abuser... Mais ça peut servir pour la suite, ou pour d'autres...
Encore merci pour ton implication vba-new
Amicalement.
Fabrice,
Bonsoir,
Si quelqu'un a également une astuce pour déselectionner un OptionButton..
Vite fait, sans regarder le code....
En rajoutant un optionbutton de valeur "0" (zéro), dans chaque frame?
Vi, c'est du boulot....
Reste l'option de mettre un commandbutton en face de chaque frame, qui mettrait à zéro tous les optionbuttons de cette frame, ou une case à cocher, en face de chaque frame, ayant le même effet....
Le plus simple?
pour moi, un optionbutton à 0.....
Bon courage
Bonne soirée
Edit : une autre solution, un double click sur le frame (dans l'évènement "Frame1_DblClick")
exemple :
Private Sub Frame1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Dim Opt As Object ' ou OptionButton
For Each Opt In Me.Frame1.Controls
Opt.Value = False
Next Opt
End SubMaintenant, vu le nombre de Frames, peut-être qu'un jour, il va falloir penser au module de classe...
Bonne soirée (bis)
Re- le forum,
cousinhub, je préfère effectivement la solution du double click sur le cadre... Malheureusement, je ne suis pas arrivé à la faire. J'ai copié ton code dans le VBA du Userform et j'obtiens le message d'erreur suivant : "Erreur d'exécution '438'... Propriété ou méthode non gérée par cet objet". quand je double-clique sur le cadre.
J'ai auparavant modifié la ligne
For Each Opt In Me.Frame1.Controlsen
For Each Opt In Me.Fram1.Controlspuisque mon Cadre s'appelle "Fram1". Ais-je bien fait ?
Ensuite, faudra t-il le copier deux fois en modifiant le nom du cadre pour les deux autres "Frame" restant ?
Merci en tout cas de prendre un peu de ton temps pour améliorer mon projet.
Amicalement.
Fabrice,
bonjour cousinhub, fabrice, forum,
Merci pour le code cousinhub.
Etant donné qu'il y a d'autres types de contôles dans le même frame, voici le code modifié :
Private Sub Fram1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Dim Opt As Object ' ou OptionButton
For Each Opt In Fram1.Controls
If TypeOf Opt Is MSForms.OptionButton Then
Opt.Object.Value = False
End If
Next Opt
End SubTu crées ce code le nombre de fois qu'il y a de frame. N'oublie pas de changer également le nom de la macro (Fram1_DblClick, Fram2_DblClick, Fram3_DblClick)
Bonne après-midi
Bonjour à tous, Forum,
GENIAL !
Une erreur : un simple double-click sur le cadre et la saisie disparait...
Sincèrement bravo pour ce que vous avez fait. Je ne désespère pas, un jour, de vous arriver à la cheville en VBA mais j'ai encore pas mal de boulot...
Merci aussi à tous ceux qui m'ont apporté un peu de leur aide sur ce projet. Je me permets de ne pas le passer en "résolu" tout de suite car je vais le soumettre aux utilisateurs pour avis. Mais je suis maintenant + que confiant.
Merci encore et bon après-midi
Fabrice,
Fabrice69 a écrit :Une erreur : un simple double-click sur le cadre et la saisie disparait...
Encore faut-il leur dire qu'un double clic est nécessaire s'ils veulent remettre à zéro la saisie.
-- Ven Déc 11, 2009 11:06 am --
Re,
Petite précision, pour remettre également à zéro la listbox d'un cadre, utilise ce code :
Private Sub Fram1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Dim Opt As Object ' ou OptionButton
For Each Opt In Fram1.Controls
If TypeOf Opt Is MSForms.OptionButton Then
Opt.Object.Value = False
ElseIf TypeOf Opt Is MSForms.ListBox Then
Opt.ListIndex = -1
End If
Next Opt
End SubBonjour le forum, vba-new,
N'en jetez plus ! La cour est pleine ! C'est trop...
Merci pour le code supplémentaire sur les listBox. Effectivement, je préciserai l'effet du double-click sur un cadre à tous mes utilisateurs.
Je pense leur faire tester cette nouvelle version semaine prochaine ou celle d'après. Je te tiendrai au courant des remarques éventuelles...
Je me répète encore mais c'est vraiment très gentil de ta part de m'avoir consacré un peu de ton temps (et les autres aussi d'ailleurs...).
Amicalement,
Fabrice,