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 & " )")

        Else

Et 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 Sub

D'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).Select

Renvoie 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 With

A+

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 Function

Petite 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

Rechercher des sujets similaires à "verifier nombre existe utilisant find"