Aide pour condition dans textbox
Bonjour à tous
Je suis toujours sur le développement d'un planning avec userform.
Le problème actuel je doit remplir la texbox retard sous plusieurs condition.
La je suis bloquer sur la dernière conditions 'condition Trajet.
Voir dans la fin du code : Private Sub retard_Change()
Faite un essai en appuyant sur le bouton saisi dans la feuille JOURNALIER.
Choisir le prénom pascal et mettre un retard à 14:00 normalement l'usurfom6 ne devrais pas apparaitre selon la condition. Mais sa ne marche pas. Je n'arrive pas à comprendre mon erreur.
Je joint mon fichier.
Cordialement
Bonjour,
Je suis toujours bloquer sur ma condition trajet. Je n'arrive pas à trouver une solution à mon problème.
Malgré mes recherches sur le forum et sur le net .
Je pense qu'il y a une erreur dans mon code.
Merci de m'aider
Bonjour,
Je suis toujours bloquer sur ma condition trajet.
10 lecture, 0 réponse.
Sans doute parce que lorsqu'on fait Choisir le prénom pascal et mettre un retard à 14:00 on a un message 'Impossible..." et on est bloqué.
Soit plus attentif dans les explications la prochaine fois.
ElseIf Trim(Me.TextBox5) > Me.retard.Value ThenLes textbox contiennent du texte (d'où leur nom), tu compares donc des chaines.
Utilises cdate()
Au passage en B12, =(((HEURE($C$9))+(MINUTE($C$9)/60))-((HEURE(G12))+(MINUTE(G12)/60)))
peut être avantageusement remplacé par =(C9-G12)*24 avec le format de cellule Standard.
eric
Merci eriiic de ta réponse
Je suis actuellement sur un projet de planning sur userform. C'est la première fois que je utilise la vba donc très débutant dans ce domaine. Donc quand j'ai un problème je décrit avec mes mots de débutant et je ne peux pas faire aussi des bonnes recherche sur le net.
Donc merci grâce au forum je découvre et j'apprend, j'ai bien compris que les textbox gère du texte.
Il faut que je passe mes cellules au format hh:mm au format standart.
ET que j'adapte ma méthode de calcul des heures par l'exemple que tu m'as donné: =(C9-G12)*24
Je te donne le code existant qui doit être modifier pour Pascal :
'Calcul Retard après-midi plus Acc Travail après-midi
valG = "=(((HOUR(R[0]C[7]))+(MINUTE(R[0]C[7])/60))-((HOUR(R9C4))+(MINUTE(R9C4)/60)))-((((HOUR(R9C5))+(MINUTE(R9C5)/60))-((HOUR(R9C4))+(MINUTE(R9C4)/60)))-(((HOUR(R9C5))+(MINUTE(R9C5)/60))-((HOUR(R[0]C[3]))+(MINUTE(R[0]C[3])/60))))"
'Calcul Trajet
valH = "=(((HOUR(R9C3))+(MINUTE(R9C3)/60))-((HOUR(R[0]C[10]))+(MINUTE(R[0]C[10])/60)))"
'Calcul Retard après-midi plus Acc Travail après-midi plus heure Trajet
If ActiveCell.Offset(0, 5) >= Range("D9") And ActiveCell.Offset(0, 5) <= Range("E9") And ActiveCell.Offset(0, 9) >= Range("D9") And ActiveCell.Offset(0, 9) <= Range("E9") And ActiveCell.Offset(0, 10) >= Range("B9") And ActiveCell.Offset(0, 10) <= Range("C9") And ActiveCell.Offset(0, 8) = "" And ActiveCell.Offset(0, 6) = "" And ActiveCell.Offset(0, 7) = "" Then
'Calcul Trajet
Selection.Value = valH
'Calcul Retard après-midi plus Acc Travail après-midi
Selection.Offset(0, 2).Select
Selection.Value = valG
End If
Donc beaucoup de travail à faire pour adapter mes calculs d'heure car pour ce projet j'ai une multitude de calcul voir les codes dans visual basic JOURNALIER.
Par contre il faut que tu m'éclaire un peu pour l'utilisation de cdate.
Merci pour votre compréhension
Pas de soucis, tout s'apprend et tu as l'air d'avoir bien démarré.
Un utilitaire qui te rendra de grands services :
Parce que tes indentations sont un peu olé-olé. Pour rechercher les erreurs de boucle c'est mieux.
Donc quand j'ai un problème je décrit avec mes mots de débutant
Le problème était que tu indiques comment utiliser ton classeur, ce qui est très bien, souvent on n'a pas le courage d'essayer de deviner. Mais quand on réalise les étapes indiquées on se retrouve bloqué...
Quand c'est possible le mieux est de faire un classeur réduit au nécessaire pour la question (sans pour autant trop simplifier et ne plus avoir une vision du contexte).
ET que j'adapte ma méthode de calcul des heures par l'exemple que tu m'as donné: =(C9-G12)*24
Je te donne le code existant qui doit être modifier pour PascalEn premier lieu pose-toi la question si c'est vraiment nécessaire de le faire par macro.
Tout ce qui peut-être fait directement sur la feuille sera souvent plus rapide (sauf si formules matricielles).
Si tu veux vraiment par macro explique en français et en détail ce que tu veux. Pas qu'on essaie de deviner (parfois mal) à partir d'une formule (qui est peut-être erronée).
Et utilises-tu les cellules ou les textbox comme sources ? Si tu mélanges 2 questions on ne s'y retrouve plus...
Par contre il faut que tu m'éclaire un peu pour l'utilisation de cdate.
Tout simplement
ElseIf CDate(Trim(Me.TextBox5)) > CDate(Me.retard) Thença devrait être mieux.
eric
Merci eriiic sa marche.
J'ai modifier ton code en mettant ceci:
ElseIf CDate(Me.TextBox5) > Me.retard.Value Then
Mais le tien ne fonctionne pas peux-tu m'expliquer?
Merci pour l'adresse du site
mais je doit tout traduire je suis nul en anglais.
Si tu as un site en français?
Pour info j'ai suivi les cours vba et la formation pratique de plus j'ai commandé un livre sur la vba.
Je veux comprendre ce que je fais et pourquoi sa ne marche pas.
Sur mon projet de planning je suis au début j'ai auparavant ouvert d'autre discussion sur le forum.
Je veux passer par le code vba car à terme plusieurs utilisateurs se serviront de se planning et les userform son très convivial.
le but avoir:
un planning d'heure
une analyse des heures
un planning de production
un outil pour ordonnancer une production
un outil d'analyse de pièces
un outil pour analyser la production
C'est pour cela je veux passer par la vba je pense à terme mon application sera complexe et je ne veux pas utiliser ecxel d'une façons Basic.
Merci encore une foi de ton aide et au forum.
J'ai modifier ton code en mettant ceci:
ElseIf CDate(Me.TextBox5) > Me.retard.Value Then
Pourquoi ? 'retard' est également un textbox il me semble, il doit être converti en numérique.
Mais le tien ne fonctionne pas peux-tu m'expliquer?
Je ne peux rien t'expliquer vu que je ne sais pas ce que tu mets dans textbox2 et dans retard et qu'on ne peut rien tester sur ton fichier qui bloque si on suit tes instructions.
mais je doit tout traduire
Télécharge et installe '
'.
Ensuite clic-droit sur ton code et 'Smart Indenter / Indent Procedure' (ou module ou projet), c'est tout.
Eriiic
Je vous explique le fonctionnement de mon userform.
J'ai une combobox txtrecherche à droite de l'intitulé choix du nom.
A l'ouverture de l'userform les label de la combobo txtrecherche vont rechercher les nom dans la feuille JOURNALIER de la colonne A et à partir de la cellule A10.
Une fois un nom sélectionné dans la combobox txtrecherche sa me lance la macro recherche qui va sélectionner les valeurs de la ligne concerné de la colonne B à M et sa me rempli les textbox1 à textbox10.
textbox1 pour le calcul du temps matin
textbox2 pour le calcul du temps après-midi
textbox3 heure d'arriver retard
textbox4 heure de fin de travail HS
textbox5 heure d'arriver avec trajet
textbox6 personne en congé Vacance
textbox7 personne en RTT ou l'heure de départ RTT en heure
textbox8 personne en maladie ou l'heure de départ maladie en heure
textbox9 personne en accident ou l'heure de départ accident en heure
textbox10 total du temps travailler de la personne.
retard c'est bien une textbox elle me permet de rentrer les retards de chaque personne.
la texbox retard se situe dans le cadre retard
Donc si je rentre une valeur dans la texbox retard et si toute les conditions sont remplies je peux valider sur le bouton ok nommé Validation_Retard.
Une fois le bouton Validation_Retard est validé sa me lance la macro calcul_retard
J'espère que j'ai été assez clair sur le fonctionnement de mon userform.
Une fois la modif que j'ai faite dans la textbox retard par le code ElseIf CDate(Me.TextBox5) > Me.retard.Value Then
Le problème du début est en parti résolu sa ne bloque plus.
Rappel du problème:
Faite un essai en appuyant sur le bouton saisi dans la feuille JOURNALIER. Ouverture de l'userform
Choisir le prénom pascal "dans la combox textrecherche" et mettre "dans la textbox retard" un retard à 14:00 normalement l'usurfom6 ne devrais pas apparaitre selon la condition. Mais sa ne marche pas. Je n'arrive pas à comprendre mon erreur.
Refaite le test sa marche avec le fichier joint.
Mais je me suis aperçu en sélectionnant par exemple dans la combobox txtrecherche le prénom Anthony et mettre une valeur dans la textbox retard par exemple 9:00 un nouveau problème se pose:
Erreur d'exécution 13:
incompatibilité de type
C'est depuis que j'ai mis le code : ElseIf CDate(Me.TextBox5) > Me.retard.Value Then
Je pense que sa vient pas de ce code mais plutôt de celui-ci :
'2 eme condition arrêt maladie heure
ElseIf Trim(Me.TextBox8) < Me.retard.Value And Trim(Me.TextBox9) = "" And Trim(Me.TextBox6) = "" And Trim(Me.TextBox7) = "" Then
retard.Text = ""
With UserForm3
'recherche du nom + afficher le texte
.Label2.Caption = "Impossible " & Me.txtrecherche & " en accident de travail"
'lancer userform
.Show 0
Tu me mets dans votre dernier message :
Pourquoi ? 'retard' est également un textbox il me semble, il doit être converti en numérique.
Donc si je comprends bien je ne pas mettre des valeurs numériques dans des texbox quelle outil je dois utilisé pour mon userform.
A quoi sert votre application '
'.
Merci de votre aide
Toujours le message "impossible, pascal n'a pas démarré sa journée".
On verra lundi s'il bosse...
Donc si je comprends bien je ne pas mettre des valeurs numériques dans des texbox quelle outil je dois utilisé pour mon userform.
Tu ne peux mettre que des chaines, à toi de les convertir en numérique le moment venu.
A part les calendriers pas d'objet spécifique pour les numériques.
eric
Bonjour,
J'explique pour le cas de pascal, il y a une valeur en trajet ce qui correspond à son début de journée.
Donc son début de journée est 10h00 toute valeur inférieur à 10h00, il y a le message "Impossible pascal n'a pas commencé sa journée" c'est normal. Il y a aussi une pose le midi de 12h30 à 13h30. Si il arrive en retard après 13h30 exemple 14h00 toute les conditions sont respectées la validation par ok peut se faire. le calcul du retard se fait. On peut voir aussi qu'il a été en en accident de travail à 17h00 si la valeur retard est > à 17h00 un message apparait " IMPOSSIBLE Pascal en accident de travail" c'est normal.
J'ai beaucoup de condition car la saisi des évènements peut se faire en fin de journée mais pas toujours à l'instant t je peux être en réunion.
Si tu essaye avec un retard compris entre 13h30 et 17h00 le code marche.
J'ai parlé d'un nouveau problème maintenant quand je sélectionne Anthony
Anthony à commencé sa journée de 7H45 à 12h30 et il a été en arrêt maladie à 13h30.
Donc si je veux lui rajouter un retard ca ne peut être que sur la période de 7h45 à 12h30.
Dans mon dernier message je te disais, depuis que j'ai rajouté ce code ElseIf CDate(Me.TextBox5) > Me.retard.Value Then
Ça me met une erreur que je n'avais pas auparavant.
Tu me parle : "Tu ne peux mettre que des chaines, à toi de les convertir en numérique le moment venu.
A part les calendriers pas d'objet spécifique pour les numériques.
Une chaine c'est quoi? Comment les convertir en numérique.
Là dans ma résolution de mon problème je ne sais pas par où commencer je n'ai pas les connaissances nécessaires.
Peu-tu me donner un exemple?
Je joins à nouveau mon fichier.
Merci cordialement de votre aide
Bonjour,
Bon, reprenons les bases.
Une chaine c'est quoi?
Une chaine est une suite de caractères.
a="Bonjour", a="123" sont des chaines.
a=123, a = #2/14/2013# sont des numériques.
Comment les convertir en numérique.
Avec les fonctions de conversion : Cdbl(), Clng(), Cdate() etc. Regarde l'aide excel sur ces fonctions.
Parfois excel fait une conversion automatique.
Ex : a="123" + 1 donne un numérique : 124
Il vaut mieux s'en méfier et ne pas compter toujours dessus.
Il est fortement conseillé de déclarer et typer toutes tes variables. Et de n'utiliser le type Variant qu'à bon escient (c'est ce que tu utilises en ne déclarant pas tes variables)
Voir ici, VBA et les variables (mDF) : http://www.mdf-xlpages.com/modules/smartsection/item.php?itemid=51
J'explique pour le cas de pascal, il y a une valeur en trajet ce qui correspond à son début de journée.
Donc son début de journée est 10h00
Avec 7:45 qui s'inscrit, il fallait le deviner...
Pour le reste je n'irais pas plus loin, ça part trop dans tous les sens. Tu ne résous pas un problème avant d'en annoncer un autre. Programmer est une école de patience.
Je reste donc sur :
J'ai modifier ton code en mettant ceci:
ElseIf CDate(Me.TextBox5) > Me.retard.Value Then
Ce n'est pas parce que sur 1 cas tu passes mieux que c'est bon. En l'occurrence tu compares toujours des patates avec des poireaux.
Dans ce cas il faut rester dessus et essayer de se l'expliquer. Peut-être que j'ai dit une bêtise (ce qui arrive), peut-être que non.
Comme j'ai enfin réussi à faire tourner ton programme je trouve que tu n'utilises pas le bon évènement.
Change est appelé à chaque saisie d'un caractère dans un textbox. Tant que la saisie n'est pas complète tu cours le risque d'avoir un test mauvais à tort. C'est ce qui se produit.
Utilise l'évènement Exit qui n'est appelé que lorsque l'objet perd le focus (quand tu appuies sur Ok par exemple)..
J'ai corrigé pour le textbox5, je te laisse corriger pour tous les autres et tu verras bien ensuite ce qui reste comme anomalie.
ElseIf CDate(Me.TextBox5) > CDate(retard) ThenMet un point d'arrêt sur cette ligne (en cliquant dans la marge, la ligne devient marron)
Lance ta saisie.
En mettant le curseur sur le 1er CDate puis sur le 2nd, tu verras que tu compares 10:00:00 avec 15:00:00.
Est-ce que c'est le bon test ? Pas sûr, c'est à toi de le dire. Je me demande pourquoi tu ne compares pas avec listbox5 et listbox7 qui paraissent être les débuts de vacation mais bon, tu connais mieux ton fichier que moi.
En tout cas tu ne compares plus 10:00:00 (numérique) avec "15:00" (chaine), ce qui était manifestement erroné.
numérique > "chaine" sera toujours FAUX
15000 > "123" = FAUX
10:00:00 > "15:00" = FAUX (ce qui t'arrangeait bien)
mais 18:00:00 > "15:00" = FAUX également
Regarde la formule que je t'ai mis en D4. J'espère que c'est plus clair pour toi et que tu saisis maintenant la nuance.
Donc, si tu es d'accord, corrige tout le reste et tu verras ce qu'il reste comme anomalies après.
eric
PS :
A quoi sert votre application '
'.
A indenter automatiquement et correctement le code.
Lecture plus facile et surtout grande aide au débogage sur les erreurs de boucles.
Merci éric
J'ai essayé ta correction et elle marche avec ton code.
Donc je reviens sur le premier problème, c'est vrai quand on est débutant on ne voit pas tout les conséquence d'une erreur.
Donc j'essaye de comparer des valeurs numériques avec des valeurs numériques.
En mettant le curseur sur le 1er CDate puis sur le 2nd, tu verras que tu compares 10:00:00 avec 15:00:00.
Est-ce que c'est le bon test ? Pas sûr, c'est à toi de le dire. Je me demande pourquoi tu ne compares pas avec listbox5 et listbox7
Pour moi le résultat est bon car je compare le début de journée 10h00 au retard.
Mais c'est vrai il manque une condition pour le matin avec l'ouverture d'un userform Impossible Pascal est embauché
Je vais mis penché après.
Revenons au sujet
J'ai modifier tout mes codes par CDate.
Le problème quand je compare une valeur numérique dans une textbox vide le code se met en défaut.
Si je fais pas d'erreur dans mon analyse il faut dire au programme qu'il reconnaisse une texbox vide comme une valeur numérique nul.
Je te met le code en question.
'2 eme condition accident de travail heure
ElseIf CDate(Me.TextBox9) < CDate(retard.Value) And CDate(TextBox8.Value) = "" And CDate(TextBox6.Value) = "" And CDate(TextBox7.Value) = "" Then
And CDate(TextBox8.Value) = "" là je voudrais demandé si il n'y a pas de valeur numérique dans la textbox8
Je pense que ce code est faux.
Je joins mon fichier
And CDate(TextBox8.Value) = ""
Décidément tu as du mal entre numériques et chaines.
Il faut vraiment que tu prennes le temps de te documenter sur les variables en vba (google).
Ce n'est pas un petit programme que tu as choisi pour démarrer. La recherche de bugs sera de plus en plus difficile, il faut que les variables (types, portée et durée de vie) soient claires pour toi.
"" est une chaine vide. Tu ne peux pas comparer un numérique (ton texte converti en date) avec une chaine.
Dans ce cas ton test doit être :
TextBox8.Value = ""
Tu compares 2 chaines.
eric
Merci de ta réponse
And CDate(TextBox8.Value) = ""
J'ai bien vu que je comparai une valeur numérique à une chaine.
Mais je ne savais pas avec plusieurs critères dans une condition on pouvait avoir un critère numérique et un critère chaine.
Je pensai aussi passé par des variables mais je ne sais pas les utiliser correctement.
Connais-tu un site sur les variables avec des exercices pour bien comprendre.
Si tu as un exemple de code avec textbox, variable, valeur numérique et une chaine de caractère.
la vba pour un débutant ce n'est pas facile mais je désespère pas.
Ce projet je l'ai commencé en décembre, j'avance lentement je consacre beaucoup de temps beaucoup de week-end.
Merci de ton aide
Regarde le menu 'cours vba' en haut de cette page.
Tu peux continuer tes tests comme tu fais, c'est bon.
Je te le disais en général car j'ai vu que tu ne le faisais pas.
Ca parait rébarbatif au début, mais tu es gagnant au final. D'une part le code est accéléré si tu utilises des variables entières (Long, ...) dès que tu le peux, et en plus ça évite beaucoup d'erreurs très difficiles à trouver.
Pour ne pas oublier de les déclarer tu peux ajouter Option Explicit au début de chaque module. Une option de VBE te permet de le faire automatiquement.
Tu vas peut-être pouvoir marquer ce fil comme résolu non ?
eric