Procédure qui ne fait pas ce que je veux...?

Bonsoir à tous,

Dans ma feuille "Datas", j'ai 2 listes "Bénéficiaire" et "Commentaire" pour les deux champs du même nom dans mon UserForm " frm_Montant"...

J' ai imaginé cette procédure:

With Sheets("Datas")

      Dim iDerLig As Integer
      Dim oSheet As Worksheet
      Dim ocell As Range

      Set oSheet = Worksheets("Datas")

      iDerLig = oSheet.Cells(Rows.Count, 2).End(xlUp).Row

      For Each ocell In oSheet.Range("B1:B" & iDerLig)

         If ocell.Text <> cbo_Beneficiaire.Text Then

         oSheet.Range("B" & iDerLig + 1) = cbo_Beneficiaire.Value

         Else
         oSheet.Range("B" & iDerLig + 1).Value = ""
   End If
      Next ocell

   End With

Pour rajouter des items dans ma liste "Bénéficiaire" si l'item écris au clavier n'y est pas déjà.

ça fonctionne, mais si je sélectionne un item existant dans la liste, ça me le recopie en fin de liste dans "Datas"...

Comment puis-je faire pour que ça ne copie que ceux qui n'existent pas...?

Merci de votre aide..

Mes fichiers joints :

7bilan.xlsx (97.45 Ko)

Bonjour,

Une proposition pour Bénéficiaire ...

Si ça convient, il restera à adapter à Commentaire.

Puis, il y a le tri de la colonne afin de retrouver une belle liste triée dans le cbo_beneficiaire.

'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

   ' ECRITURE DANS FEUILLE "Datas" DES BENEFICIAIRES QUI N'Y SONT PAS DEJA
   ' ====================================================================

   With Sheets("Datas")
      Dim iDerLig As Integer

         ' si la valeur dela cbo est -1 = un ajout, sinon passe droit
      If cbo_Beneficiaire.Value <> "" And cbo_Beneficiaire.ListIndex = -1 Then

            ' ajout
         iDerLig = .Cells(Rows.Count, 2).End(xlUp).Row
         .Range("B" & iDerLig + 1) = cbo_Beneficiaire.Value

            ' tri
         .Sort.SortFields.Clear
         .Sort.SortFields.Add2 Key:=Range("B1:B" & iDerLig + 1) _
                  , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
         With .Sort
           .SetRange Range("B1:B" & iDerLig + 1)
           .Header = xlYes
           .MatchCase = False
           .Orientation = xlTopToBottom
           .SortMethod = xlPinYin
           .Apply
         End With
       End If
   End With

ric

P.S. J'ai modifié le code suite l'information pertinente de MFERRAND.

Bonsoir ric,

Merci, c'est parfait comme à ton habitude...

Merci également pour ta fidélité à mon projet...

Bonsoir, Salut Ric !

Je crois t'avoir dit à tes débuts sur le Forum qu'à te précipiter comme tu le faisais en permanence tu irais de bévue en bévue, sans doute pas sous cette forme, mais le sens général devait y être.

Mettre à jour une liste alimentant une Combo en y ajoutant les éléments saisis ne figurant pas dans la liste est une opération relativement simple ! Il suffit de tester si la valeur de la Combo a été saisie ou sélectionnée, et si elle a été saisie on l'ajoute à la liste.

Mais avant de foncer pour produire un code hasardeux, il est bon de passer au crible les possibilités des éléments que l'on utilise (les propriétés et méthodes...) de façon à avoir une vue d'ensemble des comment faire possibles et choisir la méthode la plus adéquate, éventuellement après avoir testé les principales ou celles sur lesquelles on peut avoir des incertitudes...

Tu as la chance que Ric soit aussi sensible à ton sort et intervienne souvent pour te dépêtrer !

Pour ma part, chaque fois que j'ouvre un de tes fichiers, ça me paraît un tel foutoir que je finis par le refermer. D'ailleurs je n'interviens sur tes sujets que pour des considérations générales, sans entrer dans ton code...

Enfin, bonne continuation tout de même !

Bonjour MFerrand,

Merci pour tes remarques bien fondées, je n'en doute pas...

Je n'ai effectivement pas encore le recul nécessaire pour envisager toutes les solutions possibles à la résolution d'un problème, ni même les connaissances pour...

C'est pourquoi je compte sur vous tous pour m'aider à les acquérir...

Quand tu dis:

Il suffit de tester si la valeur de la Combo a été saisie ou sélectionnée, et si elle a été saisie on l'ajoute à la liste

, je ne sais pas faire, un petit exemple me serais bien utile...

Pour ma part, chaque fois que j'ouvre un de tes fichiers, ça me paraît un tel foutoir que je finis par le refermer

, je le conçois volontier, mais STP, aide moi à m'améliorer en me disant ce que je dois faire pour y mettre de l'ordre...

Autodidact en Excel comme en VBA, je suis encore très loin d'avoir tes compétences, j'ai entrepris ce projet justement pour apprendre et ne pas me cantonner aux tutoriels trouvés sur la toile.

Mais comme tu l'as certainement compris, je ne fais que mettre de morceaux de code bout à bout.

J'ai donc besoin que l'on me montre la voie à suivre...

J'espère que tu comprendras...

A te lire, merci encore de partager ton savoir...

Bonjour,

Je conçois fort bien que tout ne s'apprends en un jour, et chaque fois que l'on revient sur un point on a des chances de découvrir quelque chose de nouveau, j'en sais quelque chose... et je sais que j'en ignore encore beaucoup !

Cela dit, j'ai trouvé fort irritant de tomber sur une erreur 9 en voulant afficher ton Userform pour voir de plus près... erreur qui renvoyait à l'Initialize, d'une longueur qui m'a fait abandonner l'idée d'aller chercher l'index ou nom manquant provoquant l'erreur.

Si ta Combo n'est pas vide, et que la valeur de .ListIndex est -1, c'est que la valeur a été saisie et non sélectionnée dans la liste. Tu peux donc l'ajouter à la liste.

Et pour une programmation bien structurée, la procédure qui récupère la valeur de la Combo pour l'utiliser opère le test, et passe s'il y a lieu la valeur à ajouter à une procédure d'ajout.

Et la liste sera mise à jour dans la Combo pour l'opération suivante, soit si plusieurs opérations peuvent être enchaînées avec le Userform, on l'aura masqué pour finaliser l'opération en cours et la mise à jour se fera par l'intermédiaire de la procédure Activate (qui s'exécute à chaque affichage du Userform, contrairement à Initialize qui n'intervient qu'au chargement initial).

Cordialement.

Bonjour à tous,

Pour faire suite à la description de la méthode de test s'il y a eu un ajout dans la combobox donnée par MFERRAND, j'ai modifié le code donné précédemment.

Merci pour l'enseignement.

Espérant le tout conforme.

ric

Rechercher des sujets similaires à "procedure qui fait pas que veux"