Rechercher un résultat après un .find
Etudiant
-
Frenchie83 Messages postés 2240 Date d'inscription Statut Membre Dernière intervention -
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é :
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!
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:
- Rechercher un résultat après un .find
- Rechercher ou entrer l'adresse - Guide
- Resultat foot - Télécharger - Vie quotidienne
- Find and mount - Télécharger - Récupération de données
- Rechercher image - Guide
- Rechercher un film par son histoire - Télécharger - Divers TV & Vidéo
9 réponses
Bonjour
essayez ceci
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
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
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
Merci !
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 !
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 :
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 ^^
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 ^^
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionvaldate = 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
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+
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+
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
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
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
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