IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Trouver les lignes récurrentes VBA


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Février 2012
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Février 2012
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Trouver les lignes récurrentes VBA
    Bonjour,

    Je suis en train de développer une boite de dialogue useform permettant de remplir via cette boite un tableau excel.
    Cette boite permet aussi via une fonction de recherche d'une valeur dans une colonne A, de faire apparaitre dans les autres textbox les valeurs d'autres colonnes (B,C,D,E,etc...) de la ligne correspondant à ma valeur recherchée.

    Cependant, mon problème est que ma valeur recherché peut apparaitre sur plusieurs lignes, il faudrait donc que dans ce cas de doublons, une combobox apparaisse avec les valeurs de la colonne B correspondante aux lignes doublons ( valeurs de la colonne A). Ainsi je pourrais en choisissant une valeur parmi cette liste (sorte de filtre) faire afficher les valeurs des autres colonnes de la même ligne dans mes autres txtbox.

    Voici comment je récupère les valeurs des cellules pour les visualiser dans mes textbox.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    With Sheets("SUIVI").Columns(1) 'Dans la feuille données, colonne A
    'cherche la valeur contenue dans TxtDDMO_MAJ et renvoie son numéro de ligne
    i = .Cells.Find(TxtDDMO_MAJ).Row
     
    'renvoie dans chaque textbox la valeur contenue dans la cellule (ligne colonne) correspondante
    Txtdesignationpiece = Cells(i, 6).Value
    TxtQuantite = Cells(i, 8).Value
    Txtfourn = Cells(i, 12).Value
    Txtdatedevis = Cells(i, 11).Value
    Voilà en espérant avoir été clair, et que quelqu'un peut venir à mon aide...

    Je vous remercie par avance.

    Benoît

  2. #2
    Membre éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Points : 1 199
    Points
    1 199
    Par défaut
    J'ai une application similaire.
    Une fois la première valeur trouvée dans la colonne, je cherche si cette valeur existe plus loin. Si c'est le cas, j'applique un traitement permettant un affichage des cellules voulues.

    Il est ainsi possible de stocker les n° de ligne pour un usage correspondant à ce que l'on souhaite

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Février 2012
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Février 2012
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Ok, quel code à tu mis pour cette solution???

  4. #4
    Membre émérite
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 816
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 816
    Points : 2 954
    Points
    2 954
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    1-
    Cependant, mon problème est que ma valeur recherché peut apparaitre sur plusieurs lignes, il faudrait donc que dans ce cas de doublons, une combobox apparaisse avec les valeurs de la colonne B correspondante aux lignes doublons ( valeurs de la colonne A).
    Alors pourquoi ne pas remplacer ton TextBox "Txtdesignationpiece" par une ComboBox. Si tu n'as pas de doublon, elle ne contient qu'un seul item, si doublons alors plusieurs choix seront possibles... Ne pas oublier cependant de vider cette ComboBox (ComboBox1.Clear) à chaque nouvelle valeur saisie dans ton TextBox "TxtDDMO_MAJ"...

    2- Tu utilises la méthode Find à partir de la saisie dans un textbox par un utilisateur. S'il y a erreur de saisie, le code va planter (sauf si l'on traite l'erreur par On Error blabla...). Pour contourner ce problème, il convient, au lieu de chercher tout de suite le n° de ligne (i = .Cells.Find(TxtDDMO_MAJ).Row), de chercher l'objet Range contenant la valeur cherchée. Si la macro ne trouve pas ton Range, elle ne plantera pas.
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Dim MonRangeContenantLaValeurQueJeCherche As Range
    Dim Lign As Long
     
    With Sheets("SUIVI")
        Set MonRangeContenantLaValeurQueJeCherche = .Columns(1).Cells.Find(TxtDDMO_MAJ)
        If MonRangeContenantLaValeurQueJeCherche Is Nothing Then
            MsgBox "Valeur non trouvée"
        Else
            Lign = MonRangeContenantLaValeurQueJeCherche.Row
        End If
    End With
    3-
    ma valeur recherché peut apparaitre sur plusieurs lignes
    Une solution serait de voir du côté de Find.Next.

    ==> Change ton TextBox ("Txtdesignationpiece") par une ComboBox, corrige ton code "Find", regarde Find.Next de ton côté, et reviens pour plus de renseignements...

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Février 2012
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Février 2012
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    J'ai essayé le find.next, avec le code exemple dans l'aide de VBA, mais j'ai une erreur à chaque fois, au niveau du "set c = ..."
    Pour la combobox, le problème est que ma textbox "Txtdesignationpiece" sert dans la cas de l'ajout de ligne de mon tableau. C'est pour cela que je souhaite utiliser une listbox ou combobox permettant de choisir une valeur de la colonne désignationpiece dans le cas d'un doublon sur ma txtbox "txtDDMO_MAJ".

    En fait, il me faudrait récuperer les lignes des doublons et permettre le choix de la ligne, et c'est la que je bloque. Je ne sais pas comment stocker tout mes doublons dans une variables et les afficher dans la combobox ensuite.

    Merci pour la modif du range, en effet c'est plus stable en cas d'erreur de saisie.

    Bon j'ai essayé d’intégrer le find next, mais maintenant j'ai une erreur, impossible d'afficher le useform 2 et ma listbox.AddItem ne fonctionne pas non plus.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    With Sheets("SUIVI")
        Set MonRangeContenantLaValeurQueJeCherche = .Columns(1).Cells.Find(TxtDDMO_MAJ)
        If MonRangeContenantLaValeurQueJeCherche Is Nothing Then
            MsgBox "Valeur non trouvée"
        Else
            firstAddress = MonRangeContenantLaValeurQueJeCherche.Address
        Do
            i = MonRangeContenantLaValeurQueJeCherche.Row
     
            ListBox1.AddItem.Range("F1").Offset (i)
     
           Set MonRangeContenantLaValeurQueJeCherche = Find.Next(MonRangeContenantLaValeurQueJeCherche)
        Loop While Not MonRangeContenantLaValeurQueJeCherche Is Nothing And MonRangeContenantLaValeurQueJeCherche.Address <> firstAddress
     
      useform2.Show
     
        End If
     
        .Cells(V, 13).Value = txtstatut.Value
        .Cells(V, 14).Value = Txtdateprev.Value
        .Cells(V, 15).Value = Txtreçuele.Value
        .Cells(V, 16).Value = reçuepar.Value
        .Cells(V, 19).Value = Txtcommande.Value
        .Cells(V, 17).Value = Txtprix.Value
        End With
     
    ListBox1.Clear
     
    End If
     
        Unload Me
     
    End Sub
     
     
    Private Sub OK_Click()
     
    Dim V As Integer
     
    V = Cells.Find(ListBox1).Row
     
    End Sub
    J'ai crée ma listbox sur un useform2, que j'aurai à chaque recherche meme si pas de doublons, afin de simplifier le code.

    Cependant j'ai encore quelques soucis pour l'afficher et je comprend pas pourquoi!!!!

  6. #6
    Membre émérite
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 816
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 816
    Points : 2 954
    Points
    2 954
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    Tes erreurs :
    Lorsque tu veux remplir la listbox d'un second UserForm à partir du premier, il faut préciser l'userform en question. Par défaut, VBA pense que tu veux remplir la listbox1 de l'usf1 qui n'existe pas ===> plantage. D'ou :
    UserForm2.ListBox1.AddItem
    La syntaxe également :
    Find.Next n'existe pas. Voir FindNext
    Ne pas oublier l'espace après AddItem :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UserForm2.ListBox1.AddItem .Range("B" & RngCherché.Row)
    Un exemple qui fonctionne :
    1 userform comprenant : 1 combobox et des textbox
    1 userform comprenant : 1 listbox

    Code de l'Userform1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    Option Explicit
    'Cette variable sert à ne pas déclencher la procédure
    'ComboBox1_Change lors du chargement de l'Userform
    Dim Test As Boolean
     
    'Procédure déclenchée au chargement de l'Userform1
    Private Sub UserForm_Initialize()
    Dim Lig As Long, DrLig As Long
    Dim Cell As Range
     
    Test = False
    'remplissage de la combobox "référence" sans doublons
        'cf : http://excel.developpez.com/faq/?page=OleObject#DoublonComboBox
    DrLig = Sheets(1).Range("A" & Rows.Count).End(xlUp).Row
    'Supprime les données existantes dans le ComboBox
    ComboBox1.Clear
    'Boucle sur les cellules de la colonne A pour
    'alimenter le ComboBox
    For Each Cell In Sheets(1).Range("A2:A" & DrLig)
        ComboBox1 = Cell
        'remplissage sans doublon
        If ComboBox1.ListIndex = -1 Then ComboBox1.AddItem Cell
    Next Cell
    ComboBox1.ListIndex = -1
    Test = True
    End Sub
     
    'Procédure déclenchée  à chaque changement dans la ComboBox1 (références)
    Private Sub ComboBox1_Change()
    Dim RngCherché As Range
    Dim firstAddress As String
     
    If ComboBox1 = "" Or Test = False Then Exit Sub
    UserForm2.ListBox1.Clear
    With Sheets(1)
        Set RngCherché = .Columns(1).Cells.Find(ComboBox1, lookat:=xlWhole)
        If RngCherché Is Nothing Then
            MsgBox "Valeur non trouvée"
        Else
            firstAddress = RngCherché.Address
            Do
                UserForm2.ListBox1.AddItem .Range("B" & RngCherché.Row)
                Set RngCherché = .Columns(1).Cells.FindNext(RngCherché)
            Loop While Not RngCherché Is Nothing And RngCherché.Address <> firstAddress
        End If
    End With
    Set RngCherché = Nothing
    UserForm2.Show
    End Sub
    Code de l'UserForm2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Option Explicit
     
    Private Sub ListBox1_Click()
    'cf : http://silkyroad.developpez.com/VBA/ControlesUserForm/#LII-G
    If ListBox1.ListIndex = -1 Then Exit Sub
    UserForm1.TextBox1.Value = ListBox1.List(ListBox1.ListIndex)
    UserForm2.Hide
    End Sub
    Un classeur exemple

  7. #7
    Nouveau Candidat au Club
    Inscrit en
    Février 2012
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Février 2012
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Merci beaucouP de ton aide, c'est bon j'ai reussi a faire ce que je voulais en utilisant et adaptant ton code.
    Il me reste juste une Petite chose a voir, afin de fiabiliser la reponse. Pour afficher mes autres txtbox il faut que je ressorte la ligne du choix fait dans la listbox, donc je vais modifier la listbox en 2colonnes en cachant la deuxieme colonne qui aura les numeros de lignes des recherches faites avec le find. J'utiliserai donc ces valeurs pour afficher les autres txtbox...
    Je reviens vers toi si j'ai des difficultés.

    Merci encore

  8. #8
    Membre émérite
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 816
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 816
    Points : 2 954
    Points
    2 954
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    De rien...

    Avant de te lancer tête baissée dans une listbox multicolonnes ou de multiplier les contrôles dans ton userform, je te recommande vivement la lecture de ce tutoriel sur les contrôles d'userform. regarde tout ce qu'il est possible de faire avec avant de réaliser ton projet.

    Sinon n'hésite pas à poser toutes les questions nécessaires.

Discussions similaires

  1. Trouver les lignes suivant une date d'expiration
    Par nesswaw dans le forum Requêtes
    Réponses: 9
    Dernier message: 11/05/2012, 18h17
  2. Trouver les lignes en fonction d'un écart de date
    Par StringBuilder dans le forum SQL
    Réponses: 11
    Dernier message: 20/02/2012, 20h49
  3. Réponses: 17
    Dernier message: 09/02/2010, 16h22
  4. Réponses: 5
    Dernier message: 06/11/2007, 13h58
  5. Comment comparer 2 tables et trouver les lignes différentes
    Par PierreYvesQc dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 07/08/2007, 21h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo