Rechercher un résultat après un .find

Etudiant -  
Frenchie83 Messages postés 2254 Statut Membre -
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!

9 réponses

  1. Frenchie83 Messages postés 2254 Statut Membre 339
     
    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
  2. 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
    1. Frenchie83 Messages postés 2254 Statut Membre 339
       
      Bonjour
      Dim PositionDepartDeX As String
      cdlt
      0
  3. 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
  4. Frenchie83 Messages postés 2254 Statut Membre 339
     
    Bonjour

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

    cdlt
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. 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
  7. Frenchie83 Messages postés 2254 Statut Membre 339
     
    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
  8. Etudiant
     
    http://cjoint.com/?3HuorXUa0Rz

    Voici un échantillon du fichier pour vous aider à comprendre!
    0
  9. 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
    1. Frenchie83 Messages postés 2254 Statut Membre 339
       
      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