Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 03/02/2012, 17h31   #1
Invité de passage
 
Inscription : février 2012
Messages : 4
Détails du profil
Informations forums :
Inscription : février 2012
Messages : 4
Points : 0
Points : 0
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 :
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
bobby.bouchai est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2012, 18h25   #2
Membre chevronné
 
Avatar de defluc
 
Architecte
Inscription : mai 2002
Messages : 1 057
Détails du profil
Informations personnelles :
Âge : 62

Informations professionnelles :
Activité : Architecte

Informations forums :
Inscription : mai 2002
Messages : 1 057
Points : 745
Points : 745
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
defluc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/02/2012, 15h11   #3
Invité de passage
 
Inscription : février 2012
Messages : 4
Détails du profil
Informations forums :
Inscription : février 2012
Messages : 4
Points : 0
Points : 0
Ok, quel code à tu mis pour cette solution???
bobby.bouchai est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2012, 11h21   #4
Membre éprouvé
 
Homme Franck PRESSE
Inscription : août 2010
Messages : 202
Détails du profil
Informations personnelles :
Nom : Homme Franck PRESSE
Âge : 38
Localisation : France, Nord (Nord Pas de Calais)

Informations forums :
Inscription : août 2010
Messages : 202
Points : 444
Points : 444
Bonjour,

1-
Citation:
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 :
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-
Citation:
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...
__________________
Cordialement,
Franck P.


Ps : n'oubliez pas de placer vos posts comme "résolus" () si tel est le cas...
pijaku est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2012, 17h06   #5
Invité de passage
 
Inscription : février 2012
Messages : 4
Détails du profil
Informations forums :
Inscription : février 2012
Messages : 4
Points : 0
Points : 0
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 :
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!!!!
bobby.bouchai est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2012, 08h49   #6
Membre éprouvé
 
Homme Franck PRESSE
Inscription : août 2010
Messages : 202
Détails du profil
Informations personnelles :
Nom : Homme Franck PRESSE
Âge : 38
Localisation : France, Nord (Nord Pas de Calais)

Informations forums :
Inscription : août 2010
Messages : 202
Points : 444
Points : 444
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 :
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 :
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 :
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
__________________
Cordialement,
Franck P.


Ps : n'oubliez pas de placer vos posts comme "résolus" () si tel est le cas...
pijaku est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 09h44   #7
Invité de passage
 
Inscription : février 2012
Messages : 4
Détails du profil
Informations forums :
Inscription : février 2012
Messages : 4
Points : 0
Points : 0
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
bobby.bouchai est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 11h27   #8
Membre éprouvé
 
Homme Franck PRESSE
Inscription : août 2010
Messages : 202
Détails du profil
Informations personnelles :
Nom : Homme Franck PRESSE
Âge : 38
Localisation : France, Nord (Nord Pas de Calais)

Informations forums :
Inscription : août 2010
Messages : 202
Points : 444
Points : 444
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.
__________________
Cordialement,
Franck P.


Ps : n'oubliez pas de placer vos posts comme "résolus" () si tel est le cas...
pijaku est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h22.


 
 
 
 
Partenaires

Hébergement Web