Verifier si un nombre existe en utilisant .Find
Bonsoir,
Je rencontre un nouveau problème avec ma macro : Je souhaite vérifier si une valeur existe dans une autre worksheet en utilisant Cells.Find mais cela semble infructueux, je voudrais utiliser cette méthode car, si j'ai bien compris d'avoir un booléen en résultat (True/False), ou du moins un résultat que je peux aisément transformer en booléen, rendant l'interprétation de cette donnée plus simple pour la vérification.
Voici la partie qui à l'air de coincer :
'Attribution de toutes les variables
Sheets("Ventes 2022").Select
e = Cells.Find(What:=r2, After:=ActiveCell, LookIn:=xlValues, LookAt _
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
False, SearchFormat:=False).Select
Sheets("Stripe").Select
d = Cells(i, 3).Value2
d = Format(d, "mm/dd/yyyy")
r = Cells(i, 4).Value
r2 = Cells(i, 5).Value
'Vérifie que la ligne n'existe pas déjà dans 'Vente 2022'
'Si e = True alors la ligne N'EXISTE PAS, sinon MsgBox
If e <> 0 Then
MsgBox ("Erreur, La ligne " & i & " semble déjà exister dans 'Ventes 2022' ( n° " & r2 & " )")
ElseEt le code global sur lequel je travail (si cela peut vous aider...) :
Sub searchRefund()
'
' searchRefund Macro
'
'
Dim r&, i&, i2&, e&, r2
Dim d
i = 2
Sheets("Stripe").Select
'Check every lines
Do Until IsEmpty(Cells(i, 1)) = True
'Attribution de toutes les variables
Sheets("Ventes 2022").Select
e = Cells.Find(What:=r2, After:=ActiveCell, LookIn:=xlValues, LookAt _
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
False, SearchFormat:=False).Select
Sheets("Stripe").Select
d = Cells(i, 3).Value2
d = Format(d, "mm/dd/yyyy")
r = Cells(i, 4).Value
r2 = Cells(i, 5).Value
'Vérifie que la ligne n'existe pas déjà dans 'Vente 2022'
'Si e = True alors la ligne N'EXISTE PAS, sinon MsgBox
If e <> 0 Then
MsgBox ("Erreur, La ligne " & i & " semble déjà exister dans 'Ventes 2022' ( n° " & r2 & " )")
Else
'Check type to be 'Charge'
If Cells(i, 1).Value = "Charge" Then
End If
'Check type to be 'Refund'
If Cells(i, 1).Value = "Refund" Then
MsgBox (d)
MsgBox (r)
'Change de Sheet
Sheets("Ventes 2022").Select
'Filtre par la date du Refund
ActiveSheet.Range("$A$1:$AB$12569").AutoFilter Field:=1, Criteria1:=Array( _
"="), Operator:=xlFilterValues, Criteria2:=Array(2, d)
Cells(1, 1).Select
'Insert une nouvelle ligne à la fin
Selection.End(xlDown).Offset(1, 0).Select
Selection.EntireRow.Insert
'Récupère le numéro de la ligne créée
i2 = ActiveCell.row
'Supprime le filtre
ActiveSheet.Range("$A$1:$AB$12568").AutoFilter Field:=1
'Cherche la case avec le n° de commande
Cells.Find(What:=r, After:=ActiveCell, LookIn:=xlValues, LookAt:= _
xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
, SearchFormat:=False).Activate
'Copie/Colle la ligne trouvée
ActiveCell.EntireRow.Copy Selection.End(xlDown).Offset(1, 0).EntireRow
MsgBox (i2)
'Date (A)
Cells(i2, 1).Value2 = CDate(Format(d, "dd/mm/yyyy"))
'Numéro de commande (B)
Cells(i2, 2).Value = r & "bis"
'Total HT (I)
Sheets("Stripe").Select
var = Cells(i, 7).Value
Sheets("Ventes 2022").Select
Cells(i2, 9).Value = var / 1.2
'Total TVA (J)
Cells(i2, 10).Value = var * (1 / 6)
'Total TTC (K)
Cells(i2, 11).Value = var
'Expéditions (L->N)
Cells(i2, 12).Value = 0
Cells(i2, 13).Value = 0
Cells(i2, 14).Value = 0
'Total HT (O)
Cells(i2, 15).Value = var / 1.2
'Total TTC (P)
Cells(i2, 16).Value = var
'Commissions (Q->S)
Cells(i2, 17).Value = 0
Cells(i2, 18).Value = 0
Cells(i2, 19).Value = 0
'Montant versé après commissions (T)
Cells(i2, 20).Value = var
End If
End If
i = i + 1
Loop
End SubD'après mes 'recherches' actuelles,
Cells.Find(What:=r2, After:=ActiveCell, LookIn:=xlValues, LookAt _
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
False, SearchFormat:=False)Renvoie la valeur de la case r2, et une erreur si ça ne le trouve pas, et
Cells.Find(What:="", After:=ActiveCell, LookIn:=xlValues, LookAt _
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
False, SearchFormat:=False).SelectRenvoie un Vrai si cela trouve un match, et une erreur si ça ne trouve pas.
Merci d'avance pour votre aide !
Squirrel.
Bonjour
Il faut surtout éviter d'utiliser les ".Select", les "After:=ActiveCell", etc..
Voici le code qui devrait fonctionner
Dim CelF as Range
With Sheets("Ventes 2022")
Set CelF = Cells.Find(What:=r2, LookIn:=xlValues, LookAt:=xlWhole, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False)
If Not CelF Is Nothing then
Msgbox "Cellule trouvée" & CelF.row
Endif
End WithA+
Salut,
.Find renvoie un Objet Range voir doc Crosoft.
Donc déjà tu dois faire une affectation Set e= Cells.Find(What:=r2, After:=ActiveCell,.....
Ensuite tu teste si l'on a trouvé If Not e Is Nothing Then...
si tu crée une fonction tu peux renvoyer un Boolean MaFonction = Not e Is Nothing
Function MaFonction(Search As Variant, Optional sh) As Boolean
Dim e As Range
If IsMissing(sh) Then Set sh = ActiveSheet
Set e = sh.Cells.Find(What:=Search, LookIn:=xlValues, lookat:=xlPart)
MaFonction = (Not e Is Nothing)
End FunctionPetite modification avec la feuille...mais c'est vraiment minimaliste.
Merci énormément pour vos réponses, ça m'aide beaucoup,
J'ai toutefois deux questions qui me viennent :
C'est quoi comme variable Range ? Je comprends pas les caractéristiques de cette variable, et
Comment on implémente une fonction dans une macro ? Je suis tout nouveau dans ce language, j'ai commencé il y a 5jours et je n'ai pas encore tous les codes
Merci d'avance,
Squirrel.
Re,
Range en anglais est égal à plage donc une plage de cellules, qui peut être une seule ou bien plusieurs cellules.
pour la seconde question, aller dans l'environnement VBE, Alt +F11
Ensuite tu crée un module Menu Insertion/Module et tu colles la fonction. Mais je te conseille de faire un bout de lecture avant de foncer tête baissée dans la programmation, il existe plein de tutos sur la toile, et tu auras besoin des bases pour bien commencer.
Un site parmi tant d'autres Rubriques conceptuelles sur Visual Basic | Microsoft Docs