Extraction de données

Bonjour,

Voila ma question :

Je suis commerçant et chaque jour, je reçois un rapport de mes ventes sous fichier Excel.

J'y ai un code produit sur 3 chiffres (ex : 405)

Le nombre de vente, leur prix, etc...

Je souhaiterai créer une feuille "Total janvier" pour connaître la quantité de mes ventes pour chaque produit sur le mois complet.

Comment puis extraire les données de chaque fichier quotidien.

Les fichiers se trouvent dans un dossier mensuel (janvier, février, ... etc) et sont tous enregistrés sous le même format (ex : 20190102, 20190103, ... etc).

Les infos : Code produit et quantités sont toujours en colonne B et D.

La longueur (nombre de lignes) quand à elle est variable en fonction des ventes.

Merci pour vos pistes.

Fichiers joint du 02/01/2019 d'où doivent être extraite les données.

1120190102.zip (8.08 Ko)

Bonjour,

Si j'ai bien compris, tu as 12 dossiers (un par mois) et dans chaque dossier se trouve un fichier par jour (donc 31 le mois de janvier ? On compte les jours non ouvrables aussi ?)

20190102 correspond aux ventes du 2 janvier 2019 ?

Salut,

Effectivement, il y a des jours non ouvrables en général les lundi.

Pour janvier, j'ai 26 fichiers excel sous le même format.

Le nom du fichier :

20190102 correspond bien au 2 janvier 2019.

Faut t'il que je passe par du VBA (que je connais un peu) pour mieux m'en sortir ?

Je regardais d'abord si il y avait une solution plus simple avant.

Effectivement je pense que le VBA serait plus simple pour ce type de problématique.

Je laisse quand même le temps aux autres membres de donner leur avis, quelqu'un aura peut-être une idée encore plus simple !

Je repasse demain pour voir le fil et tenter de t'apporter un coup de main si besoin.

Bonne soirée

Merci.

En PJ la feuille que j'aimerai avoir.

Et une capture d'écran du dossier ou sont les fichiers quotidiens.

capture d ecran 4
4ventes.xlsx (18.78 Ko)

Bonjour Pizzaïolo

Effectivement je pense que le VBA serait plus simple pour ce type de problématique.

Je laisse quand même le temps aux autres membres de donner leur avis, quelqu'un aura peut-être une idée encore plus simple !

Je repasse demain pour voir le fil et tenter de t'apporter un coup de main si besoin.

Puisque que SlimShady m'autorise à répondre ...

Option Explicit
    Dim destinataire As Workbook

Sub compiler()

    Set destinataire = ActiveWorkbook
    Sheets("Synthèse").Range("A1").CurrentRegion.Offset(1, 0).ClearContents
    Range("A2").Select

    MsgBox "Début de la compilation ..."
    ListeFichiers ThisWorkbook.Path
    MsgBox "Fin de la compilation ..."

End Sub
Sub ListeFichiers(Repertoire As String)

    Dim nbRows As Integer
    Dim Fso, SourceFolder, SubFolder, fichier As Object
    Set Fso = CreateObject("Scripting.FileSystemObject")
    Set SourceFolder = Fso.GetFolder(Repertoire)

    ' boucle sur tous les fichiers du répertoire
    For Each fichier In SourceFolder.Files
        If fichier.Name Like "*.xls" Then
            If Left(fichier.Name, 2) <> "~$" Then

                Workbooks.Open Filename:=Repertoire & "\" & fichier.Name
                Range("A1").CurrentRegion.Offset(1, 0).Select
                nbRows = Range("A1").CurrentRegion.Rows.Count
                Selection.Copy

                ' change de fichier
                destinataire.Activate
                Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
                Application.CutCopyMode = False

                Windows(fichier.Name).Activate
                ActiveWindow.Close

                ' place le curseur sous les données
                destinataire.Activate
                Selection.Offset(nbRows - 1, 0).Select

            End If
        End If
    Next fichier

    ' appel récursif pour les sous-répertoires
    For Each SubFolder In SourceFolder.subfolders
        ListeFichiers SubFolder.Path
    Next SubFolder

End Sub

Tu mets ce fichier dans un dossier qui contient aussi les mois en sous-dossier

On verra pour la suite ...

6compiler.xlsm (20.38 Ko)

Merci,

Sinon, as-tu vu la feuille dans laquelle je veux ranger mes données ?

Apparemment, ce que tu m'as écris extrait les données en listing.

Je voulais aller un peu plus loin

Peut-être un peu trop loin

5ventes.xlsx (18.91 Ko)

Sinon, as-tu vu la feuille dans laquelle je veux ranger mes données ?

Je pense aller plus loin en mettant les données en tableau et en faisant des TCD.

Je le ferai demain.

Cela devrait s'approcher du résultat que tu souhaites.

Oui,

Cela fonctionne en fait, c'est juste que j'ai mes fichiers sur le cloud et je perd la connexion de temps à autre.

Merci pour la piste, il faut que je développe pour extraire chaque produit en fait.

Option Explicit
    Dim compil As Workbook

Sub compiler()

    Set compil = ActiveWorkbook
    ResetTableAvecFormules ActiveSheet.ListObjects(1)
    Range("A2").Select
    ListeFichiers ThisWorkbook.Path
    Sheets("ventes").Select
    ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotCache.Refresh

End Sub
Sub ListeFichiers(Repertoire As String)

    Dim nbRows As Integer
    Dim Fso, SourceFolder, SubFolder, fichier As Object
    Set Fso = CreateObject("Scripting.FileSystemObject")
    Set SourceFolder = Fso.GetFolder(Repertoire)

    ' boucle sur tous les fichiers du répertoire
    For Each fichier In SourceFolder.Files
        If fichier.Name Like "*.xls" Then
            If Left(fichier.Name, 2) <> "~$" Then

                Workbooks.Open Filename:=Repertoire & "\" & fichier.Name
                nbRows = Range("A1").CurrentRegion.Rows.Count
                Range("A1").CurrentRegion.Offset(1, 0).Resize(nbRows - 1).Select
                Selection.Copy

                ' change de fichier
                compil.Activate
                Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
                Application.CutCopyMode = False

                Windows(fichier.Name).Activate
                ActiveWindow.Close

                ' place le curseur sous les données
                compil.Activate
                Selection.Offset(nbRows - 1, 0).Select

            End If
        End If
    Next fichier

    ' appel récursif pour les sous-répertoires
    For Each SubFolder In SourceFolder.subfolders
        ListeFichiers SubFolder.Path
    Next SubFolder

End Sub

Sub ResetTableAvecFormules(myTable As ListObject)
  With myTable
    With .DataBodyRange
      If .Rows.Count > 1 Then
        .Offset(1, 0).Resize(.Rows.Count - 1, .Columns.Count).Rows.Delete
      End If
    End With
    If .DataBodyRange(.ListRows.Count, 1) <> "" Then .DataBodyRange.Rows(1).SpecialCells(xlCellTypeConstants).ClearContents
  End With
End Sub
6ventes.xlsm (39.28 Ko)

Bonjour le forum

@Steelson, tu as très bien fait de répondre car je n'aurais pas fais mieux

Bonne journée !

Merci beaucoup,

C'est déjà un grand pas pour ce que je recherche.

Le programme bugg de temps en temps et ne peut finir entièrement l'extraction.

Je vais essayer de me "plonger" dedans.

Encore merci.

Problème de cloud ! ou plutôt de connexion.

Quel cloud utilises-tu ? La plupart proposent une duplication sur le PC (nextcloud, ownCloud, oneDrive entre autres). Choisis une duplication locale si tu peux.

C'est one drive.

J'ai rapatrié mes fichiers sur le PC, mais c'est pareil..

Des fois il bloque à 3-4, d'autres je peux aller jusqu'à 20.

Je ne pige pas

Bonjour à tous,

Juste pour le fun, on peut aussi centraliser les données dans un .accdb (voir démo).

Bouton 'Acquisition' pour pointer sur le dossier principal contenant les fichiers journaliers.

(ça permet de ne pas alourdir le fichier Excel)

Et ensuite faire des requêtes en Sql ordinaire (en A2 puis bouton 'Bilan'), 2 exemples basiques dans la démo.

Dans cette démo, on peut copier/coller les feuilles pour avoir une requête par feuille (autant de fois que nécessaire).

Pierre

6pizza.xlsm (53.18 Ko)

Bonjour,

Ce fichier fonctionne parfaitement bien

En plus, 'il est très rapide.

Je vais aussi regarder cela de plus près.

Merci

Ok, alors si ça te plait voici une suite.

Dans ce fichier, il y a un onglet supplémentaire "Mois" (ton tableau en fait) dans lequel on peut choisir le mois et l'année.

Quand on change le mois ou l'année ou suite à un clic sur le bouton de mise à jour, la base est interrogée et le tableau est complété.

A noter, si un code n'est pas trouvé dans la liste c'est la dernière ligne qui est incrémentée.

On peut bien sûr compléter la liste (tout en laissant une dernière ligne sans codes au cas où)

Est-ce que j'ai bon?

Pierre

6pizza.xlsm (78.07 Ko)

Pas mal du tout.

Je dois par contre effacer A1 pour effectuer l’acquisition du mois suivant.

Je pensais aussi avoir une feuille par mois pour effectuer des comparaisons voir quel produit progresse ou régresse.

Mais ce que vous avez fait est 200 fois mieux que ce que j'aurai pu écrire.

Merci à vous deux pour avoir pris le temps.

Bonjour à tous,

Je dois par contre effacer A1 pour effectuer l’acquisition du mois suivant.

Si on pointe sur le dossier Parent "2019" et non sur le sous-dossier "2019-01" (ou autre mois), il n'est plus nécessaire d'effacer le chemin en A1.

Ou si on veut à chaque fois avoir le choix de pointer sur un dossier, il suffit d'effacer la ligne

Sheets(1).Range("A1") = rep au début de la procédure "Acquisition"

Content que ça te soit utile

Pierre

Hello,

En pointant un dossier parent [2019] pour avoir les sous dossiers [2019 01] et [2019 02] la BDD reste vide...

Il me faut sélectionner le sous dossier qui contient les feuilles journalière.

Rechercher des sujets similaires à "extraction donnees"