Insertion automatique dans une liste

Bonjour à tous !

Plutot novice en VBA, je m'inspire actuellement du travail de Jacques Boisgontier pour les listes en cascade pour un projet.

Cependant je bloque dans une partie VBA.

Je vous ai joint un fichier simplifié pour que vous m'aidez à résoudre le problème (La liste en C2 de la feuille Choix ne fonctionne pas mais ce n'est pas le problème).

Dans la feuille "Liste", j'ai une colonne avec la catégorie des article et une autre avec les article.

Dans la feuille "Choix", en cellule B2 je sélectionne la catégorie et en C2 l'article. Je veux pouvoir ajouter un article n'étant pas dans liste directement en le tapant dans la cellule C2 pour éviter d'aller l'ajouter manuellement dans la feuille "Listes".

Lorsque que je tape un nom d'article qui n'est pas dans la liste en C2, il va bien dans la colonne "Article" de ma feuille "Liste". Cependant je n'arrive pas à ce que la catégorie indiqué en B2 au moment de la saisie s'inscrire à coté de l'article saisie (Et se trie automatiquement).

Pouvez-vous m'aider à finaliser ce code ? Il est sans doute loin d'être parfait et cohérent j'apprends sur le tas et j'essaye de le traduire en faisant des tests. Cela fait de nombreux jours que je bloque sur ce point.

Je vous remercie

6exemple-1.zip (16.29 Ko)

Bonjour et sur le forum,

je vois que tu as déjà su trouver de bonnes sources pour les lignes de code, personnellement je ne suis pas fan du site dont tu parles mais bon

En tout cas j'ai modifié un peu ton programme pour qu'il fonctionne comme tu le souhaites, je te laisse regarder les commentaires que j'ai mis aux endroits que j'ai changé.

Voici le fichier:

14exemple.zip (16.26 Ko)

Merci beaucoup pour ta réponse rapide.

Le programme marche pour la catégorie "Enrobé" mais quand je sélectionne "Bordure" cela ne fonctionne pas et je ne comprends pas pourquoi, as-tu une idée ? Cela fonctionne chez toi ?

Et autre petite question, comment faire pour que le tableau se trie en fonctionne de la colonne catégorie et non article ?

Re,

Ah mince...

Je craignais que le programme ne marche pas, je dois avouer que je ne le comprends pas à 100%, surtout que je ne comprends pas trop à quoi sert la partier application.match... Pour trier par catégorie il faut changer le paramètre suivant:

Key1:=f.Cells(2 + d, c)

il faudrait mettre Key1:=f.Cells(2 + d, c-1) d'après moi, à tester

Le tri fonctionne, merci

Ce que j'en ai déduit et ce que j'ai essayé de faire avec la ligne "(Application.Match(Target.Value, [choix2].Offset(d, 0), 0)) Then"

c'est de dire que la valeur saisie en C2 correspond à la catégorie dans le tableau "choix2" en bref cette ligne sert à faire le lien entre la valeur saisie et la catégorie mais je ne suis pas sur de moi ...

Edit : Je parle plutot de la ligne

d = Application.Match(Target.Offset(0, -1), [ListeCatégories], 0) - 1

Re,

Pour être honnête même après explication... j'ai du mal à voir à quoi sert cette ligne

Pourquoi tu dois vérifier tes données? Tu ne peux pas simplement faire une validation des données sur la cellule B2 pour être sûr que tu as bien une catégorige présente dans la liste je crois que passer ça en macro ce n'est pas une bonne idée si tu veux on peut déjà commencer par modifier ça, si je me penche vraiment à fond sur ton programme j'arriverai peut-être à te dire ce que tu peux enlever et ce que tu peux garder

Tu viens d'écrire ce que je veux faire mais je ne saurai pas le retraduire sur VBA ...

En fait à l'école j'ai tout appris sur OpenOffice durant mes études d'ingé mais arrivé en entreprise personne n'utilise ça et c'est un peu comme apprendre une autre langue j'ai l'impression

Le bon début c'est que ca marche pour une catégorie, je me creuse la tête mais j'arrive pas a voir pourquoi ça ne marche pas sur toute

J'ai tout supprimé ce que faisait référence à "d" et cela fonctionne parfaitement.

Je vais pouvoir intégrer cela à tout mon programme.

Merci pour ton aide !

Un dernier petit soucis quand même

Si je créé un tableau pour la catégorie et les articles dans la feuille "Listes", le tri ne fonctionne plus (Ce qui est logique).

Mais en enlevant le tri, la catégorie et l'article s'ajoute bien ensemble mais pas dans le tableau.

Une petite idée ?

je vois que tu as déjà su trouver de bonnes sources pour les lignes de code, personnellement je ne suis pas fan du site dont tu parles mais bon

tu es sérieux ou c'est du 22ème degré

Bonjour,

Oui j'ai une petite idée de pourquoi ça te fait ça

J'ai changé la déclaration de ton n:

n = f.Range("c" & Rows.Count).End(xlUp).Row + 1

ça va chercher la dernière ligne remplie sur la colonne C et ajoute 1 au numéro de ligne, voici le fichier avec la modification:

je vois que tu as déjà su trouver de bonnes sources pour les lignes de code, personnellement je ne suis pas fan du site dont tu parles mais bon

tu es sérieux ou c'est du 22ème degré

Je suis sérieux, je n'utilise jamais ce site, je préfère trouver le code moi-même ou aller voir sur le site développez.com par exemple Je suis allé une fois sur son site et les bouts de code qui sont partout ne m'inspirent pas du tout

Bonjour,

C'est bien cela qui m'a inspiré (comme beaucoup de sujet de ton site d'ailleurs, merci !), j'ai repris ton code et je l'ai adapté (avec l'aide de Ausecour) à mon tableau qui est différent du tiens (Voir mon exemple)

Mais le problème que j'ai maintenant c'est que cela ne fonctionne pas avec un format de tableau. Cela s'insert bien mais en dessous de mon tableau, ça ne s'intègre pas à celui ci. Je suis bloqué sur ce point (Voir fichier dans mon post précédant).

Merci

Bonjour,

Private Sub Worksheet_Change(ByVal Target As Range)
  Set f = Sheets("listes")
  If Target.Address = "$B$2" And Target.Count = 1 Then
    If Target <> "" Then
        If IsError(Application.Match(Target.Value, [choix1], 0)) Then
          If MsgBox("On ajoute?", vbYesNo) = vbYes Then
           [choix1].End(xlToRight).Offset(0, 1) = Target.Value
           c = f.Range("choix2").Column
           n = Application.CountA([choix1])
           f.Range(f.Cells(1, c), f.Cells(10, c + n)).Sort _
             Key1:=f.Cells(1, c), Order1:=xlAscending, Header:=xlNo, _
                Orientation:=xlLeftToRight
          Else
           Application.EnableEvents = False
           Application.Undo
           Application.EnableEvents = True
          End If
        Else
          Target.Offset(0, 1) = f.Range("choix2")(1).Offset(1, Application.Match(Target, [choix1], 0) - 1)
        End If
     End If
  End If
  If Target.Address = "$C$2" And Target.Count = 1 Then
     If Target <> "" Then
        d = Application.Match(Target.Offset(0, -1), [choix1], 0) - 1
        If IsError(Application.Match(Target.Value, [choix2].Offset(0, d), 0)) Then
          If MsgBox("On ajoute?", vbYesNo) = vbYes Then
           n = Application.CountA([choix2].Offset(0, d))
           c = f.Range("choix2").Column
           f.Cells(n + 1, c + d) = Target.Value
           If n > 1 Then
             f.Range(f.Cells(2, c + d), f.Cells(n + 1, c + d)).Sort _
              Key1:=f.Cells(2, c + d), Order1:=xlAscending, _
                 Orientation:=xlTopToBottom, Header:=xlNo
           End If
          Else
           On Error Resume Next
           Application.EnableEvents = False
           Application.Undo
           Application.EnableEvents = True
          End If
       End If
    End If
  End If
End Sub

Boisgontier

Bonjour,

C'est bien cela qui m'a inspiré (comme beaucoup de sujet de ton site d'ailleurs, merci !), j'ai repris ton code et je l'ai adapté (avec l'aide de Ausecour) à mon tableau qui est différent du tiens (Voir mon exemple)

Mais le problème que j'ai maintenant c'est que cela ne fonctionne pas avec un format de tableau. Cela s'insert bien mais en dessous de mon tableau, ça ne s'intègre pas à celui ci. Je suis bloqué sur ce point (Voir fichier dans mon post précédant).

Merci

Attention avec les tableaux, il faut éviter de le surdimensionner en lui donnant des lignes vides à l'avance, sinon ça va écrire en dessous de ces lignes, c'est peut-être ça le problème que tu rencontres?

Nickel ausecour, tu m'as bien aidé (J'avais pas vu ton message avant de poster ma réponse ce matin).

Et merci Jacques pour ton retour également. Le seul problème avec ta solution c'est que je ne peux pas rajouter des critères aux différents articles sous cette forme. Et le tri est plus difficile

Problème définitivement résolu !

Ah bon ben ça me rassure!

Je croyais que la solution que j'avais fournis ne fonctionnait pas la mise en garde que j'ai donné est toujours bonne par contre, les lignes de tableaux déclarés dans le gestionnaire de noms ne sont pas considérées comme vides par le code que j'utilise pour avoir la ligne sur laquelle écrire, du coup il faut éviter d'en intégrer dans ton tableau

>Et merci Jacques pour ton retour également. Le seul problème avec ta solution c'est que je ne peux pas rajouter des critères aux différents articles sous cette forme. Et le tri est plus difficile

Les ajouts se font automatiquement et le tri dans l'ordre alphabétiquement est effectué automatiquement

Boisgontier

Rechercher des sujets similaires à "insertion automatique liste"