Rechercher un résultat après un .find

Etudiant -  
Frenchie83 Messages postés 2240 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

je cherche à faire un programme qui permettrai de vérifier si une ligne ( 2 données, supposons une date et un nom) est dans une plage de données, et si elle n'y est pas la rajouter.

j'ai donc essayé :

dim recherche as range
dim recherchedate as range
dim valeur as string
dim valdate as date

valdate = date
valeur = "test"

    set recherchedate =range("A1:B20").find(valdate, lookAt:=xlWhole)
    if not recherchedate is nothing then
        
        set recherche = recherchedate.find(valeur, lookAt:=xlWhole)
        if recherche is nothing then
            msgbox ("Test")
        end if
    else
        msgbox ("Test")
    end if


et bien entendu, ça ne marche pas :p

Prenons l'exemple suivant :

        Nom       14/08/2013
        Nom2     14/08/2013
        Nom       14/08/2013
        Nom2     15/08/2013

Je voudrais garder la première, deuxième et dernière ligne

Je suis parti du principe qu'un objet avec dimension range marchait de la même manière qu'une range, qui semble être un peu erronné
( en effet, quand j'essaie de faire recherchedate.find, ça m'a l'air de déconner un peu ^^)

Je cherche donc une méthode pour affiner une recherche, afin de vérifier si un groupe de résultat existe, quelqu'un pourrait-il m'expliquer s'il vous plait?

Merci!
A voir également:

9 réponses

Frenchie83 Messages postés 2240 Date d'inscription   Statut Membre Dernière intervention   338
 
Bonjour
essayez ceci
Sub TrouverValeurs()
Dim Recherche As Range
Dim RechercheDate As Range
Dim Valeur As String
Dim ValDate As Date
ValDate = Date
Valeur = "Test"
    With Range("B1:B20")
        Set x = .Find(ValDate, LookIn:=xlValues)
        If Not x Is Nothing Then
                PositionDepartDeX = x.Address
            Do
                x.Select
                If ActiveCell.Offset(0, -1).Value = Valeur Then 'on vérifie la présence de la valeur
                    MsgBox "Valeurs trouvées en ligne " & ActiveCell.Row
                    Exit Sub
                End If
Suivant:
                Set x = .FindNext(x) 'on recherche plus loin
            Loop While Not x Is Nothing And x.Address <> PositionDepartDeX
        End If
    End With
    
    'les valeurs n'ayant pas été trouvées, on les rajoutent en fond de liste
    Range("A1").End(xlDown).Offset(1, 0).Value = Valeur
    Range("A1").End(xlDown).Offset(0, 1).Value = ValDate
End Sub

les données sont en A1:B20
on recherche d'abord la date, si on la trouve, on regarde à gauche si le nom correspond à la valeur rechercher, si oui on sort du programme en annonçant à quelle ligne on se trouve. Si un des éléments est manquant, la date ou le nom (sur la même ligne) alors on le rajoute en fond de liste.
J'attire votre attention que dans votre code, la date que vous recherchez est toujours celle du jour en cours, est-ce bien ce que vous voulez ou bien choisissez-vous une date?
bonne journée
cdlt
0
Etudiant
 
Merci pour la réponse, je ne connaissais pas la méthode offset, du coup ça va m'aider !

Pour la date, j'ai pris une date simple pour l'exemple de code posté ( mon code étant légèrement plus long :p
Par contre, étant donné que je préfère travailler en option explicit, quel serait le type de
 PositionDepartDeX = x.Address 
?

Merci !
0
Frenchie83 Messages postés 2240 Date d'inscription   Statut Membre Dernière intervention   338
 
Bonjour
Dim PositionDepartDeX As String
cdlt
0
Etudiant
 
Bonjour,

après quelques jours d'expérimentation ( à rythme plus ou moins grand ^^') j'ai rencontré un petit problème que je ne comprends pas :

valdate = Range("I2").Value
    'Double Boucle de parcours d'un tableau
    For y = 5 To 11
        For x = 6 To 36 Step 3
            nom = Cells(x, y).Value
            modded = 0
        
            If nom <> "" Then
                Set recherchedate = Worksheets("Données").Range("D2:D10000").Find(valdate, lookat:=xlWhole)
                
                'Si on ne trouve rien avec la recherche de date, on ajoute directement les données
                If recherchedate Is Nothing Then
                    With Worksheets("Données")
                        .Range("A" & cpt).Value = nom
                        .Range("B" & cpt).Value = Cells(x + 1, y).Value
                        .Range("C" & cpt).Value = Cells(x + 2, y).Value
                        .Range("D" & cpt).Value = valdate
                    End With
                    cpt = cpt + 1
                
                'Si on trouve une valeur de date précédemment ajoutée, on cherche le nom associé aux dates trouvées
                Else
                    firstAdress = recherchedate.Address
                    Do
                        'Si on trouve le nom associé à la valeur, c'est qu'il n'y a pas besoin de l'ajouter
                        If recherchedate.Offset(0, -3).Value = nom Then
                            modded = 1
                        End If
                        Set recherchedate = recherchedate.FindNext
                    Loop While Not recherchedate Is Nothing And recherchedate.Address <> firstAdress
                
                    'Si le nom n'a pas été trouvé, alors on ajoute les données
                    If modded = 0 Then
                        With Worksheets("Données")
                            .Range("A" & cpt).Value = Cells(x, y).Value
                            .Range("B" & cpt).Value = Cells(x + 1, y).Value
                            .Range("C" & cpt).Value = Cells(x + 2, y).Value
                            .Range("D" & cpt).Value = valdate
                        End With

                        'Incrémentation de la variable pour écrire les données dans la bonne case excel
                        cpt = cpt + 1
                    End If
                End If
            End If
        Next x
    Next y





Ce code est sensé prendre les données sur une page, vérifier si elles ne sont pas déjà sur une autre page et enfin de les ajouter si elles n'y sont pas.

Mon problème est : cette vérification ne marche que pour une seule itération de la double boucle (et pas forcément la première), et je ne sais pas pourquoi...

Merci d'avance pour ceux qui voudrons bien se pencher sur le problème ^^
0
Frenchie83 Messages postés 2240 Date d'inscription   Statut Membre Dernière intervention   338
 
Bonjour

If Modded= 1, quand est-t-il réinitialisé à 0?

cdlt
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Etudiant
 
valdate = Range("I2").Value
    'Double Boucle de parcours d'un tableau
    For y = 5 To 11
        For x = 6 To 36 Step 3
            nom = Cells(x, y).Value
            modded = 0


au tout début de la double boucle
0
Frenchie83 Messages postés 2240 Date d'inscription   Statut Membre Dernière intervention   338
 
Re
effectivement, je ne l'avais pas vu.
il est difficile pour moi d'analyser n'ayant pas le fichier sous les yeux, mais
il y a quelque choese de bizarre, quand on sort de la première boucle, on repart avec des nouvelles valeurs de x et de y. ce qui signifie qu'on décale d'1 ligne mais aussi d'1 colonne, alors que les dates recherchées sont toujours dans la colonne D.
qu'en est-il exactement? si possible pourriez-vous mettre un échantillon de votre fichier sur Cjoint.com.
A+
0
Etudiant
 
http://cjoint.com/?3HuorXUa0Rz

Voici un échantillon du fichier pour vous aider à comprendre!
0
Frenchie83 Messages postés 2240 Date d'inscription   Statut Membre Dernière intervention   338
 
0
Etudiant
 
Après quelques modifications, ça marche comme je le souhaitais!
Donc, tout d'abord, merci pour votre aide!

Les principales différences entre votre programme et le mien étaient, si je ne me trompe pas :

- recherchedate.find -> recherchedate.find(recherchedate)
- mise de format sur la date

- On sélectionne la page données pour faire la recherche, puis on sélectionne la page précédente pour récupérer un autre nom

est-ce bien cela?

J'aimerais comprendre ou j'ai raté mon algorithme, et je suppose avec ces select que le problème venait de mon range.find :p
0
Frenchie83 Messages postés 2240 Date d'inscription   Statut Membre Dernière intervention   338
 
Bonjour
Effectivement, c'est bien ces quelques points qui créaient des soucis.
tout d'abord le format de la date: je lui ai imposé le format, car parfois il mettait un autre format.
RechercheFind: effectivement, il y a une nuance.
et on sélectionnne la feuille sur laquelle on veut faire une recherche.
A part ça, c'était tout bon.
bonne journée
cordialement
0