Condition + recherche valeur dans liste

Résolu
bthenault Messages postés 58 Statut Membre -  
bthenault Messages postés 58 Statut Membre -
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. bthenault Messages postés 58 Statut Membre 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
    0
  2. bthenault Messages postés 58 Statut Membre 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...
    0
  3. ccm81 Messages postés 11033 Statut Membre 2 434
     
    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
    0
  4. bthenault Messages postés 58 Statut Membre 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...
    0
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      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!
      0
    2. bthenault Messages postés 58 Statut Membre 1
       
      Thisworkbook... j'avais pas pensé à ça ! Ca résout pas mon problème mais peut venir à bout d'autres! Merci
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. bthenault Messages postés 58 Statut Membre 1
     
    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)
    0
  7. ccm81 Messages postés 11033 Statut Membre 2 434
     
    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
    0
    1. bthenault Messages postés 58 Statut Membre 1
       
      ça va pas
      0
  8. bthenault Messages postés 58 Statut Membre 1
     
    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é "
    0
  9. bthenault Messages postés 58 Statut Membre 1
     
    Je reviens sur la première variation
    "Const plage = Sheets(1).Range("A1:D28")"
    Il me met "Constante requise" en surlignant .Range
    0
  10. bthenault Messages postés 58 Statut Membre 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."
    0
  11. bthenault Messages postés 58 Statut Membre 1
     
    je peux peut être utiliser ça? "ActiveWorkbook.Names.Add Name:="MaPlage", RefersTo:="=MaFeuille!$B$10:$B$20""
    0
  12. bthenault Messages postés 58 Statut Membre 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 !!
    0
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      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
      0
  13. ccm81 Messages postés 11033 Statut Membre 2 434
     
    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
    0
  14. bthenault Messages postés 58 Statut Membre 1
     
    :) Super
    0