Somme conditionnelle sur valeur de la date

Résolu
melinette35 Messages postés 68 Date d'inscription mercredi 23 mai 2012 Statut Membre Dernière intervention 27 juillet 2012 - 23 mai 2012 à 18:48
melinette35 Messages postés 68 Date d'inscription mercredi 23 mai 2012 Statut Membre Dernière intervention 27 juillet 2012 - 2 juin 2012 à 16:14
Bonjour à tous,

Je suis pour le moment débutante en VBA sous Excel 2003 (dans le cadre de mon stage).

Voilà mon problème:

Je dois faire une macro mettant en avant les écarts de caisses de chaque agence: par mois et par quinzaine. Je précise que selon le mois, le nombre de ligne varie.

En ce qui concerne le mois: j'ai fais un subtotal qui me permet d'avoir le total par mois. Cela est dans la colonne Ecart mensuel.

Maintenant, je souhaite faire dans les deux colonnes qui suivent: "quinzaine 1" et "quinzaine 2". Le seul moyen que j'ai selon moi d'y parvenir est de prendre la date comme critère.

Ce que j'ai eu comme idée c'est d'extraire la date que j'ai au format 00/00/0000 pour en prendre que les 2 premiers caractères dans une colonne qui sera ensuite écrasée à la fin de la macro.

Ainsi on peut suite à cela faire une condition du style: Si valeur jour >15 alors tu fais la sommes des écarts correspondants à ces dates dans quinzaine 2

Sinon alors tu fais la somme des autres écarts dans quinzaine 1

Voilà mon code. Je n'arrive pas à mettre en place la condition sur la valeur de la date, j'ai pensé à un while mais sans grande conviction.

Sub ExtractionDate()

    Dim A As Integer ‘ premiere ligne
    Dim Z As Integer ‘ derniere ligne
    Dim B As String
    
        Z = Range("B3").End(xlDown).Row
        
        'une date au format 00/00/0000 contient 10 caractères
        
    For A = 4 To Z
        B = 0 'On initialise la valeur B
            
            If Len(Cells(A, 4)) = 10 Then 'Test pour savoir si la cellule contient bien 10 caractères
          
                B = Cells(A, 4).Value  'La variable B prend la valeur de la cellule de la ligne A et de la 26è colonne
                B = Left(B, Len(B) - 8)  'On enlève les 8 derniers caractères
                
                    Range(Cells(4, 4), Cells(Z, 4)).Select
                    Selection.Copy
                    Range(Cells(4, 26), Cells(Z, 26)).Select
                    ActiveSheet.Paste 'penser à mettre le lien vers la bonne feuille
'C'EST CA QUE JE N'ARRIVE PAS A FAIRE
                    'de la variable dans la colonne 26

            Else
            End If 
    Next A
    'Condition sur la valeur : soit inférieur à 16 soit supérieur à 15
                 While B < 16               
                 Wend
    
    Columns("Z:Z").Delete Shift:=xlToLeft 'on supprime la colonne où il y avait les valeurs de B
    
 End Sub



J'espère avoir été claire, car je ne sais pas si vous avez besoin du fichier, ni comment faire pour mettre un fichier en PJ sur la discussion.

En tout cas, je vous remercie beaucoup d'avance.

4 réponses

MarcPL Messages postés 172 Date d'inscription jeudi 8 décembre 2011 Statut Membre Dernière intervention 21 juillet 2013 2
24 mai 2012 à 13:41
Bonjour !

Afin de détecter si une cellule est bien une date et récupérer le jour, vaut mieux ceci :
    If IsDate(Cells(A, 4)) Then
        B = Day(Cells(A, 4))
        Range(Cells(4, 4), Cells(Z, 4)).Copy
        ActiveSheet.Paste Range(Cells(4, 26), Cells(Z, 26))

A noter au passage qu'il n'est pas nécessaire (plutôt déconseillé pour raison de rapidité)
d'utiliser un Select pour faire un Copy ou un Paste ...

Maintenant ne faudrait-il pas tester le jour - la variable B donc - avant de faire la copie dans une colonne ou une autre ?
___________________________________________________________________________________________________________________
Comme la vitesse de la lumière est supérieure à celle du son, certains ont l'air brillant avant d'avoir l'air con !
3
rvblog Messages postés 792 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 12 juin 2012 7
24 mai 2012 à 13:36
Bonjour melinette35,

je pense que ton approche n'est pas mauvaise, mais pourquoi ne pas simplement écrire des formules qui te permettent tout autant d'aller à ton objectif? rvblogn
Je veux ton bien....et je l'aurais....mieux vaut tard...que trop tard!
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
24 mai 2012 à 14:48
Bonjour,

Je rappelle qu'existe la fonction Day !
regarde ce que fait ceci, déjà :
toto = "22/03/2009"
 If IsDate(toto) Then
   If Day(toto) <= 15 Then MsgBox "1ère quinzaine" Else MsgBox "2ème quinzaine"
 End If

Pour le reste (et bien que peu clair) : quid de l'utilisation simple de la fonction SOMMESI (utilisable sous la forme SUMIF depuuis VBA à l'aide de WorksheetFunction) ? Non ?

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
melinette35 Messages postés 68 Date d'inscription mercredi 23 mai 2012 Statut Membre Dernière intervention 27 juillet 2012
2 juin 2012 à 16:14
Je vous remercie tous de votre aide.

J'ai maintenant trouvé la solution.
0
Rejoignez-nous