Vous utilisez un navigateur obsolète. Il se peut que ce site ou d'autres sites Web ne s'affichent pas correctement. Vous devez le mettre à jour ou utiliser un navigateur alternatif.
bien que n'ayant pas eu de suite à ma dernière intervention dans l'autre fil ...
un autre exemple avec toutes les listes déroulantes réactualisables.
Comme Robert j’ai modifié pas mal de choses; entre autres, les noms des contrôles de saisie sont de type Cn où ndésigne le numéro de colonne de report. Il est plus simple de boucler.
Je n’ai pas abordé les tests de validité des saisies.
J’avais pensé à un Module de Classe mais pas d’évènement Exit pour un contrôle Combobox.
Si... cela t'intéresse, je pourrai te donner les explications.
Bonjour et merci beaucoup Robert pour votre aise !!!
C'est exactement ce que je recherchais !
J'ai pris presque réussi à tout adapter seulement il y a une erreur que je n'arrive pas à résoudre :/
"erreur d'exécution 35787"
Private Sub ComboBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean) 'à la sortie de la ComboBox1
Dim CTRL As Control 'déclare la variable CTRL (ConTRôLe)
'condition 1 : si la procédure de vérification d'existence d'une donnée "ValueExist" renvoie [VRAI]
If ValueExist(Me.ComboBox1.Value, 1) = True Then
For Each CTRL In Me.Controls 'boucle sur tous les contrôles de l'userForm
If Not CTRL.Name = "ComboBox1" Then 'condition 2 : si le contrôle n'est pas la ComboBox1
'si la propriété [Tag] du contrôle n'est pas vide, récupère la donnée de la ligne LR,
'colonne : propriété [Tag] du contrôle convertie en byte, de l'onglet O
If CTRL.Tag <> "" Then CTRL.Value = O.Cells(LR, CByte(CTRL.Tag))
End If 'fin de la condition2
Next CTRL 'prochaine contrôle de la boucle
'comme je n'ai pas pu tester j'ai rajouté ces 3 lignes mais normalement elle peuvent être supprimées...
Me.DTPicker1.Value = O.Cells(LR, 2) 'récupère la date
Me.DTPicker2.Value = O.Cells(LR, 9) 'récupère la date de début
Me.DTPicker1.Value = O.Cells(LR, 13) 'récupère la date de fin
Me.CommandButton1.Caption = "VALIDER" 'modifie le texte du Bouton "VALIDER"
Else 'sinon
For Each CTRL In Me.Controls 'boucle sur tous les contrôles de l'userForm
If Not CTRL.Name = "ComboBox1" Then 'condition 2 : si le contrôle n'est pas la ComboBox1
'si la propriété [Tag] du contrôle n'est pas vide, efface le contenu du contrôle
If CTRL.Tag <> "" Then CTRL.Value = ""
End If 'fin de la condition2
Next CTRL 'prochaine contrôle de la boucle
'comme je n'ai pas pu tester j'ai rajouté ces 3 lignes mais normalement elle peuvent être supprimées...
Me.DTPicker1.Value = Date 'récupère la date
Me.DTPicker2.Value = Date 'récupère la date
Me.DTPicker1.Value = Date 'récupère la date
Me.CommandButton1.Caption = "VALIDER" 'modifie le texte du Bouton "VALIDER"
End If 'fin de la condition 1
End Sub
J'ai trouver une réponse sur un forum qui parle de données vides dans DTPicker, j'ai essayé de changer les guillemets, mais rien n'a fonctionné...
Bizarre que tu aies un erreur sur cette ligne car le code dit :
Si la propriété [Tag] du contrôle n'est pas vide, supprime le contenu du contrôle...
Code:
If CTRL.Tag <> "" Then CTRL.Value = ""
La seule explication que j'ai c'est que tu as donné une valeur à la propriété [Tag] d'un contrôle qui n'accepte pas la propriété [Value]. Comme un Label ou une Checkbox.
Si c'est cela, il ne faut attribuer une valeur à la propriété [Tag] qu'aux comboboxes et au textboxes. Les autres contrôles ne doivent pas avoir de Tag.
Je peux me tromper mais sans ton fichier je ne pourrais t'aider davantage...
Bonjour !
J'ai commencé à adapter mon fichier mais comme il y a pas mal de différences entre les fichiers j'ai repris le votre.
J'ai remis les dtpicker, enlever des commentaires,... j'ai cherché partout si pour la valeur false dans la propriété vallue mais il y a rien d'écris...
Je suis bien embêté parce que chez moi ça fonctionne. Es-tu vraiment sûre que la ligne qui plante est bien celle que tu m'a décrite ?
J'ai vérifié la propriété [Tag] de tous les contrôles et tout est OK.
Je t'explique le pourquoi du code. Si tu sélectionnes un demandeur existant dans la liste, les contrôles récupèrent les données du demandeur. Mais je me suis rendu compte que si tu changeais d'avis et décidais de remplacer le demandeur sélectionné par un nouveau demandeur, alors les contrôles gardaient les données du premier demandeur. Pour résoudre ce problème j'ai alors décider d'utiliser une condition :
Code:
If ValueExist(Me.ComboBox1.Value, 1) = True Then
For Each CTRL In Me.Controls 'boucle sur tous les contrôles de l'userForm
If Not CTRL.Name = "ComboBox1" Then 'condition 2 : si le contrôle n'est pas la ComboBox1
'si la propriété [Tag] du contrôle n'est pas vide, récupère la donnée de la ligne LR,
'colonne : propriété [Tag] du contrôle convertie en byte, de l'onglet O
If CTRL.Tag <> "" Then CTRL.Value = O.Cells(LR, CByte(CTRL.Tag))
End If 'fin de la condition2
Next CTRL 'prochaine contrôle de la boucle
'comme je n'ai pas pu tester j'ai rajouté ces 3 lignes mais normalement elle peuvent être supprimées...
Me.DTPicker1.Value = O.Cells(LR, 2) 'récupère la date (à décommenter chez toi)
Me.DTPicker2.Value = O.Cells(LR, 9) 'récupère la date de début (à décommenter chez toi)
Me.DTPicker1.Value = O.Cells(LR, 13) 'récupère la date de fin (à décommenter chez toi)
Me.CommandButton1.Caption = "MODIFIER" 'modifie le texte du Bouton "VALIDER / MODIFIER"
Else 'sinon
For Each CTRL In Me.Controls 'boucle sur tous les contrôles de l'userForm
If Not CTRL.Name = "ComboBox1" Then 'condition 2 : si le contrôle n'est pas la ComboBox1
'si la propriété [Tag] du contrôle n'est pas vide, efface le contenu du contrôle
If CTRL.Tag <> "" Then CTRL.Value = ""
End If 'fin de la condition2
Next CTRL 'prochaine contrôle de la boucle
'comme je n'ai pas pu tester j'ai rajouté ces 3 lignes mais normalement elle peuvent être supprimées...
Me.DTPicker1.Value = Date 'récupère la date
Me.DTPicker2.Value = Date 'récupère la date
Me.DTPicker1.Value = Date 'récupère la date
Me.CommandButton1.Caption = "VALIDER" 'modifie le texte du Bouton "MODIFIER"
End If 'fin de la condition 1
Cela vérifie si le demandeur existe dans la liste et , en fonction de la réponse [True] ou [False], alimente ou vide les contrôles.
Tu me dis que c'est cette ligne qui plante :
Code:
If CTRL.Tag <> "" Then CTRL.Value = ""
mais il n'y a aucune raison qu'elle plante !
Il faut que tu fasses tourner le code pas à pas à l'aide de la touche [F8] dès l'initialisation de l'UserForm.
Pour cela :
• va dans l'editeur visual basic ([Alt]+[F11])
• clique sur le composant UserForm1 dans la cadre en haut à gauche
• quand tu vois ton userform s'afficher dans le grand cadre à droite tu appuies sur la touche [F7]
• la fenêtre de l'UserForm et remplacée par le code de cet userform.
• place ton curseur dans la première ligne :
Code:
Private Sub UserForm_Initialize() 'à l'initialisation de l'UserForm
• appuie maintenant sur la touche [F8] pour lire ligne après ligne ([F8] après [F8])
Bien sûr c'est très long car quand il y a des boucles il faut tout passer. Si le code s'arrête c'est que L'UserForm est affiché. Il te faut le remplir et continuer avec [F8] jusqu'à ce que tu aies un message d'erreur avec la ligne qui plante surligée de jaune...
Tu peux accélérer la lecture des boucles en rajoutant des point d'arrêt (à l'aide de la touche [F9]) dans la ligne juste àprès une boucle et remplacer la touche [F8] (lecture pas à pas) par la touche [F5] (lecture normale jusqu'àu point d'arrêt s'il y en a)...
J'espère que tu vas découvrir le problème car, encore une fois, chez moi pas de bug ! Mais je n'ai pas les DTPickers...
Merci pour votre aide, je vais m'y atteler !
J'utilise la touche F8 comme vous dites mais je vais recommencer car je veux vraiment arriver à faire cette manip' c'est la dernière modif que je veux apporter à mon formulaire !!
Effectivement c'est bizarre que sur mon pc ça ne fonctionne pas ! Je vais essayer sur un de mes collègues ou chez moi, peut être que c'est l'ordinateur qui devient fou
Rien d'étonnant ! Le dernier que j'avais se prenait pour Don Quichotte il a fallu le faire internet dans un H.P.... Aux dernières nouvelles il se serait échappé et vit des jours paisibles dans une décharge à Moulins dans l'allier (y'a pas de hasard !) sans son allier Sancho qui lui, vit à Vichy où il tente désespérément une cure d'amaigrissement...
Non j'ai pas dit qu'il avait le sang chaud Sancho ! Bon Ok je l'avais pensé très fort...
J'ai beau avoir retourné le problème dans tout les sens je n'arrive à faire fonctionner le code !
Je comprend pas pourquoi, en plus il détecte 2 erreurs, celle que j'ai déjà posté et une autre : O.Cells(LI, 2).Value = DTPicker1.Value 'envoie la date du DTPicker1 dans la cellule ligne : L , colonne 2 de l'onglet O => erreur d’exécution 1004, errreur définie par l'application ou par l'objet.
Si quelqu'un à une solution ? En plus ce n'est pas à titre personnel que je mets en place cet outil, mais professionnel du coup c'est frustrant ;( ;( ;(
N'ayant pas ce contrôle dans ma machine je ne peux malheureusement pas t'aider sur ce coup... Si tu n'obtiens pas d'aide je te conseille de faire un nouveau fil en ne parlant que de ce problème, car j'ai écris ce code sans le testé. Peut-être qu'un DTPicker n'a pas de propriété [Value] ? Il faudrait que tu vérifie dans le fenêtre des propriétés en sélectionnant un DTPicker...
[Édition]
Que valent les variables O et LI quand ça plante ?
Si O n'est pas définie, ça plante...
Si LI = 0 ou dépasse la capacité de son type (voir sa déclaration), ça plante aussi...
Il faudrait vérifier, pas à pas, pourquoi ces variables ont le(s) problème(s) cité(s) plus haut...
Très bien je vais résoudre mon problème sur une autre conversation.
Non je n'ai pas trouvé de propriété value.. J'aurais dû vous dire qu'il n'y en avait pas dès le début mais j'y ai pas pensé.
En tout merci beaucoup pour le temps passé à m'aider !
Merci à tous ceux qui m'ont aidé !!
J'ai pu trouver la solution au problème grâce à un autre professionnel d'excel sur le forum en plaçant "On Error Resume Next" au dessus du code "If CTRL.Tag <> "" Then CTRL.Value = "" "
Et j'ai enlevé la variable "LI" à la ligne O.Cells(LI, 2).Value = DTPicker1.Value 'envoie la date du DTPicker1 dans la cellule ligne : L , colonne 2 de l'onglet O et inséré la variable "L".
Mille mercis, mon formulaire marche, mes collègues vont pouvoir l'exploiter à merveille !!!!
Ce site utilise des cookies pour personnaliser le contenu, adapter votre expérience et vous garder connecté si vous vous enregistrez.
En continuant à utiliser ce site, vous consentez à notre utilisation de cookies.