Condition + recherche valeur dans liste

Résolu
Bonjour,

Merci d'avance...
En cellule L3, j'ai une date. je dois la comparer à une liste de date qui sont dans les cellules A13 à D28. Si elle ne se trouve pas dedans, je supprime la feuille (ça je sais).
J'ai fait un test avec une action plus simple mais ça ne marche pas. En fait ça marche si je la compare à 1 seule autre cellule :

Sub test()
If Sheets(1).Range("L3") <> Sheets(1).Range("A13") Then
Sheets(1).Range("B1") = Sheets(1).Range("A1")
End If
End Sub

Mais ça ne marche pas si je remplace "A13" par "A13:D28"

J'ai testé avec FIND mais je ne trouve pas la bonne combinaison. J'ai essayé de dire que si L3 ne se trouve pas dans A13 à D28 Alors... mais je n'y arrive pas.

Des idées?
(merci)

13 réponses

  1. Petite avancée en aprtant d'une formule utilisée dans d'autres conditions :
    Sub test()

    Set Cherche = Sheets(1).Range("L3")
    With Sheets(1).Range("A13:D28")
    Set trouve = .Find(Cherche)
    If Not trouve Is Nothing Then
    Sheets(1).Range("B1") = Sheets(1).Range("A1")
    End If
    End With

    End Sub
    1. En fait cette dernière formule marche, mais le "not " et "nothing" ça me pert... je sais pas si ça marche quand il le trouve ou s'il le trouve pas...
      1. bonjour

        quelque chose comme ça

        Const plage = "A1:A13"
        Dim d, dd
        d = Sheets(1).Range("A15").Value
        If Range(plage).Find(d) Is Nothing Then
          Range("B1").Value = "err"
        Else
          Range("B1").Value = d
        End If


        bonne suite
        1. Génial ! Ca marche comme ça! Merci beaucoup! Maintenant je dois la faire évoluer. Le principe est le suivant :
          Dans chaque feuille du classeur, je compare la date en L3 (de chaque feuille) à la liste existante dans la feuille 1. Si la date n'est pas dans la liste, je supprime la feuille.
          Du coup, ça devrait donner un truc comme ça :
          Sub test2()

          For Each Sheet In Workbooks("2ème Trimestre 2011.xls").Worksheets
          Const plage = Sheets(1).Range("A1:D28")
          Dim d, dd
          d = Sheet.Range("L3").Value
          If Range(plage).Find(d) Is Nothing Then
          Sheet.Delete
          End If
          Next
          End Sub

          Mais il me dit qu'il y a un problème, sûrement dans la manière de présenter la plage. mais je ne connais pas du tout la formule...
          1. Modérateur
            Salut
            Excusez l'incruste...
            Le problème vient peut être aussi de ta boucle sur toutes les feuilles...
            Essaie ceci :
            Sub machin() 
            Dim Feuille As Worksheet 
            For Each Feuille In ThisWorkbook.Worksheets 
            'bla bla 
            Next 
            End Sub


            ps : évitez les phrases comme : Mais il me dit qu'il y a un problème... C'est déroutant de précision. Ajoutez systématiquement le message d'erreur...au moins!
          2. Thisworkbook... j'avais pas pensé à ça ! Ca résout pas mon problème mais peut venir à bout d'autres! Merci
        2. J'ai essayé en remplaçant par :
          Const plage = Sheets(1).Range(.Cells(1, 13), .Cells(4, 28))
          Mais ça me met une erreur
          je ne connaît pas la bonne syntaxe
          (merci de votre aide)
          1. re

            pas trop le temps maintenant mais ceci me parait plus correct

            dim plage as range
            set plage = Sheets(1).Range(Cells(1, 13), Cells(4, 28))

            bonne suite
            1. ça va pas
          2. Ca c'est bon, il met met une erreur sur la suite ligne "If Range(plage).Find(d) Is Nothing Then " le message "La méthode 'range' de l'objet '_Global' a échoué "
            1. Je reviens sur la première variation
              "Const plage = Sheets(1).Range("A1:D28")"
              Il me met "Constante requise" en surlignant .Range
              1. j'ai trouvé ça : "D'après l'aide VBA, le type Range ne peut pas être affecté à une constante,
                ce qui se comprend, puisque ses propriétés peuvent varier."
                1. je peux peut être utiliser ça? "ActiveWorkbook.Names.Add Name:="MaPlage", RefersTo:="=MaFeuille!$B$10:$B$20""
                  1. Voilà ce qui marche !!! C'est un peu de bricolage, ya peut être plus simple, mais au moins ça marche ! Merci pour votre aide.

                    Sub test2()
                    Application.DisplayAlerts = False
                    ActiveWorkbook.Names.Add Name:="MaPlage", RefersTo:=Sheets(1).Range("A13:D28")

                    For Each Sheet In ThisWorkbook.Worksheets
                    Const plage = "MaPlage"

                    Dim d, dd
                    d = Sheet.Range("L3").Value
                    If Range(plage).Find(d) Is Nothing Then
                    Sheet.Delete
                    End If
                    Next
                    Application.DisplayAlerts = True
                    End Sub

                    Et hop !!
                    1. Modérateur
                      Si c'est juste la constante qui te gènait :
                      Dim MaPlage As Range
                      Set MaPlage = Sheets(1).Range("A13:D28") 
                      'bla bla
                      Set MaPlage = Nothing
                  2. re

                    un peu plus simple

                    Private Sub CommandButton1_Click()
                    Dim plage As Range
                    Dim d
                      Application.DisplayAlerts = False
                      Set plage = Sheets(1).Range(Cells(1, 13), Cells(4, 28))
                      plage.Select
                      For Each Sheet In ThisWorkbook.Worksheets
                        d = Sheet.Range("L3").Value
                        If plage.Find(d) Is Nothing Then
                           Sheet.Delete
                        End If
                      Next
                      Application.DisplayAlerts = True
                    End Sub


                    RQ2. Range("A13:D28") n'est pas égal à Range(Cells(1, 13), Cells(4, 28))

                    bonne suite