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..
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.
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.
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.
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.
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?
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. :)
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.
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.
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.