Combobox trié
Résolu/Fermé
Nospam54
Messages postés
152
Date d'inscription
jeudi 16 avril 2009
Statut
Membre
Dernière intervention
15 novembre 2017
-
25 sept. 2014 à 17:53
Nospam54 Messages postés 152 Date d'inscription jeudi 16 avril 2009 Statut Membre Dernière intervention 15 novembre 2017 - 2 oct. 2014 à 10:04
Nospam54 Messages postés 152 Date d'inscription jeudi 16 avril 2009 Statut Membre Dernière intervention 15 novembre 2017 - 2 oct. 2014 à 10:04
A voir également:
- Vba trier combobox ordre alphabétique
- Excel trier par ordre alphabétique - Guide
- Classer les applications par ordre alphabétique iphone - Guide
- Liste amis facebook ordre alphabétique - Forum Facebook
- Triez ce tableau par ordre alphabétique des prénoms. - Forum Excel
- Vba trier colonne par ordre croissant - Forum VB / VBA
11 réponses
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 751
26 sept. 2014 à 08:47
26 sept. 2014 à 08:47
Bonjour,
Pourquoi ne pas trier tes deux combobox à l'initialisation de ton UserForm?
L'intérêt est qu'elles soient triées tout de suite toutes les 2, tu pourras les "lier" plus tard, lors de l'événement Change() par exemple...
Voici une façon de procéder :
1- tu tries tes données (en passant par des variables tableaux pour ne pas toucher à ta feuille)
2- tu remplit tes deux combobox
3- lors de l'événement Change de la première, tu sélectionnes le nom correspondant dans la seconde.
!!! Attention, en sélectionnant, par le code, le nom de la seconde combo, l'événement Change de cette dernière va se lancer. Ceci aura pour but de déclencher, à nouveau, l'événement change de la première... Inutile. Pour cela, on va utiliser une variable Booléenne Flag. Si elle est à True, on sort de suite de la procédure...
4- Lors de l'événement Change de la seconde combobox, tu sélectionnes le matricule correspondant dans la première.
Un exemple de code à utiliser :
Dans un module standard (Sous l'éditeur VBA : Insertion/Module) :
Dans le module de ton UserForm :
Tu trouveras par ICI, un classeur exemple.
Étant d'humeur friponne, j'ai choisit en NOMS et en Prénoms, la liste des noms étranges et comiques... Pardon d''avance...
Pourquoi ne pas trier tes deux combobox à l'initialisation de ton UserForm?
L'intérêt est qu'elles soient triées tout de suite toutes les 2, tu pourras les "lier" plus tard, lors de l'événement Change() par exemple...
Voici une façon de procéder :
1- tu tries tes données (en passant par des variables tableaux pour ne pas toucher à ta feuille)
2- tu remplit tes deux combobox
3- lors de l'événement Change de la première, tu sélectionnes le nom correspondant dans la seconde.
!!! Attention, en sélectionnant, par le code, le nom de la seconde combo, l'événement Change de cette dernière va se lancer. Ceci aura pour but de déclencher, à nouveau, l'événement change de la première... Inutile. Pour cela, on va utiliser une variable Booléenne Flag. Si elle est à True, on sort de suite de la procédure...
4- Lors de l'événement Change de la seconde combobox, tu sélectionnes le matricule correspondant dans la première.
Un exemple de code à utiliser :
Dans un module standard (Sous l'éditeur VBA : Insertion/Module) :
Option Explicit 'évite de référencer systématiquement la feuille qui contient ta bdd Public Feuille As Worksheet 'procédure de tri d'une variable tableau Sub tri(a, gauc, droi) 'sources : http://boisgontierjacques.free.fr/pages_site/Dictionnaire.htm Dim ref, g, d, temp ref = a((gauc + droi) \ 2) g = gauc: d = droi Do Do While a(g) < ref: g = g + 1: Loop Do While ref < a(d): d = d - 1: Loop If g <= d Then temp = a(g): a(g) = a(d): a(d) = temp g = g + 1: d = d - 1 End If Loop While g <= d If g < droi Then Call tri(a, g, droi) If gauc < d Then Call tri(a, gauc, d) End Sub
Dans le module de ton UserForm :
Option Explicit Dim Flag As Boolean, Ligne As Long Private Sub UserForm_Initialize() Dim Noms(), Matricules(), i As Long, drLig As Long Flag = False Set Feuille = Worksheets("Feuil1") ' A ADAPTER ComboBox1.Clear ComboBox2.Clear With Feuille drLig = .Range("B" & Rows.Count).End(xlUp).Row ReDim Preserve Noms(drLig - 2) ReDim Preserve Matricules(drLig - 2) For i = 2 To drLig Noms(i - 2) = .Range("B" & i).Value Matricules(i - 2) = .Range("A" & i).Value Next End With 'tri : cf Module1 Call tri(Matricules, LBound(Matricules), UBound(Matricules)) Me.ComboBox1.List = Matricules Call tri(Noms, LBound(Noms), UBound(Noms)) Me.ComboBox2.List = Noms End Sub Private Sub ComboBox1_Change() If ComboBox1 = "" Or Flag = True Then Exit Sub Flag = True With Feuille 'on passe par la variable Ligne qui te permet également 'de remplir tes autres contrôles avec les données de cette ligne Ligne = .Columns(1).Cells.Find(ComboBox1.Value, lookat:=xlWhole).Row ComboBox2.Value = .Range("B" & Ligne) End With Flag = False End Sub Private Sub ComboBox2_Change() If ComboBox2 = "" Or Flag = True Then Exit Sub Flag = True With Feuille 'on passe par la variable Ligne qui te permet également 'de remplir tes autres contrôles avec les données de cette ligne Ligne = .Columns(2).Cells.Find(ComboBox2.Value, lookat:=xlWhole).Row ComboBox1.Value = .Range("A" & Ligne) End With Flag = False End Sub
Tu trouveras par ICI, un classeur exemple.
Étant d'humeur friponne, j'ai choisit en NOMS et en Prénoms, la liste des noms étranges et comiques... Pardon d''avance...
Nospam54
Messages postés
152
Date d'inscription
jeudi 16 avril 2009
Statut
Membre
Dernière intervention
15 novembre 2017
13
26 sept. 2014 à 10:39
26 sept. 2014 à 10:39
Bonjour Pijaku (Franck ?),
Et un grand merci pour ta réponse et le temps que tu y as passé !
Je viens d'intégrer, en l'adaptant, ton code et... nickel-chrome, ça fonctionne !
En fait j'y avais travaillé un peu tard hier soir et je n'étais pas loin de la solution, notamment sur la fonction "tri" mise dans un module et qui est appelée à l'initialisation du formulaire.
Cependant j'avais 2 messages d'erreur :
1 - "Erreur d'exécution '-214746259(80004005)' : Erreur non répertoriée."
2 - "Erreur d'exécution '70' Permission refusée".
Après intégration de ton code j'avais toujours les mêmes messages ! Crotte alors me suis-je-t-il dit...
Du coup j'ai suivi pas-à-pas ton code dans le fichier que tu m'as joint et ensuite le mien. J'ai ainsi pu détecter :
- Pour la première erreur ça bloquait sur les lignes "Combobox.clear" à l'initialisation du formulaire.
- Pour la seconde que ça bloquait à l'apparition du formulaire.
En cherchant, à la fois sur ton appli (pour voir les différences) et sur internet j'ai trouvé la solution.
J'avais tout simplement renseigné la propriété "RowSource" dans mes 2 Combobox. Et y fallait pô !
Je te fais sciemment mon "rapport", on ne sait jamais... ça pourra peut-être servir à d'autres développeurs en herbe (comme moi !).
Encore merci (et, qui sait... à bientôt ?)
François
P.S. : J'ai beaucoup souri en découvrant la liste des noms dans ton fichier... :)
Et un grand merci pour ta réponse et le temps que tu y as passé !
Je viens d'intégrer, en l'adaptant, ton code et... nickel-chrome, ça fonctionne !
En fait j'y avais travaillé un peu tard hier soir et je n'étais pas loin de la solution, notamment sur la fonction "tri" mise dans un module et qui est appelée à l'initialisation du formulaire.
Cependant j'avais 2 messages d'erreur :
1 - "Erreur d'exécution '-214746259(80004005)' : Erreur non répertoriée."
2 - "Erreur d'exécution '70' Permission refusée".
Après intégration de ton code j'avais toujours les mêmes messages ! Crotte alors me suis-je-t-il dit...
Du coup j'ai suivi pas-à-pas ton code dans le fichier que tu m'as joint et ensuite le mien. J'ai ainsi pu détecter :
- Pour la première erreur ça bloquait sur les lignes "Combobox.clear" à l'initialisation du formulaire.
- Pour la seconde que ça bloquait à l'apparition du formulaire.
En cherchant, à la fois sur ton appli (pour voir les différences) et sur internet j'ai trouvé la solution.
J'avais tout simplement renseigné la propriété "RowSource" dans mes 2 Combobox. Et y fallait pô !
Je te fais sciemment mon "rapport", on ne sait jamais... ça pourra peut-être servir à d'autres développeurs en herbe (comme moi !).
Encore merci (et, qui sait... à bientôt ?)
François
P.S. : J'ai beaucoup souri en découvrant la liste des noms dans ton fichier... :)
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 751
Modifié par pijaku le 26/09/2014 à 11:00
Modifié par pijaku le 26/09/2014 à 11:00
Je te fais sciemment mon "rapport", on ne sait jamais... ça pourra peut-être servir à d'autres développeurs en herbe (comme moi !).
Et tu nas très bin fait.
En effet, je ne remplit jamais mes combobox avec leur propriété RowSource. Je ne trouve pas cela pratique...
Je trouve la propriété .List beaucoup plus souple. Dans d'autres cas j'utilise AddItem...
Enfin, merci à toi pour ton retour.
Si tu as d'autres questions n'hésite pas.
@+
Franck
Et tu nas très bin fait.
En effet, je ne remplit jamais mes combobox avec leur propriété RowSource. Je ne trouve pas cela pratique...
Je trouve la propriété .List beaucoup plus souple. Dans d'autres cas j'utilise AddItem...
Enfin, merci à toi pour ton retour.
Si tu as d'autres questions n'hésite pas.
@+
Franck
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 751
26 sept. 2014 à 12:12
26 sept. 2014 à 12:12
A la question des doublons éventuels de noms, voici un fichier d'une possible solution : https://www.cjoint.com/c/DIAmpnGvBA6
Nospam54
Messages postés
152
Date d'inscription
jeudi 16 avril 2009
Statut
Membre
Dernière intervention
15 novembre 2017
13
26 sept. 2014 à 12:44
26 sept. 2014 à 12:44
Merci de ce rapide retour de ta part.
Cependant je pense avoir mal formulé mon souhait face à ces "doublons" qui n'en sont pas en réalité puisque des personnes différentes.
Ce que je souhaiterais c'est :
- au départ le combobox "nom" pointe sur la colonne contenant les noms et prénoms concaténés de façon à bien distingués éventuellement les différents salariés portant le même nom
- une fois la bonne personne sélectionnée, que le combobox "nom" pointe sur la colonne dans laquelle il n'y a que le nom.
Ainsi, à l'affichage, après sélection, je n'ai alors que le nom dans le combobox "nom" et le prénom dans le textbox "prénom".
J'ai essayé de plusieurs manières mais je boucle, soit avec des erreurs, soit à l'affichage (comme dans ton fichier exemple) avec le nom et prénom concaténés dans le combobox "nom" et, bien sûr le prénom dans le textbox "prénom".
Bon appétit quand même... (moi c'est fait, sur le pouce !)
François
Cependant je pense avoir mal formulé mon souhait face à ces "doublons" qui n'en sont pas en réalité puisque des personnes différentes.
Ce que je souhaiterais c'est :
- au départ le combobox "nom" pointe sur la colonne contenant les noms et prénoms concaténés de façon à bien distingués éventuellement les différents salariés portant le même nom
- une fois la bonne personne sélectionnée, que le combobox "nom" pointe sur la colonne dans laquelle il n'y a que le nom.
Ainsi, à l'affichage, après sélection, je n'ai alors que le nom dans le combobox "nom" et le prénom dans le textbox "prénom".
J'ai essayé de plusieurs manières mais je boucle, soit avec des erreurs, soit à l'affichage (comme dans ton fichier exemple) avec le nom et prénom concaténés dans le combobox "nom" et, bien sûr le prénom dans le textbox "prénom".
Bon appétit quand même... (moi c'est fait, sur le pouce !)
François
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 751
26 sept. 2014 à 12:55
26 sept. 2014 à 12:55
Et pourtant ça c'est très facile.
Tu affiches ce que tu veux dans un combobox.
Même des valeurs qui n'y sont pas "enregistrées"...
Regarde :
En fait, ça n'est que de l'affichage.
Tu affiches ce que tu veux dans un combobox.
Même des valeurs qui n'y sont pas "enregistrées"...
Regarde :
Private Sub ComboBox1_Change() If ComboBox1 = "" Or Flag = True Then Exit Sub Flag = True With Feuille 'on passe par la variable Ligne qui te permet également 'de remplir tes autres contrôles avec les données de cette ligne Ligne = .Columns(1).Cells.Find(ComboBox1.Value, lookat:=xlWhole).Row ComboBox2.Value = .Range("B" & Ligne) TextBox1.Value = .Range("C" & Ligne) End With Flag = False End Sub Private Sub ComboBox2_Change() If ComboBox2 = "" Or Flag = True Then Exit Sub Flag = True With Feuille 'on passe par la variable Ligne qui te permet également 'de remplir tes autres contrôles avec les données de cette ligne Ligne = .Columns(6).Cells.Find(ComboBox2.Value, lookat:=xlWhole).Row ComboBox1.Value = .Range("A" & Ligne) ComboBox2.Value = .Range("B" & Ligne) TextBox1.Value = .Range("C" & Ligne) End With Flag = False End Sub
En fait, ça n'est que de l'affichage.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Nospam54
Messages postés
152
Date d'inscription
jeudi 16 avril 2009
Statut
Membre
Dernière intervention
15 novembre 2017
13
Modifié par Nospam54 le 26/09/2014 à 13:21
Modifié par Nospam54 le 26/09/2014 à 13:21
Ok, j'ai bien compris le principe et j'ai modifié mon code en conséquence.
Aucun souci si je sélectionne un salarié par son matricule en cliquant sur celui-ci.
Par contre si je veux rentrer manuellement le matricule j'ai le message d'erreur :
"Erreur d'exécution '91':
Variable objet ou variable de bloc With non définie"
Au débogage ça surligne (cf celle en gras) ce qui correspond au combobox1
Et j'ai le même message d'erreur en sélectionnant le salarié par le combobox contenant ses nom et prénom... ça surligne (cf celle en gras) ce qui correspond au combobox2
J'ai bien contrôlé entre ton code et le mien et je ne vois pas où peu(ven)t se trouver le(s) erreur(s).
Désolé de t'em... nnuyer hein ! :)
Aucun souci si je sélectionne un salarié par son matricule en cliquant sur celui-ci.
Par contre si je veux rentrer manuellement le matricule j'ai le message d'erreur :
"Erreur d'exécution '91':
Variable objet ou variable de bloc With non définie"
Au débogage ça surligne (cf celle en gras) ce qui correspond au combobox1
Private Sub CbxMatr_Change()
'
If CbxMatr = "" Or Flag = True Then Exit Sub
Flag = True
'
With Feuille
'Passe par la variable Ligne pour remplir les autres contrôles du formulaire
Ligne = .Columns(1).Cells.Find(CbxMatr.Value, lookat:=xlWhole).Row
CbxNom.Value = .Range("B" & Ligne)
TxtbPrenom.Value = .Range("C" & Ligne)
TxtbContrat.Value = .Range("D" & Ligne)
TxtbNbHre.Value = .Range("E" & Ligne)
End With
'
Flag = False
'
End Sub
Et j'ai le même message d'erreur en sélectionnant le salarié par le combobox contenant ses nom et prénom... ça surligne (cf celle en gras) ce qui correspond au combobox2
Private Sub CbxNom_Change()
'
If CbxNom = "" Or Flag = True Then Exit Sub
Flag = True
'
With Feuille
'Passe par la variable Ligne pour remplir les autres contrôles du formulaire
Ligne = .Columns(6).Cells.Find(CbxNom.Value, lookat:=xlWhole).Row
CbxMatr.Value = .Range("A" & Ligne)
CbxNom.Value = .Range("B" & Ligne)
TxtbPrenom.Value = .Range("C" & Ligne)
TxtbContrat.Value = .Range("D" & Ligne)
TxtbNbHre.Value = .Range("E" & Ligne)
End With
'
Flag = False
'
End Sub
J'ai bien contrôlé entre ton code et le mien et je ne vois pas où peu(ven)t se trouver le(s) erreur(s).
Désolé de t'em... nnuyer hein ! :)
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 751
26 sept. 2014 à 13:25
26 sept. 2014 à 13:25
Tu ne m'ennuie pas.
Pour ton premier souci :
A chaque saisie d'un chiffre dans la combobox, il va chercher, dans la feuille, s'il trouve une correspondance.
Il ne faut absolument pas faire comme cela!!!
Une Combobox est faite pour choisir un de ces Items. Si tu veux saisir, utilise un TextBox. Chaque contrôle à ses particularités et ses propriétés.
Pour ton souci avec les salariés : tu saisis également dans cette combobox ou???
Pour ton premier souci :
A chaque saisie d'un chiffre dans la combobox, il va chercher, dans la feuille, s'il trouve une correspondance.
Il ne faut absolument pas faire comme cela!!!
Une Combobox est faite pour choisir un de ces Items. Si tu veux saisir, utilise un TextBox. Chaque contrôle à ses particularités et ses propriétés.
Pour ton souci avec les salariés : tu saisis également dans cette combobox ou???
Nospam54
Messages postés
152
Date d'inscription
jeudi 16 avril 2009
Statut
Membre
Dernière intervention
15 novembre 2017
13
26 sept. 2014 à 13:33
26 sept. 2014 à 13:33
Dans ce cas peut-on "interdire" une intervention clavier sur ce premier contrôle ?
Ou bien gérer l'erreur pour que ça boucle tant que l'utilisateur n'aura pas compris ( ce gueux !) qu'il faut sélectionner à la souris et non en rentrant un nombre ?
En ce qui concerne le combobox contenant les noms et prénoms, curieusement, avant les dernières modifs je pouvais saisir du texte... il me proposait même la première occurrence commençant par la lettre saisie. Et pas de message d'erreur.
Après les dernières modifs, que je saisisse du texte ou que je sélectionne un salarié dans la liste déroulante... paf, message d'erreur "Erreur d'exécution '91':
Variable objet ou variable de bloc With non définie"
Ou bien gérer l'erreur pour que ça boucle tant que l'utilisateur n'aura pas compris ( ce gueux !) qu'il faut sélectionner à la souris et non en rentrant un nombre ?
En ce qui concerne le combobox contenant les noms et prénoms, curieusement, avant les dernières modifs je pouvais saisir du texte... il me proposait même la première occurrence commençant par la lettre saisie. Et pas de message d'erreur.
Après les dernières modifs, que je saisisse du texte ou que je sélectionne un salarié dans la liste déroulante... paf, message d'erreur "Erreur d'exécution '91':
Variable objet ou variable de bloc With non définie"
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 751
26 sept. 2014 à 13:44
26 sept. 2014 à 13:44
Pour interdire la saisie au clavier dans une combobox, il convient d'utiliser l'événement KeyPress :
En qu'elle colonne sont tes Noms et prénoms concaténés? Sont-ils inscrit "en dur" ou les cellules contiennent des formules?
S'ils sont bien en colonne 6 (F) alors essaie ceci :
Private Sub ComboBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) MsgBox "Et ta souris???" KeyAscii = 0 End Sub
En qu'elle colonne sont tes Noms et prénoms concaténés? Sont-ils inscrit "en dur" ou les cellules contiennent des formules?
S'ils sont bien en colonne 6 (F) alors essaie ceci :
Ligne = .Columns(6).Cells.Find(CbxNom.Value, lookin:=xlValues, lookat:=xlWhole).Row
Nospam54
Messages postés
152
Date d'inscription
jeudi 16 avril 2009
Statut
Membre
Dernière intervention
15 novembre 2017
13
26 sept. 2014 à 14:24
26 sept. 2014 à 14:24
Cool, réglé pour le combobox contenant le matricule (blague à part je mettrai un autre message que "Et ta souris"... ça risquerait de ne pas en faire sourire certains.
Pour le deuxième souci... ben vi : les cellules de la colonne de concaténation contenaient (tiens ça sonne bien à l'oreille, ça...) les formules. Une fois le contenu des cellules mises en valeur la macro tourne !
Merci bien !
Je continue. Je suppose que je rencontrerai encore quelques autres tracas, par-ci, par-là... Mais j'essaie toujours de trouver la solution avant de sonner l'alerte.
Bonne fin de journée !
François
Pour le deuxième souci... ben vi : les cellules de la colonne de concaténation contenaient (tiens ça sonne bien à l'oreille, ça...) les formules. Une fois le contenu des cellules mises en valeur la macro tourne !
Merci bien !
Je continue. Je suppose que je rencontrerai encore quelques autres tracas, par-ci, par-là... Mais j'essaie toujours de trouver la solution avant de sonner l'alerte.
Bonne fin de journée !
François
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 751
26 sept. 2014 à 14:47
26 sept. 2014 à 14:47
Pas de souci, la porte est ouverte...
Bien souvent, les réponses sont dans les événements des contrôles. Si tu utilises les bons contrôles à bon escient, tu dois trouver ta réponse parmi ces événements.
N'hésite pas.
@+
ps : je mets en résolu.
Bien souvent, les réponses sont dans les événements des contrôles. Si tu utilises les bons contrôles à bon escient, tu dois trouver ta réponse parmi ces événements.
N'hésite pas.
@+
ps : je mets en résolu.
Nospam54
Messages postés
152
Date d'inscription
jeudi 16 avril 2009
Statut
Membre
Dernière intervention
15 novembre 2017
13
28 sept. 2014 à 22:19
28 sept. 2014 à 22:19
Bonsoir !
Petit souci dans mon code...
Je m'explique :
Mon application propose un premier menu (Menu principal) qui offre plusieurs choix. Celui qui me pose problème est le second, intitulé "Gestion de la base salariés".
La sélection ne présente pas (plus, merci Franck !) de difficultés. Celle qui en pose, des difficultés, c'est le bouton "Nouveau salarié". Si je sélectionne ce bouton, un nouveau formulaire s'ouvre pour rentrer les informations nécessaires.
Si je rentre les informations, toutes ou pas, et que j'annule sans valider, pas de problème... je retourne au menu précédent. Et si ensuite je reviens au menu principal puis choisie l'option de quitter l'appli tout se passe bien.
Si dans la création d'une nouvelle fiche salarié je valide la création, avec toutes les données, l'appli me propose une ultime validation. Ou si des données sont manquantes, l'appli le signale et reviens à la saisie.
A ce moment-là deux choix s'offrent :
- soit on complète l'info manquante puis on valide et là la procédure va jusqu'à son terme sans souci si on valide le tout.
- soit on décide d'annuler la saisie pour x ou y raison. Et là... l'appli dysfonctionne. Elle revient logiquement au menu précédent.
Si depuis ce menu on revient au menu principal et que l'on sort de l'appli, soit le message d'erreur signalant l'absence d'une information apparait, soit l'appli revient sur un formulaire intermédiaire.
Ça boucle une paire de fois puis enfin on peut sortir de l'appli. Ce qui n'est pas vraiment "propre"...
J'ai passé des heures au carré, j'ai fait des "pas-à-pas" sur tous les codes... je ne comprends pas d'où vient le souci.
La seule piste que j'ai, c'est que ça bugge à partir du moment où des (ou une seule) données ont été entrées et validées dans le formulaire de création, puis qu'en dernier ressort on ne valide pas cette création.
Je ne sais pas si je suis bien clair... Mais le fichier joint permettra sans doute de mieux comprendre l"anomalie et, j'espère me donner une solution pour résoudre
mon problème. (Y a pas de code malveillant et aucune donnée qui mette en danger la sureté Nationale. Quoi que... :))
Merci d'avance (comme d'hab') ;)
François
https://www.cjoint.com/?0ICwnEyy6Yj
Petit souci dans mon code...
Je m'explique :
Mon application propose un premier menu (Menu principal) qui offre plusieurs choix. Celui qui me pose problème est le second, intitulé "Gestion de la base salariés".
La sélection ne présente pas (plus, merci Franck !) de difficultés. Celle qui en pose, des difficultés, c'est le bouton "Nouveau salarié". Si je sélectionne ce bouton, un nouveau formulaire s'ouvre pour rentrer les informations nécessaires.
Si je rentre les informations, toutes ou pas, et que j'annule sans valider, pas de problème... je retourne au menu précédent. Et si ensuite je reviens au menu principal puis choisie l'option de quitter l'appli tout se passe bien.
Si dans la création d'une nouvelle fiche salarié je valide la création, avec toutes les données, l'appli me propose une ultime validation. Ou si des données sont manquantes, l'appli le signale et reviens à la saisie.
A ce moment-là deux choix s'offrent :
- soit on complète l'info manquante puis on valide et là la procédure va jusqu'à son terme sans souci si on valide le tout.
- soit on décide d'annuler la saisie pour x ou y raison. Et là... l'appli dysfonctionne. Elle revient logiquement au menu précédent.
Si depuis ce menu on revient au menu principal et que l'on sort de l'appli, soit le message d'erreur signalant l'absence d'une information apparait, soit l'appli revient sur un formulaire intermédiaire.
Ça boucle une paire de fois puis enfin on peut sortir de l'appli. Ce qui n'est pas vraiment "propre"...
J'ai passé des heures au carré, j'ai fait des "pas-à-pas" sur tous les codes... je ne comprends pas d'où vient le souci.
La seule piste que j'ai, c'est que ça bugge à partir du moment où des (ou une seule) données ont été entrées et validées dans le formulaire de création, puis qu'en dernier ressort on ne valide pas cette création.
Je ne sais pas si je suis bien clair... Mais le fichier joint permettra sans doute de mieux comprendre l"anomalie et, j'espère me donner une solution pour résoudre
mon problème. (Y a pas de code malveillant et aucune donnée qui mette en danger la sureté Nationale. Quoi que... :))
Merci d'avance (comme d'hab') ;)
François
https://www.cjoint.com/?0ICwnEyy6Yj
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 751
29 sept. 2014 à 08:16
29 sept. 2014 à 08:16
Salut,
En fait, si tu n'as pas saisi un champs dans l'userform "nouveau salarié", tu ne sors pas de la procédure.
Dans l'événement Private Sub CB_Nv_Val_Click(), s'il manque une info, tu reviens directement sur l'userform nouveau salarié, mais sans quitter l'événement :
extrait à titre d'exemple :
Pour pallier cela, dans chacun de tes tests de vérification des champs, ajoute : Exit Sub.
Comme ceci :
En fait, si tu n'as pas saisi un champs dans l'userform "nouveau salarié", tu ne sors pas de la procédure.
Dans l'événement Private Sub CB_Nv_Val_Click(), s'il manque une info, tu reviens directement sur l'userform nouveau salarié, mais sans quitter l'événement :
extrait à titre d'exemple :
If TxtbNvMatr.Value = "" ThenSi, par la suite, tu décides de tout annuler, VBA réalise les actions demandées au fur et à mesure, et, à la fin, revient sur cette procédure pour la terminer puisqu'elle est toujours "en cours".
MsgBox "Le matricule est manquant", vbOKOnly, "Information manquante"
TxtbNvMatr.SetFocus
Us_Nouveau_Salarié.Show
End If
Pour pallier cela, dans chacun de tes tests de vérification des champs, ajoute : Exit Sub.
Comme ceci :
On Error GoTo errorsal ' Us_Nouveau_Salarié.Hide ' ' Teste la présence des informations ' If TxtbNvMatr.Value = "" Or TxtbNvNom.Value = "" Or TxtbNvPrenom.Value = "" Or TxtbNvContrat.Value = "" _ Or TxtbNvNbHre.Value = "" Then If TxtbNvMatr.Value = "" And TxtbNvNom.Value = "" And TxtbNvPrenom.Value = "" And TxtbNvContrat.Value = "" _ And TxtbNvNbHre.Value = "" Then MsgBox "Aucune information n'a été entrée", vbOKOnly, "Informations manquantes" Unload Me Load Us_Nouveau_Salarié Us_Nouveau_Salarié.Show Exit Sub End If If TxtbNvMatr.Value = "" Then MsgBox "Le matricule est manquant", vbOKOnly, "Information manquante" TxtbNvMatr.SetFocus Us_Nouveau_Salarié.Show Exit Sub '*************** End If If TxtbNvNom.Value = "" Then MsgBox "Le nom est manquant", vbOKOnly, "Information manquante" TxtbNvNom.SetFocus Us_Nouveau_Salarié.Show Exit Sub '*************** End If If TxtbNvPrenom.Value = "" Then MsgBox "Le prénom est manquant", vbOKOnly, "Information manquante" TxtbNvPrenom.SetFocus Us_Nouveau_Salarié.Show Exit Sub '*************** End If If TxtbNvContrat.Value = "" Then MsgBox "Le type de contrat est manquant", vbOKOnly, "Information manquante" TxtbNvContrat.SetFocus Us_Nouveau_Salarié.Show Exit Sub '*************** End If If TxtbNvNbHre.Value = "" Then MsgBox "Le nombre d'heures/mois est manquant", vbOKOnly, "Information manquante" TxtbNvNbHre.SetFocus Us_Nouveau_Salarié.Show Exit Sub '*************** End If 'suite du code...
Nospam54
Messages postés
152
Date d'inscription
jeudi 16 avril 2009
Statut
Membre
Dernière intervention
15 novembre 2017
13
29 sept. 2014 à 11:51
29 sept. 2014 à 11:51
Bonjour Franck,
Ben oui, encore "lui" ! :)
Merci pour la solution concernant les "Exit Sub" à insérer à chaque test. J'ai modifié mon code en conséquence et ça fonctionne maintenant "proprement".
Toujours dans la gestion des Userform je me trouve face à un autre souci qui, d'après moi, doit être du même ordre, à savoir dans le cas de la modification d'un salarié :
A partir du menu principal, bouton "Gestion de la base salariés", puis sélection du salarié que l'on veut modifier, par exemple le matricule 2371, puis bouton "Modifier".
Là, 2 choix :
- Soit le bouton "Valider la modification" (pas encore de code derrière),
- Soit le bouton "Annuler" qui permet de revenir au menu précédent, le formulaire de sélection d'un salarié.
Si je clique sur le bouton "Quitter" de ce formulaire je remonte au menu principal. Tout va bien...
Si je quitte l'appli en cliquant sur le bouton "Quitter l'application" j'ai un message d'erreur "Erreur d'exécution '91': Variable objet ou variable de bloc With non définie".
En faisant le suivi en pas-à-pas je vois bien que le fait d'avoir cliqué sur le bouton "Annuler" du formulaire "Modification d'un salarié" fait revenir le programme, dans son process, sur le code du bouton "Modifier" du formulaire "Selection d'un salarié" et c'est là que le message d'erreur apparait, à la ligne "Load Us_Modif_Salarié".
Je me dis donc que j'aurais du sans doute glisser un "Exit Sub" quelque part.
J'ai essayé... à plusieurs endroits sans parvenir à régler mon problème.
Je joins à nouveau le fichier.
Quand tu as 5 minutes... merci par avance de m'aiguiller vers la solution... :)
https://www.cjoint.com/?0IDl1TDBiEE
Ben oui, encore "lui" ! :)
Merci pour la solution concernant les "Exit Sub" à insérer à chaque test. J'ai modifié mon code en conséquence et ça fonctionne maintenant "proprement".
Toujours dans la gestion des Userform je me trouve face à un autre souci qui, d'après moi, doit être du même ordre, à savoir dans le cas de la modification d'un salarié :
A partir du menu principal, bouton "Gestion de la base salariés", puis sélection du salarié que l'on veut modifier, par exemple le matricule 2371, puis bouton "Modifier".
Là, 2 choix :
- Soit le bouton "Valider la modification" (pas encore de code derrière),
- Soit le bouton "Annuler" qui permet de revenir au menu précédent, le formulaire de sélection d'un salarié.
Si je clique sur le bouton "Quitter" de ce formulaire je remonte au menu principal. Tout va bien...
Si je quitte l'appli en cliquant sur le bouton "Quitter l'application" j'ai un message d'erreur "Erreur d'exécution '91': Variable objet ou variable de bloc With non définie".
En faisant le suivi en pas-à-pas je vois bien que le fait d'avoir cliqué sur le bouton "Annuler" du formulaire "Modification d'un salarié" fait revenir le programme, dans son process, sur le code du bouton "Modifier" du formulaire "Selection d'un salarié" et c'est là que le message d'erreur apparait, à la ligne "Load Us_Modif_Salarié".
Je me dis donc que j'aurais du sans doute glisser un "Exit Sub" quelque part.
J'ai essayé... à plusieurs endroits sans parvenir à régler mon problème.
Je joins à nouveau le fichier.
Quand tu as 5 minutes... merci par avance de m'aiguiller vers la solution... :)
https://www.cjoint.com/?0IDl1TDBiEE
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 751
29 sept. 2014 à 12:24
29 sept. 2014 à 12:24
Hum hum...
Quand tu as 5 minutes... merci par avance de m'aiguiller vers la solution... :)
Il faudrait bien plus de 5 minutes pour repérer l'erreur.
Je ne la voit pas...
Bon, il existe toutefois une solution à ton souci, même si elle n'est pas très "propre"...
Dans le bouton quitter de ton menu principal, remplace UnLoad Me par End :
C'est violent mais efficace.
Par contre, si tu arrives à "cerner" le souci, tu peux t'en sortir avec une variable publique de type boolean.
Exemple : dans le clic du bouton "annuler" tu règle une variable booléenne sur False : Flag = False et, dans la procédure en erreur, tu ajoutes
Le souci est que je n'ai pas réussit à "isolmer" ton erreur...
Quand tu as 5 minutes... merci par avance de m'aiguiller vers la solution... :)
Il faudrait bien plus de 5 minutes pour repérer l'erreur.
Je ne la voit pas...
Bon, il existe toutefois une solution à ton souci, même si elle n'est pas très "propre"...
Dans le bouton quitter de ton menu principal, remplace UnLoad Me par End :
Private Sub CB_Quit_App_Click() ' Sheets("Accueil").Select End ' End Sub
C'est violent mais efficace.
Par contre, si tu arrives à "cerner" le souci, tu peux t'en sortir avec une variable publique de type boolean.
Exemple : dans le clic du bouton "annuler" tu règle une variable booléenne sur False : Flag = False et, dans la procédure en erreur, tu ajoutes
If Flag = False Then 'Ici le code "d'erreur" Flag = True End If
Flag As Boolean ' à ajouter en entête d'un module standard.
Le souci est que je n'ai pas réussit à "isolmer" ton erreur...
Nospam54
Messages postés
152
Date d'inscription
jeudi 16 avril 2009
Statut
Membre
Dernière intervention
15 novembre 2017
13
29 sept. 2014 à 12:58
29 sept. 2014 à 12:58
J'avais pensé (et testé) la solution avec "End", mais là aussi pas au bon endroit. Ce qui du coup fermait l'appli sans que l'utilisateur l'ait demandé.
En plaçant ce "End" comme tu le proposes, ma foi... ça ne me gêne pas outre mesure.
Concernant la variable "Flag", je n'en comprends pas l'utilité, pardonne-moi cette ignorance... mais que fait-elle ?
Mais ça c'est pour ma curiosité... après tout le "End" semble fonctionner !
En plaçant ce "End" comme tu le proposes, ma foi... ça ne me gêne pas outre mesure.
Concernant la variable "Flag", je n'en comprends pas l'utilité, pardonne-moi cette ignorance... mais que fait-elle ?
Mais ça c'est pour ma curiosité... après tout le "End" semble fonctionner !
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 751
29 sept. 2014 à 13:46
29 sept. 2014 à 13:46
Tu as deux actions à faire : action1 et action2.
Les deux séparément fonctionnent bien. Donc tu n'as pas d'erreur lorsque tu lances :
Cependant, lorsque tu réalises les deux actions l'une après l'autre, tu as un bug.
La variable Boolean permet d'éviter cela.
Sub Action1() 'ici le code de mon action1 qui fonctionne End Sub Sub Action2() 'ici le code de mon action2 qui fonctionne End Sub
Les deux séparément fonctionnent bien. Donc tu n'as pas d'erreur lorsque tu lances :
Sub CommandButton1_Click() Action1 End Sub Sub CommandButton2_Click() Action2 End Sub
Cependant, lorsque tu réalises les deux actions l'une après l'autre, tu as un bug.
Sub CommandButton3_Click() Action1 Action2 End Sub
La variable Boolean permet d'éviter cela.
Public Flag As Boolean Sub Action1() 'ici le code de mon action1 qui fonctionne Flag = False End Sub Sub Action2() 'ici le code de mon action2 qui pourra être réalisé après une action1 If Flag = False Then 'ici le code de mon action2 qui ne sera pas réalisé après une action1 Flag = True 'et on remet sur True End If End Sub
Nospam54
Messages postés
152
Date d'inscription
jeudi 16 avril 2009
Statut
Membre
Dernière intervention
15 novembre 2017
13
2 oct. 2014 à 10:04
2 oct. 2014 à 10:04
Bonjour et merci Franck pour ton aide et tes explications, notamment le code précédent que je testerai sans aucun doute !