Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2010 Format date par macro

cathodique

XLDnaute Barbatruc
Bonsoir,

Merci de m'aider à comprendre cette incohérence. Cherchant à faire un cumul par mois, j'ai utilisé la fonction Sumifs (sur proposition de Chris que je salue) et ce pour la première fois (jamais utilisé même sur une feuille de calcul.

L'incohérence réside dans les dates, si je mets pour le format des dates "mmmm yyyy", c-à-d afficher mois et année complet (janvier 2017), là tout va bien le mois est à gauche et l'année à droite.

Par contre, si je veux afficher en mois réduit (mmm yyyy) tous les affichages sont bons sauf pour sepembre, octobre et novembre, il y a une inversion c-à-d année puis mois.
Voici le résultat obtenu:
janv 17
févr 17
mars 17
avr 17
mai 17
juin 17
juil 17
août 17
17-sept
17-oct
17-nov

déc 17
VB:
Sub Mensuel()
    Dim mois As Integer, An As Integer, derlig As Integer, NBd As Long, dl As Long
    Dim TotMoisD As Currency, TotMoisR As Currency
    Dim ShBd As Worksheet, ShSyn As Worksheet
     Application.ScreenUpdating = False
    'On Error Resume Next
    Set ShBd = Worksheets("BD")
    Set ShSyn = Worksheets("MaFeuille")

NBd = ShBd.Cells(ShBd.Rows.Count, 1).End(xlUp).Row
dl = ShSyn.Cells(ShSyn.Rows.Count, 1).End(xlUp).Row
        If dl > 5 Then ShSyn.Range("A6:I" & dl).Rows.Delete
    derlig = 6
    For An = Year(WorksheetFunction.Min(ShBd.Range("A2:A" & NBd))) To Year(WorksheetFunction.Max(ShBd.Range("A2:A" & NBd)))
        For mois = 1 To 12
       
            TotMoisR = WorksheetFunction.SumIfs(ShBd.Range("B2:B" & NBd), ShBd.Range("A2:A" & NBd), ">=" & mois & "/01/" & An, ShBd.Range("A2:A" & NBd), "<" & WorksheetFunction.EoMonth(mois & "/01/" & An, 0))
            TotMoisD = WorksheetFunction.SumIfs(ShBd.Range("c2:c" & NBd), ShBd.Range("A2:A" & NBd), ">=" & mois & "/01/" & An, ShBd.Range("A2:A" & NBd), "<" & WorksheetFunction.EoMonth(mois & "/01/" & An, 0))
            If TotMoisR <> 0 Or TotMoisD <> 0 Then
                ShSyn.Cells(derlig, 1) = Format(CDate("01/" & mois & "/" & An), "mmmm yyyy")
                ShSyn.Cells(derlig, 2) = TotMoisR
                ShSyn.Cells(derlig, 3) = TotMoisD
                derlig = derlig + 1
            End If
        Next mois
    Next An
End Sub
Je suis déboussolé. Est-ce qu'il y a une erreur dans mon code. Merci à vous par avance.
 

Dranreb

XLDnaute Barbatruc
Bonsoir.
Qu'est ce que c'est que cette manie de toujours mettre dans les cellules en guise de dates des textes construits par Format, ce qui oblige Excel à les reconvertir en date, du moins quand il peut…
Mettez simplement
VB:
ShSyn.Cells(derlig, 1) = DateSerial(An, mois, 1)
C'est tout.
Après vous mettez le format que vous voulez à votre cellule pour afficher cette donnée de type date (une valeur de cellule n'est jamais au format date ça n'existe pas, ça ne veut rien dire: elle peut à la rigueur être de type Date ou pas. Et quand elle n'est pas de type Date elle peut être String, Double, Boolean, Currency, Error ou Empty)
 

cathodique

XLDnaute Barbatruc
Bonjour Dranreb,
Qu'est ce que c'est que cette manie de toujours mettre dans les cellules en guise de dates des textes construits par Format, ce qui oblige Excel à les reconvertir en date, du moins quand il peut…
Merci beaucoup de m'avoir éclairé. Cependant ce n'est pas une manie mais de la méconnaissance.
C'est en effectuant des recherches sur le forum et suite à une suggestion que j'ai utilisé pour la première fois cette fonction sumifs.

D'après ce que tu viens de m'expliquer, je déduis que l'écriture de la formule est fausse du point de vue date
VB:
TotMoisR = WorksheetFunction.SumIfs(ShBd.Range("B2:B" & NBd), ShBd.Range("A2:A" & NBd), ">=" & mois & "/01/" & An, ShBd.Range("A2:A" & NBd), _
"<" & WorksheetFunction.EoMonth(mois & "/01/" & An, 0))
Autre chose qui m'échappe, mes paramètres régionaux sont Français et tu dis de mettre
DateSerial(An, mois, 1).
Pas trop compris, ces histoires de dates. Je teste et reviens aux nouvelles.

Encore merci, très bonne journée.
 

cathodique

XLDnaute Barbatruc
Me revoilà, résultats identiques. Le problème persiste (j'en ai mare des dates anglo-saxonnes) .
La bizarrerie est pourquoi le format pour septembre, octobre et novembre sont différents de celui des autres mois.
Ci-joint un fichier pour constater. Merci à vous.
 

Pièces jointes

  • FormatDateMoisRéduit.xlsm
    28.1 KB · Affichages: 36
Dernière édition:

Dranreb

XLDnaute Barbatruc
Bonjour.
Première constatation en ouvrant le fichier: en colonne A, tout ce qui est cadré à gauche ce sont des textes, et ça n'a donc rien à voit avec des dates. C'est le texte renvoyé par Format(DateSerial(An, mois, 1), "mmm yyyy") en fait. J'ignore pourquoi il réussi à reconvertir en date certains d'entre eux.
La bonne solution c'est en faisant :
VB:
                With ShSyn.Cells(derlig, 1)
                  .NumberFormat = "mmm yy"
                  .Value = DateSerial(An, mois, 1): End With
Pour mettre plutot la date de fin de mois c'est
VB:
.Value = DateSerial(An, mois + 1, 0)
mais ça n'a aucune incidence sur l'aspect du résultat.
 
Dernière édition:

cathodique

XLDnaute Barbatruc
Un grand merci mon cher Dranreb,

Je me suis débrouillé ainsi plus que c'est juste pour l'impression
ShSyn.Cells(derlig, 1).NumberFormat = "@" 'mise en forme cellule avant de recevoir la valeur
ShSyn.Cells(derlig, 1) = Format(CDate("01/" & mois & "/" & An), "mmm yy")

Je dois vérifier les résultats. Il me semble que ce sont les arguments de la fonction qui sont mal foutus.
J'ai pu constaté avec cette fonction Sumifs appliquée pour totaliser sur des trimestres, certaines sommations sont fausses.

Merci beaucoup, j'ai encore du pain sur la planche.
 
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…