Rechercher un résultat après un .find
Etudiant
-
Frenchie83 Messages postés 2254 Statut Membre -
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é :
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
- Resultat foot - Télécharger - Vie quotidienne
- Rechercher ou entrer l'adresse - Guide
- 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