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
Bonjour,

Voici la difficulté que je rencontre :

Dans mon appli je dois gérer une base de données (des salariés) par un UserForm que je viens de créer. Cette base contient 5 colonnes :

La 1ère : le matricule (numérique)
La 2ème : le nom
La 3ème : le prénom
La 4ème : le type de contrat
La 5ème : le nombre d'heures mensuelles

Mon UserForm permet de rechercher/sélectionner un salarié soit via un ComboBox sur son matricule (pas évident de se souvenir de tous... à part le mien), soit via un ComboBox sur son nom (comment je m'appelle, déjà ?).

Quand on fait une recherche il est évidemment plus facile de le faire sur une liste triée, que ce soit sur du numérique ou sur de l'alpha. Or, si dans mon code [Private Sub CbxMatr_Change()] ou [Private Sub CbxNom_Change()] je lance un tri de ma base (sur la liste des matricules si c'est le ComboBox du matricule qui est utilisé ou sur la liste des noms si c'est le ComboBox du nom qui l'est) ma macro plante (Erreur d'exécution '1004': La méthode Sort de la classe Range a échouée). L'aide associée au message d'erreur ne m'apporte pas de solution...

Comment faire pour trier ces deux critères au moment du choix de l'utilisateur sans faire planter ensuite la macro au moment de la sélection d'un matricule ou d'un nom ?

Quelqu'un aurait-il une ch'tite idée ?

Merci d'avance !

Nospam


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 743
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) :
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...
0
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
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... :)
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
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
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
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

0
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
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
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
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 :
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.
0

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
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

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 ! :)
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
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???
0
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
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
"
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
26 sept. 2014 à 13:44
Pour interdire la saisie au clavier dans une combobox, il convient d'utiliser l'événement KeyPress :

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
0
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
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
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
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.
0
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
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
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
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 :
If TxtbNvMatr.Value = "" Then
MsgBox "Le matricule est manquant", vbOKOnly, "Information manquante"
TxtbNvMatr.SetFocus
Us_Nouveau_Salarié.Show
End If
Si, 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".
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...
0
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
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
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
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 :

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...
0
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
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 !
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
29 sept. 2014 à 13:46
Tu as deux actions à faire : action1 et action2.
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
0
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
Bonjour et merci Franck pour ton aide et tes explications, notamment le code précédent que je testerai sans aucun doute !
0