Probleme manipulation mois et années vba

chtite24

XLDnaute Nouveau
Bonjour à tous,

J'ai beau regarder sur d'autre sujets, je ne trouve pas de réponse à mon problème alors j’espère que quelqu'un pourra m'aider...

J'ai 2 fichiers, dans le 1er, toute une série de lignes avec dans la colonne 1, une date de fabrication toujours écrite de la manière "mois année" (avec le mois écrit en toute lettres); et dans la colonne 2, une valeur.

Dans mon deuxième fichier, je veux faire la somme de toutes les valeurs de la colonne 2 de mon premier fichier à condition que la date de fabrication soit inférieure au mois actuel ou si c'est le mois + 1 du mois actuel.

Je m'explique plus clairement : nous sommes en janvier 2012, je veux donc faire la somme de toutes les valeurs de la colonne 2 à condition que la colonne 1 = février 2012 ou tous les autres mois précédents (décembre 2011, novembre 2011, ....)

Mais pour le moment, la seule chose que j'ai réussi à trouver c'est :
MoisEnCours = VBA.MonthName(Month(Date)) & " " & VBA.Year(Date)

Et encore je ne sais mm pas si c'est utile...

Merci à toute âme bienveillante qui pourra me proposer une solution.

Cordialement,
 

Modeste

XLDnaute Barbatruc
Re : Probleme manipulation mois et années vba

Bonsoir chtite24,

Et si tu nous déposais un petit extrait significatif (mais purgé de toute donnée confidentielle) de ton fichier?
Tu nous dit que tes dates sont toujours écrites de la manière "mois année" mais est-ce que tu les encodes sous cette forme ou c'est leur format qui est modifié? Et puis, il y a combien d'années concernées (deux ou plus encore)?

Le mieux serait que tu nous donnes aussi les résultats attendus, en fonction de l'exemple que tu auras fourni.

Dis-nous aussi si une solution par formule te conviendrait ou si tu veux uniquement une macro.
 

chtite24

XLDnaute Nouveau
Re : Probleme manipulation mois et années vba

Bonjour Modeste,

Merci de me répondre :)

Ci-joint un fichier exemple représentant une petite partie de mon programme.
Pour répondre à tes questions, la date est rentrée manuellement par l'utilisateur, toujours sous la même forme.
Quand aux dates, il y a plusieurs années possibles.

Voir sur mon fichier joint :
Nous sommes en février 2012. Je veux donc faire la somme d'une reference à condition que la date fasse partie :
du mois en cours (février 2012)
du mois suivant (mars 2012)
et de tous les mois précédents (janvier 2012, décembre 2011, novembre 2011, octobre 2011... et ainsi de suite).

Et ensuite reporter cette somme sur la deuxieme feuille en face de la reference concernée.

En éspérant être assez claire...

Merci d'avance.
 

Pièces jointes

  • Chtite24 Test.xlsm
    18.2 KB · Affichages: 51

Modeste

XLDnaute Barbatruc
Re : Probleme manipulation mois et années vba

Bonjour chtite24,

Je ne suis pas certain que tes explications soient cohérentes à 100% entre le premier et le second message :confused: ... ce que tu voudrais faire, c'est la somme des valeurs encodées sous patate001, patate002, ... pour toutes les périodes antérieures ou égales au mois en cours, ainsi que pour le mois suivant?

Si c'est bien ça, peux-tu essayer, en B4 de ta feuille "stock"
Code:
=SOMMEPROD((DATEVAL(1&fabrication!$A$2:$A$13)<=FIN.MOIS(AUJOURDHUI();1))*(stock!$A4=fabrication!$B$1:$D$1)*(fabrication!$B$2:$D$13))
... à recopier ensuite vers le bas!?

Attention: le système utilisé pour l'encodage des périodes pose un problème: celui des fautes de frappe et/ou des fautes d'ortho! Ici, on trouve février 2012 ... sans l'accent sur le 'é' ... Excel a donc beaucoup de mal à déterminer qu'il pourrait s'agir d'un mois, ce qui pose problème pour les calculs!

Dis-nous déjà si j'ai bien compris ta demande!
 

KenDev

XLDnaute Impliqué
Re : Probleme manipulation mois et années vba

Bonjour Chtite, Modeste,

En effet l'orthographe, puisqu'il semble que les dates soient des saisies au format texte, pose problème. D’où une solution sur mesure un peu tarabiscotée, mais qui pourra servir si tu ne peux agir sur la colonne 1.

A utiliser comme ci,
n'importe ou dans le classeur :
Code:
=sumref("patate006")
ou, à partir de la feuille "fabrication"
Code:
=sumref(C1)
ou dans un code vba
Code:
=sumref(mavariableréférence)
qui me donne 38 (mon ordi est encore en janvier)

A savoir :
_ le nom de la feuille fabrication est en dur dans le code
_ la fonction indique si la référence est non trouvée, si il y a une erreur de frappe en colonne 1 ou si la référence n'a pas de données.
_ les dates en colonne 1 seront reconnues si :
-- pour février, septembre à décembre : la 1ère lettre est correcte (donc février ou fevrier ou f passeront)
-- pour janvier, avril, aout : les 2 premières lettres
-- pour mars, mai : les 3 premières lettres
-- pour juin, juillet : les 4 premières lettres
--> pas de souci d'accent ou pas
--les années sont sur 4 caractères (la fonction n'es donc valable que de l'an 1000 à l'an 9999)

Si tu peux agir sur la colonne 1 la solution de Modeste sera évidemment préférable.

Cordialement

KD

Edit : correction de deux fautes de frappes dans le code pour mai et juillet

VB:
Option Explicit

Function SumRef(s$)
    Dim w As Worksheet, c%, Rg As Range, r&, m%, y%, i&, t$, wM%, wY%
    Set w = Worksheets("fabrication")
    Set Rg = w.Range(w.Cells(1, 2), w.Cells(1, Columns.Count))
    If Rg.Find(s) Is Nothing Then
        SumRef = "Ref. not found"
        Exit Function
    Else
        c = Rg.Find(s).Column
    End If
    r = w.Cells(Rows.Count, c).End(xlUp).Row
    If r = 1 Then
        SumRef = "No data found"
        Exit Function
    End If
    m = Month(Now): y = Year(Now)
    For i = 2 To r
        t = w.Cells(i, 1): wM = WhatMonth(t): wY = WhatYear(t)
        If wM * wY = 0 Then
            SumRef = "Typing error in line " & i
            Exit Function
        Else
            If 12 * WhatYear(t) + WhatMonth(t) <= 12 * y + m + 1 Then SumRef = SumRef + w.Cells(i, c)
        End If
    Next i
End Function

Function WhatMonth%(s$)
    s = Trim(LCase(s))
    Select Case Left(s, 1)
        Case "j"
            If Left(s, 2) = "ja" Then
                WhatMonth = 1
            ElseIf Left(s, 4) = "juin" Then
                WhatMonth = 6
            ElseIf Left(s, 4) = "juil" Then
                WhatMonth = 7
            End If
        Case "f"
            WhatMonth = 2
        Case "m"
            If Left(s, 3) = "mar" Then
                WhatMonth = 3
            ElseIf Left(s, 3) = "mai" Then
                WhatMonth = 5
            End If
        Case "a"
            If Left(s, 2) = "av" Then
                WhatMonth = 4
            ElseIf Left(s, 2) = "ao" Then
                WhatMonth = 8
            End If
        Case "s"
            WhatMonth = 9
        Case "o"
            WhatMonth = 10
        Case "n"
            WhatMonth = 11
        Case "d"
            WhatMonth = 12
    End Select
End Function

Function WhatYear%(s$)
    s = Trim(LCase(s))
    On Error Resume Next
    If Len(Trim(Right(s, 4))) = 4 Then WhatYear = Right(s, 4)
End Function
 
Dernière édition:

chtite24

XLDnaute Nouveau
Re : Probleme manipulation mois et années vba

Bonjour KenDev, Modeste

Effectivement la solution de KenDev fonctionne bien, mais le souci c'est que pour moi, la feuille fabrication et la feuille stock sont dans deux fichiers différents.... et du coup je veux gérer tout cela en vba, et non par formules....
(je sais je suis énervante je ne donne pas toutes les infos d'un coup...)

Sinon le principe est là, à défaut de ne pas être toujours très claire, vous avez capté le principe :D
 

KenDev

XLDnaute Impliqué
Re : Probleme manipulation mois et années vba

Re,

Attention je viens de modifier mon code (2 fautes de frappes). Sinon pour le coup des 2 classeurs tu n'as qu'à rajouter une variable workbook dans Function SumRef(s$):
Dim wb as workbook
Set Wb = workbooks("monclasseurfabrication")
et modifier la ligne
Set w = Worksheets("fabrication") -> Set w = Wb.Worksheets("fabrication")

non testé (d'ou l'absence de balises) mais ça devrait le faire ?

Cordialement

KD
 

Discussions similaires

Réponses
5
Affichages
178

Membres actuellement en ligne

Statistiques des forums

Discussions
312 177
Messages
2 085 972
Membres
103 073
dernier inscrit
MSCHOE16