Signaler

Excel 2010 VBA - Fonction Like avec des dates [Résolu]

Posez votre question SpcCwb 34Messages postés mardi 7 mai 2013Date d'inscription 9 novembre 2017 Dernière intervention - Dernière réponse le 9 nov. 2017 à 09:42 par SpcCwb
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!
Utile
+0
plus moins
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
Donnez votre avis
Utile
+0
plus moins
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
SpcCwb 34Messages postés mardi 7 mai 2013Date d'inscription 9 novembre 2017 Dernière intervention - 8 nov. 2017 à 17:50
Donc le voilà, je ne savais pas si c'était autorisé de copier un lien d'un autre site.

http://www.cjoint.com/c/GKiqV2qEqVI

La macro que j'essaie de faire actuellement est une option d'un tout plus grand, c'est pourquoi je ne peux pas changer les cellules ou autre.

http://www.cjoint.com/c/GKiqV2qEqVI

Comme je l'avais préciser à un peu avant, j'aimerai que la macro compte le nombre de fois où la date cible (gdate) apparaît dans les ranges pst1, pst2,... de l'onglet Recap. Equipe mais uniquement si la cellule du dessus contient un X majuscule.

En sachant que votre macro ne fonctionnera pas si dans le loop apparaît une case vide ou en format texte, j'ai voulu écrire quelque chose comme la ligne en gras pour que la macro puisse fonctionner (en ne traitant au final que les cellules qui m'intéressent: ici la ligne 13, et si mon tableau est plus long, les lignes 18, 23, 28,...

'#Poste1
For Each c In pst1
If c.Offset(0, -3).Value = "" Then Exit For 'pour mettre fin au loop lorsque j'arrive en fin de tableau
If c.value="" or c.value="X" then continue for 'pour éviter que VBA ne tente d'éxecuter la ligne suivante sur des cellules qui ne sont pas en format date ou qui sont vides
If Year(c.Value) = gdate.Value and c.offset(-1,0).value="X" Then
g.Range("C8").Value = Range("C8").Value + 1
End If
Next c
Répondre
Yoda- 8 nov. 2017 à 19:07
Macro corrigée
avant chaque for each, j'ai reinitialisé le cellule de comptage
Range("C9").Value = ""

j'ai mis un test supplémentaire
 If IsDate(c.Value) And c.Offset(-1, 0).Value = "X" Then

si la cellule c est une date et la cellule au-dessus est un X ...

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)
Set pst2 = f.Range("H12:H" & f.[H65000].End(xlUp).Row)
Set pst3 = f.Range("I12:I" & f.[I65000].End(xlUp).Row)
Set pst4 = f.Range("J12:J" & f.[J65000].End(xlUp).Row)
Set pst5 = f.Range("K12:K" & f.[K65000].End(xlUp).Row)
Set pst6 = f.Range("L12:L" & f.[L65000].End(xlUp).Row)
Set pst7 = f.Range("M12:M" & f.[M65000].End(xlUp).Row)
Set pst8 = f.Range("N12:N" & f.[N65000].End(xlUp).Row)
Set pst9 = f.Range("O12:O" & f.[O65000].End(xlUp).Row)
Set pst10 = f.Range("P12:P" & f.[P65000].End(xlUp).Row)


'#Poste1
For Each c In pst1
If c.Offset(0, -3).Value = "" Then Exit For 'pour mettre fin au loop lorsque j'arrive en fin de tableau
If IsDate(c.Value) And c.Offset(-1, 0).Value = "X" Then
If Year(c.Value) = gdate.Value Then
g.Range("C8").Value = Range("C8").Value + 1
End If
End If
Next c

'#Poste2
Range("C9").Value = ""
For Each c In pst2
If c.Offset(0, -4).Value = "" Then Exit For
If IsDate(c.Value) And c.Offset(-1, 0).Value = "X" Then
If Year(c.Value) = gdate.Value Then
g.Range("C9").Value = Range("C9").Value + 1
End If
End If
Next c

'#Poste3
Range("C10").Value = ""
For Each c In pst3
If c.Offset(0, -5).Value = "" Then Exit For
If IsDate(c.Value) And c.Offset(-1, 0).Value = "X" Then
If Year(c.Value) = gdate.Value Then
g.Range("C10").Value = Range("C10").Value + 1
End If
End If
Next c

'#Poste4
Range("C11").Value = ""
For Each c In pst4
If c.Offset(0, -6).Value = "" Then Exit For
If IsDate(c.Value) And c.Offset(-1, 0).Value = "X" Then
If Year(c.Value) = gdate.Value Then
g.Range("C11").Value = Range("C11").Value + 1
End If
End If
Next c

'#Poste5
Range("C12").Value = ""
For Each c In pst5
If c.Offset(0, -7).Value = "" Then Exit For
If IsDate(c.Value) And c.Offset(-1, 0).Value = "X" Then
If Year(c.Value) = gdate.Value Then
g.Range("C12").Value = Range("C12").Value + 1
End If
End If
Next c

'#Poste6
Range("C13").Value = ""
For Each c In pst6
If c.Offset(0, -8).Value = "" Then Exit For
If IsDate(c.Value) And c.Offset(-1, 0).Value = "X" Then
If Year(c.Value) = gdate.Value Then
g.Range("C13").Value = Range("C13").Value + 1
End If
End If
Next c

'#Poste7
Range("C14").Value = ""
For Each c In pst7
If c.Offset(0, -9).Value = "" Then Exit For
If IsDate(c.Value) And c.Offset(-1, 0).Value = "X" Then
If Year(c.Value) = gdate.Value Then
g.Range("C14").Value = Range("C14").Value + 1
End If
End If
Next c

'#Poste8
Range("C15").Value = ""
For Each c In pst8
If c.Offset(0, -10).Value = "" Then Exit For
If IsDate(c.Value) And c.Offset(-1, 0).Value = "X" Then
If Year(c.Value) = gdate.Value Then
g.Range("C15").Value = Range("C15").Value + 1
End If
End If
Next c

'#Poste9
Range("C16").Value = ""
For Each c In pst9
If c.Offset(0, -11).Value = "" Then Exit For
If IsDate(c.Value) And c.Offset(-1, 0).Value = "X" Then
If Year(c.Value) = gdate.Value Then
g.Range("C16").Value = Range("C16").Value + 1
End If
End If
Next c

'#Poste10
Range("C17").Value = ""
For Each c In pst10
If c.Offset(0, -12).Value = "" Then Exit For
If IsDate(c.Value) And c.Offset(-1, 0).Value = "X" Then
If Year(c.Value) = gdate.Value Then
g.Range("C17").Value = Range("C17").Value + 1
End If
End If
Next c

End Sub
Répondre
SpcCwb 34Messages postés mardi 7 mai 2013Date d'inscription 9 novembre 2017 Dernière intervention - 9 nov. 2017 à 08:43
Super. *Clap clap clap clap clap trap*
Merci beaucoup à vous deux, c'est exactement ce que je voulais. J'aimerai pouvoir vous payer une tourner pour vous remercier, si l'un d'entre vous est du côté de Tours qu'il me MP, ce sera avec plaisir.

Encore merci pour votre aide. A une prochaine fois!
Répondre
Yoda- 9 nov. 2017 à 09:38
Merci pour le verre, on le boira virtuellement
Après coup, je m’aperçois que j'ai fait un oubli, tu auras déjà corrigé je pense

'#Poste1
Range("C8").Value = ""

A+
Répondre
SpcCwb 34Messages postés mardi 7 mai 2013Date d'inscription 9 novembre 2017 Dernière intervention - 9 nov. 2017 à 09:42
Effectivement j'ai vu ça pour l'oubli. Merci encore en tout cas, j'ai vu que tu avais pris le temps d'appliquer ta modification pour chaque #Poste. C'est vraiment sympa.

A la prochaine! Bonne continuation
Répondre
Donnez votre avis

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !