Excel 2010 VBA - Fonction Like avec des dates

Résolu/Fermé
SpcCwb
Messages postés
65
Date d'inscription
mardi 7 mai 2013
Statut
Membre
Dernière intervention
26 novembre 2020
- Modifié le 7 nov. 2017 à 14:10
SpcCwb
Messages postés
65
Date d'inscription
mardi 7 mai 2013
Statut
Membre
Dernière intervention
26 novembre 2020
- 9 nov. 2017 à 09:42
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

f894009
Messages postés
16596
Date d'inscription
dimanche 25 novembre 2007
Statut
Membre
Dernière intervention
24 juin 2022
1 647
7 nov. 2017 à 16:18
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
f894009
Messages postés
16596
Date d'inscription
dimanche 25 novembre 2007
Statut
Membre
Dernière intervention
24 juin 2022
1 647
7 nov. 2017 à 16:28
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
SpcCwb
Messages postés
65
Date d'inscription
mardi 7 mai 2013
Statut
Membre
Dernière intervention
26 novembre 2020
1
7 nov. 2017 à 17:19
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
Yoda > SpcCwb
Messages postés
65
Date d'inscription
mardi 7 mai 2013
Statut
Membre
Dernière intervention
26 novembre 2020

7 nov. 2017 à 18:19
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
SpcCwb
Messages postés
65
Date d'inscription
mardi 7 mai 2013
Statut
Membre
Dernière intervention
26 novembre 2020
1 > Yoda
8 nov. 2017 à 09:42
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
f894009
Messages postés
16596
Date d'inscription
dimanche 25 novembre 2007
Statut
Membre
Dernière intervention
24 juin 2022
1 647 > SpcCwb
Messages postés
65
Date d'inscription
mardi 7 mai 2013
Statut
Membre
Dernière intervention
26 novembre 2020

8 nov. 2017 à 10:52
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
SpcCwb
Messages postés
65
Date d'inscription
mardi 7 mai 2013
Statut
Membre
Dernière intervention
26 novembre 2020
1 > f894009
Messages postés
16596
Date d'inscription
dimanche 25 novembre 2007
Statut
Membre
Dernière intervention
24 juin 2022

8 nov. 2017 à 10:58
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