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

XL 2016 sauvegarde de données

romss1982

XLDnaute Nouveau
Bonjour à tous,

je souhaite faire une sauvegarde journalière des donnés d'un classeur excel.
en effet ces valeurs changent chaque jours mais je souhaites avoir une trace de celles-ci afin d'exploiter les données.

je souhaite donc que les données "nom de l'onglet / date / %avancement) soit sauvegardé dans un onglet SAUV

je vous joins un exemple c'est plus parlant

merci d'avance à vous
 

Pièces jointes

  • Classeur1test.xlsx
    15.6 KB · Affichages: 8

crocrocro

XLDnaute Impliqué
Bonjour Romain,
en pj une proposition avec quelques remarques :
- les onglets pris en compte doivent avoir un nom (non sensible à la casse) commençant par "produit"
- la cellule portant la valeur de l'avancement doit être déclarée dans le Gestionnaire de noms avec pour nom "AVANCEMENT" et pour niveau "Feuille"
- Il n'y a pas d'automatisation de l'exécution de la sauvegarde ici.
A toi de décider (avant la fermeture ou l'enregistrement du classeur, manuelle par bouton ...)
Le code
VB:
Sub Sauvegarde()
Dim WS As Worksheet
Dim DerLigne As Long
Dim LigAvancement As Long
Dim ColAvancement As Long
Dim DerDate As Date
    With Sheets("SAUV")
        DerLigne = .Cells(Rows.Count, 1).End(xlUp).Row ' colonne 1
        DerDate = .Cells(DerLigne, 2) '
        For Each WS In ThisWorkbook.Worksheets
            If LCase(Left(WS.Name, 7)) = "produit" Then
                LigAvancement = WS.Range("AVANCEMENT").Row
                ColAvancement = WS.Range("AVANCEMENT").Column
                If DateDiff("d", WS.Range("AVANCEMENT").Offset(0, -4).Value, DerDate) < 0 Then
                    DerLigne = DerLigne + 1
                    .Cells(DerLigne, 1) = WS.Name
                    .Cells(DerLigne, 2) = WS.Range("AVANCEMENT").Offset(0, -4).Value
                    .Cells(DerLigne, 3) = WS.Range("AVANCEMENT").Value
                End If
            End If
            i = i + 1
        Next WS
    End With
End Sub
 

Pièces jointes

  • SauveAvancement crocrocro.xlsm
    23.4 KB · Affichages: 9
Dernière édition:

romss1982

XLDnaute Nouveau
Bonjour CROCROCRO et merci pour cette solution qui est vraiment génial.

je souhaites ajouter une colonne à la sauvegarde qui viendrait me calculer la différence de pourcentage pour chacun des produit entre la date du jour et la veille (en gros l'avancement par rapport à la veille), mais franchement n'étant pas un as d'Excel, je n'y arrive pas, aurais tu une solution?

merci d'avance
 

crocrocro

XLDnaute Impliqué
Bonjour Romain,
je ne suis pas sûr d'avoir compris "l'avancement par rapport à la veille" :
l'info dans SAUV étant un % d'avancement, ce serait l'avancement d'un avancement ?
pare exemple si produit 1 80% le 20/07 et 95% le 21/07, pour la ligne du 21/07 on doit afficher en colonne D 95% - 80%, soit 5 % ?
Et rien ne garantissant qu'il y ait continuité de date, il ne s'agirait pas de la veille mais de la dernière mise à jour.
 

romss1982

XLDnaute Nouveau
Bonjour Crocroco

en effet c'est exactement ça tu as entièrement raison c'est en effet un avancement par rapport au dernier enregistrement qui n'est possiblement pas la veille.

tu as compris parfaitement ce que je voulais

merci encore pour ton aide et j'espère que tu vas réussir à m'aider une nouvelle fois

bonne journée
 

crocrocro

XLDnaute Impliqué
Bonjour Romain,
cela peut être réalisé simplement en mettant :
- cette formule en D1
VB:
=C1
- cette formule en D2 (à étirer vers le bas)
Code:
=C2-SIERREUR(INDIRECT("C" &SOMMEPROD(MAX((A$1:A1=A2)*LIGNE(A$1:A1))));0)
Edit : je peux te donner des explications sur la formule si tu le souhaites. Beaucoup plus simple que e=mc2
 
Dernière édition:

crocrocro

XLDnaute Impliqué
Je ne sais plus si dans mon fichier j'avais inclus ce code qui effectue automatiquement la sauvegarde sur l'enregistrement du classeur :
VB:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    Sauvegarde
End Sub
Je te laisse vérifier et ajouter ce code sur l'objet ThisWorkbook si c'est ton choix d'activation.
 

TooFatBoy

XLDnaute Barbatruc
OK, mais ce que je veux dire c'est que je crois que dans ce cas on ne dit pas qu'il y a une augmentation de "15 %" mais de "15 points".

Autrement dit, si je ne me trompe (mais c'est vraiment à prendre avec des pincettes et à vérifier !) :
80 % + 15 % donnerait "92 %"
80 % + 15 points donnerait "95 %"


Donc au final, mon questionnement était principalement de savoir lequel de ces deux types de variation veut calculer romss1982.
 
Dernière édition:

crocrocro

XLDnaute Impliqué
Bonjour Romain,
une rectification du code, nécessaire si tu es amené à effectuer plusieurs fois la sauvegarde dans la m^me journée.
Dans le code précédent, si le % d'avancement a changé alors qu'une sauvegarde a déjà été faite dans la même journée, il n'était pas pris en compte

VB:
Sub Sauvegarde()
Dim WS As Worksheet
Dim i As Integer
Dim DerLigne As Long
Dim LigAvancement As Long
Dim ColAvancement As Long
Dim DerDate As Date
    With Sheets("SAUV")
        DerLigne = .Cells(Rows.Count, 1).End(xlUp).Row ' colonne 1
        DerDate = .Cells(DerLigne, 2) '
        For Each WS In ThisWorkbook.Worksheets
            If LCase(Left(WS.Name, 7)) = "produit" Then
                LigAvancement = WS.Range("AVANCEMENT").Row
                ColAvancement = WS.Range("AVANCEMENT").Column
                ' on recherche d'abord si une ligne existe pour cette date, ce produit
                ' si c'est le cas, on modifie la ligne
                For i = 1 To DerLigne
                    If .Cells(i, 1) = WS.Name And _
                        DateDiff("d", WS.Range("AVANCEMENT").Offset(0, -4).Value, .Cells(i, 2)) = 0 Then
                            .Cells(i, 3) = WS.Range("AVANCEMENT").Value
                    End If
                Next i
                ' aucune ligne existe pour cette date, ce produit
                ' on ajoute une ligne
                If DateDiff("d", WS.Range("AVANCEMENT").Offset(0, -4).Value, DerDate) < 0 Then
                    DerLigne = DerLigne + 1
                    .Cells(DerLigne, 1) = WS.Name
                    .Cells(DerLigne, 2) = WS.Range("AVANCEMENT").Offset(0, -4).Value
                    .Cells(DerLigne, 3) = WS.Range("AVANCEMENT").Value
                End If
            End If
        Next WS
    End With
End Sub
 

romss1982

XLDnaute Nouveau
trop génial pour cette amélioration

merci énormément
 

Discussions similaires

  • Résolu(e)
XL 2016 Date
Réponses
7
Affichages
438
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…