Excel 2010 VBA - Fonction Like avec des dates

Résolu
SpcCwb Messages postés 67 Statut Membre -  
SpcCwb Messages postés 67 Statut Membre -
Bonjour,

Je n'ai pas trouvé de sujet traitant de la fonction Like appliquée à des dates, j'ai essayé de combiné plusieurs codes mais rien n'y fait.

Ce que je souhaite c'est compté dans une base de donnée le nombre de fois où une ANNEE apparaît dans une date en fonction d'une ANNEE saisie dans une cellule:

Exemple:

Base de données:

_______[Colonne A]______________________________[Cellule année cible] 2017
[ligne 1] 21/10/2017
[ligne 2] 19/03/2017
[ligne 3] 03/11/2017
[ligne 4] 17/08/2015
[ligne 5] 14/12/2017

Le résultat devrait donc être 4 (lignes 1,2,3 et 5)

J'ai essayé avec un bout de code comme ça (en gras pour la partie qui m'intéresse):
For Each c In pst8
If c.Offset(0, -10).Value = "" Then Exit For
If c.Value Like "*" & gdate.Value Then
g.Range("C15").Value = Range("C15").Value + 1
End If
Next c


Avec gdate la cellule contenant l'année cible, ici 2017

Sachant que j'ai besoin que l'année cible ne soit pas considérer comme une date, mais comme un nombre, c-a-d en l’occurrence 2017, pas 01/01/2017

J'ai essayé:
If c.Value Like "*&gdate.value"

If c.Value = Year(Date) = gdate.Value

If c.Value Like "" * " & gdate.Value"

If c.Value Like gdate.Value


L'un de vos brillants cerveaux aurait une solution? Je perds courage..

Merci d'avance!

Banzai!

2 réponses

  1. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717
     
    Bonjour,

    une facon de faire, a vous d'adapter pour plage, feuille et ......

    Sub test()
        With Worksheets("feuil1")
            Set plage = .Range("A1:A" & .Range("A" & Rows.Count).End(xlUp).Row)
            For Each cel In plage
                If Year(cel) = gdate Then
                    n = n + 1
                End If
            Next
            .Range("C15") = n
        End With
    End Sub
    0
  2. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717
     
    Re,

    en cherchant un peu:

    Sub test1()
        With Worksheets("feuil1")
            gdate = 2017
            Set plage = .Range("A1:A" & .Range("A" & Rows.Count).End(xlUp).Row)
            dd = ">=01/01/" & gdate: df = "<01/01/" & gdate + 1
            .Range("C15") = Application.CountIfs(plage, dd, plage, df)
        End With
    End Sub
    0
    1. SpcCwb Messages postés 67 Statut Membre 1
       
      Merci de ton retour, j'ai essayé d'adapté ton code mais à un moment ou un un autre ça ne colle pas avec le reste de ma macro.

      Comme je disais, la partie du code qui ne fonctionne pas c'est la partie qui compare la valeur de gdate avec la cellule c. Et je ne sais pas pourquoi, car en codant:
      if c.value like gdate.value
      je devrais quand même avoir une correspondance. Surtout si mes deux cellules, gdate et c sont toutes les deux en format TEXTE (oui j'ai essayé tous les formats et celui-ci me semble passe partout).
      car la cellule c contient une série de caractère comme: 10/10/2017 et gdate: 2017
      donc VBA devrait détecter que c contient bien ce qui est contenu en gdate.

      Je suis loin d'être un expert en VBA mais après ce que j'ai lu par-ci par-là je me dis qu'il doit bien y avoir un moyen d'écrire ce petit bout de code d'une façon à ce que j'obtienne ce que je désire...non?
      0
    2. Yoda > SpcCwb Messages postés 67 Statut Membre
       
      Bonjour

      Si c et gdate sont du texte, utilise la fonction Split pour séparer les termes de la date
      For Each c In pst8
      If c.Offset(0, -10).Value = "" Then Exit For
      Dim t() As String
      t() = Split(c.Value, "/")
      If t(2) = gdate.Value Then
      g.Range("C15").Value = Range("C15").Value + 1
      End If
      Next c


      Si c est une date et gdate un nombre, recupere l'année de la date
      For Each c In pst8
      If c.Offset(0, -10).Value = "" Then Exit For
      If Year(c.Value) = gdate.Value Then
      g.Range("C15").Value = Range("C15").Value + 1
      End If
      Next c

      ;o)
      0
    3. SpcCwb Messages postés 67 Statut Membre 1 > Yoda
       
      Merci Ô Maître Yoda pour ta sagesse. :o)

      J'ai essayé la deuxième solution (par mesure de précaution je préfère laissé les cellules c sous format date), ça a fonctionné, pendant un temps. Je n'arrive pas à trouver pourquoi ça ne fonctionne pas avec tous mes pst (dans le code envoyé c'est le 8e, j'en ai 10 en tout). Du coup je préfère t'envoyer le code "complet" pour voir si cela vient de mes variables.

      Sub usf7_poste()
      Dim c As Range
      Set f = Sheets("Recap.Equipe")
      Set g = Sheets("Reporting")
      Set gdate = g.Range("B3")
      Set pst1 = f.Range("G12:G" & f.[G65000].End(xlUp).Row)




      '#Poste1
      For Each c In pst1
      If c.Offset(0, -3).Value = "" Then Exit For 'si colonne NOM est vide alors on passe au pst suivant = colonne suivante
      If c.Value = "X" Then 'si cellule vide alors pas besoin de chercher la date de la cellule suivante
      If Year(c.Offset(-1, 0).Value) = gdate.Value Then
      g.Range("C8").Value = Range("C8").Value + 1
      End If
      End If
      Next c


      Je pourrai t'envoyer le fichier si ça peut t'aider.

      Merci encore!
      0
    4. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717 > SpcCwb Messages postés 67 Statut Membre
       
      Bonjour a vous deux,

      ceci marche tres bien, sans boucle, mais c'est vous qui voyez.....!!:

      Sub usf7_poste()
          
          Set f = Sheets("Recap.Equipe")
          Set g = Sheets("Reporting")
          Set gdate = g.Range("B3")
          Set pst1 = f.Range("G12:G" & f.[G65000].End(xlUp).Row)
          dd = ">=01/01/" & gdate: df = "<01/01/" & gdate + 1
          g.Range("C8") = Application.CountIfs(pst1, dd, pst1, df)
      
      End Sub
      0
    5. SpcCwb Messages postés 67 Statut Membre 1 > f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention  
       
      Bonjour f894009,

      Effectivement ton code fonctionne parfaitement. J'avais dû mal l'intégrer à mon code.

      Ce qui m'ennuie c'est que sans boucle je ne vois pas comment inclure la condition que le compteur ne prenne en compte la date que si la cellule du dessus contient un "X", comme ici

      For Each c In pst1
      If c.Offset(0, -3).Value = "" Then Exit For 'si colonne NOM est vide alors on passe au pst suivant = colonne suivante
      If c.Value = "X" Then 'si cellule vide alors pas besoin de chercher la date de la cellule suivante
      0