Chercher un valeur. (problème Find) [Résolu]

Signaler
-
 BIOoOAG123 -
Bonjour à tous,

J'ai un ptit code pour chercher un valeur il s'il ne trouve pas cette valeur dans la plage données il me la rajoute à la suite.

J'essaye avec find mais je ne comprend pas grand chose.. en gros ça donne ça :


Sub traitement()
Dim j As Integer
Dim Valeur As String
Dim aCell As Range


j = 74
For i = 3 To 6000 Step 1
    Valeur = Worksheets(5).Range("B" & i).Value 'Valeur que je souhaite chercher, qui est variable d'ailleur
    

'Dans la plage Sheets(1).Range("A74:A200")
    Set aCell = Worksheets(1).Range("A74:A200").Find(xlWhat:=Valeur, xlAfter:=xlValues, xlLookIn:=xlWhole, XlLookAt:=xlByColumns, XlSearchOrder:=xlNext)
    If Not aCell Is Nothing Then
    Worksheets(1).Range("A" & j).Value = Valeur
    End If
     
Next
End Sub


Déjà il me dit qu'il y a une erreur sur le Set.
J'ai beau chercher sur le forum et site je galère à comprendre comment Find fonctionne et à creer le code..

16 réponses

Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
18
oops
Effectivement, c'est What tout court... mauvaise copie

Finalement, utiliser ceci

Set aCell Worksheets(1).Range("A74:A200").Find( What :Valeur, LookIn:=xlValues, LookAt:=xlWhole)

On va finir par y arriver...

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
234
Bonjour,
1) il est probable que ta cellule B & i contient le résultat d'une formule. Si tel est le cas, c'est sa propriété Text et non Value qu'il faut utiliser dans ton Find !
2) en outre :
tu écris :
s'il ne trouve pas cette valeur dans la plage données il me la rajoute à la suite

or : ton code ferait exactement le contraire !:
If Not aCell Is Nothing

veut dire : s'il l'a trouvée !
3) pourquoi passer par l'utilisation de Find ??? Alors que COUNTIF (WorkSheetFunction.countif, à voir dans ton aide en ligne) ferait merveilleusement l'affaire (retournerait 0 si valeur absente) et de manière beaucoup plus rapide.
Travaille sur ces bases.
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
234
Et je n'avais pas lu, en plus ton code du Find !
Il sera toujours faux !
A commencer par ces constantes inexistantes : xlWhat, xlAfter, xlLookIn, XlLookAt, XlSearchOrder ! Tu les as inventées ?
A continuer par le second paramètre (même avec la bonne constante) !
Tu devrais réellement te plonger un peu dans la lecture de la rubrique Range.find !
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
18
Je pense que tu t'es trompé un peu sur les valeurs de paramètres...

Set aCell = Worksheets(1).Range("A74:A200").Find(xlWhat:=Valeur, xlAfter:=xlValues, xlLookIn:=xlWhole, XlLookAt:=xlByColumns, XlSearchOrder:=xlNext)


Essaie comme ceci
Set aCell = Worksheets(1).Range("A74:A200").Find(xlWhat:=Valeur, LookIn:=xlValues, LookAt:=xlWhole)

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
18
Désolé pour le formatage jaune... erreur de ma part...
Toujours est-il que tout ce qui est jaune n'est pas bon...


MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
234
Bonjour, MPI,
Chez moi les xlWhat etc... n'existent pas.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
234
Bien, MPi,
Voilà une correction faite, mais juste pour le principe de la correction.
Il RESTE que voilà bien un cas où il a très largement intérêt à ne pas utiliser la méthode Find, mais ce que je lui ai exposé au point 3 de mon tout premier message (beaucoup plus rapide ... et ... facile ...)


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Merci pour vos réponses, je vais essayer de corriger mon code et de mieux comprendre cette fichue fonction .Find et je vous dit si j'ai réussi! :)
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
234
1) la fonctionMéthode
Find n'est pas "fichue". Elle est, elle, clairement exposée dans l'aide VBA et parfaitement supportée par l'intellisense ! Va alors falloiur chercher ailleurs ce qui est "fichu", hein ...
2) j'insiste : il est ici nettement préférable d'utiliser WorkSheetFunction.CountIf (également clair et également parfaitement exposé dans l'aide VBA).

PS ; que dit le mauvais ouvrier de ses outils ? Il dit qu'ils sont mauvais ....


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Ca améliorer bien la (toutes mes) macro :), mais je reviens sur ce que je viens de dire, en fait la macro rame(20 seconde tout de même) lorsqu'elle rencontre le End Sub?
C'est pas une histoire de cache ou un truc dans le genre?
dsl trompé de topic...
Merci pour votre aide, j'ai réussi à régler mon problème avec .Find,

Dim Valeur As Variant
Dim aCell As Range
Dim NbLigne As Integer

On Error GoTo Fin


'**************** Find ***************************************************
For i = 3 To 6000 Step 1
    Valeur = Worksheets(5).Range("B" & i).Value
    NbLigne = Sheets(1).Cells(65536, 1).End(xlUp).Row
    With ActiveSheet.Range("A74:A200")
        Set aCell = .Find(What:=Valeur, LookIn:=xlValues, LookAt:=xlWhole)
        If aCell Is Nothing Then
        Worksheets(1).Range("A" & NbLigne + 1).Value = Valeur
        End If
    End With
Next
...


J'ai noté sur mon mémo que l'on pouvait utiliser CountIf mais vu que c'est dans un très petit tableau Find est suffisamment rapide. :)
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
234
Maintenant, regarde ===>>
remplace
For i = 3 To 6000 Step 1
    Valeur = Worksheets(5).Range("B" & i).Value
    NbLigne = Sheets(1).Cells(65536, 1).End(xlUp).Row 'maladroit de faire ainsi dans la boucle
    With ActiveSheet.Range("A74:A200")
        Set aCell = .Find(What:=Valeur, LookIn:=xlValues, LookAt:=xlWhole)
        If aCell Is Nothing Then
        Worksheets(1).Range("A" & NbLigne + 1).Value = Valeur
        End If
    End With
Next

par
NbLigne = Sheets(1).Cells(65536, 1).End(xlUp).Row ' on ne fait cela qu'une fois
For i = 3 to 6000
  Valeur = Worksheets(5).Range("B" & i).Value
  If WorksheetFunction.CountIf(ActiveSheet.Range("A74:A200"), valeur = 0 then
   Worksheets(1).Range("A" & NbLigne + 1).Value = Valeur
   nbligne = nbligne + 1
  end if
next

(je t'en avais pourtant parlé ! Ton appli souffrira moins).
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
234
corrige ce que j'ai écrit à main levée (manque une virgule ici :
If WorksheetFunction.CountIf(ActiveSheet.Range("A74:A200"), valeur)
= 0 then


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
18
BIOoOAG123,
si jamais, malgré les bons conseils de ucfoutu, tu décidais de conserver ta méthode, n'oublie pas de mettre à la fin de la procédure
Set aCell = Nothing

Ceci est valable pour toutes les variables (objets) que tu initialises avec SET


MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
Effectivement ça marche quand même mieux! Je le note aussi le : Set aCell = Nothing pour plus tard. Je vais vérifier d'ailleurs dans mes codes si j'ai pas ce cas avec set.