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

Créer un tableau à partir de plusieurs onglets avec une liste variable

Jules33150

XLDnaute Nouveau
Bonjour à tous et merci à nouveau à ce forum qui m'a déjà permis de trouver des solutions à plusieurs reprises par le passé.

Je viens de prendre un poste de responsable en boulangerie et je souhaite procéder à une analyse des ventes, avec comme objectif de créer un plan de production ensuite pour mes boulangers.

Pour ce faire j'ai rassemblé et retraité les données sur un mois, du 16 janvier au 15 février.

J'ai donc une feuille Excel avec 30 onglets, chacun étant nommé selon sa date.

Sur chaque onglet, j'ai une liste de produits dans la colonne A et la quantité vendue dans la colonne B.
La liste des produits n'est pas exactement identique chaque jour car on ne vend pas toutes les références tous les jours.

J'aimerais créer un tableau unique avec dans la première colonne la liste des produits, puis sur les 30 colonnes suivantes la date sur la première ligne et les quantités vendues pour chaque référence.

Je me doute que mon problème a déjà été rencontré et même possiblement que c'est quelque chose qui est régulièrement demandé.
Cependant j'ai voulu utiliser le moteur de recherche mais je ne sais pas comment qualifier ma recherche, du fait que la liste ne soit pas rigoureusement identique chaque jour...

Voici le lien vers mon fichier excel : http://www.cjoint.com/c/GBqrNY24tIy

Merci par avance à ceux et celles qui m'aideront à faire cela.

Bonne soirée à tous et à toutes.
 

Robert

XLDnaute Barbatruc
Repose en paix
Bonsoir Jules, bonsoir le forum,

En pièce jointe ton fichier modifié avec le code ci-dessous. J'ai rajouté un nouvel onglet en premier nommé Tableau. C'est dans cet onglet que sont ventilées les ventes. Lance la macro....
Le code :

VB:
Sub Macro1()
Dim T As Worksheet 'déclare la variable T (onglet Tableau)
Dim D As Object 'déclare la variable D (Dictionnaire)
Dim K As Long 'déclare la variable K (incrément)
Dim O As Worksheet 'déclare la variable O (Onglets)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim I As Long 'déclare la variable I (Incrément)
Dim TMP As Variant 'déclare la variable TMP (tableau TeMPoraire)
Dim J As Long 'déclare la variable J (incrément)
Dim COL As Integer 'déclare la variable COL (COLonne)
Dim LI As Integer 'déclare la variable LI (Ligne)

'*******************************
'Liste des produits sans doublon
'*******************************
Set T = Worksheets("Tableau") 'définit le tableau T
T.Cells.Clear 'efface d'eventuelles anciennes données dans l'onglet T
Application.ScreenUpdating = False 'masque les rafraîchissements d'écran
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
K = 2 'initialise la variable K
For Each O In Sheets 'boucle 1 : sur tous les onglets O du classeur
  If O.Name <> T.Name Then 'condition : si le nom de l'onglet O est différent de "Tableau"
  TV = O.Range("A1").CurrentRegion 'définit la tableau de valeurs TV
  For I = 1 To UBound(TV, 1) 'boucle 2 : sur toutes les lignes I du tableau des valeurs TV
  D(TV(I, 1)) = "" 'alimente le dictionnaire D avec la donnée ligne I colonne 1 de TV
  Next I 'prochaine ligne de la boucle 2
  'renvoie dans la cellule ligne 1 colonne K de l'onglet T, le nom de l'onglet au format texte
  'avec une apostrophe devant pour éviter l'inversion des jours et des mois
  T.Cells(1, K) = "'" & O.Name
  K = K + 1 'incrémente K
  End If 'fin de la condition
Next O 'prochain onglet de la boucle 1
TMP = D.keys 'récupère dans le tableau temporaire TMP la liste des éléments du dictionnaire D sans doublon
T.Range("A1") = "Produits" 'écrit dans la cellule A1 de l'onglet T
'renvoie dans la cellule A2 redimensionnée de l'onglet T le tableau TMP transposé (donc la liste des produits sans doublon)
T.Range("A2").Resize(D.Count, 1).Value = Application.Transpose(TMP)

'****************************************************
'récupération et placement des ventes dans l'onglet T
'****************************************************
For J = 0 To UBound(TMP) 'boucle 1 : sur tous les éléments J du tableau temporaire TMP
  For Each O In Sheets 'boucle 2  : sur tous les onglets O du classeur
  If O.Name <> T.Name Then 'condition 1 : si le nom de l'onglet O est différent de "Tableau"
  TV = O.Range("A1").CurrentRegion 'définit la tableau de valeurs TV
  For I = 1 To UBound(TV, 1) 'boucle 3 : sur toutes les lignes I du tableau des valeurs TV
  If TV(I, 1) = TMP(J) Then 'condition 2 : si la donnée ligne I colonne 1 de TV est égale à l'élément J de TMP
  COL = T.Rows(1).Find(O.Name, , xlFormulas, xlWhole).Column 'définit la colonne COL
  LI = T.Columns(1).Find(TMP(J), , xlValues, xlWhole).Row 'définit la ligne LI
  'renvoie dans la cellule ligne LI colonne Col de l'onglet T la donnée ligne I colonne 2 de TV
  T.Cells(LI, COL) = TV(I, 2)
  Exit For 'sort de la boucle 3
  End If 'fin de la condition 2
  Next I 'prochaine ligne de la boucle 3
  End If 'fin de la condition 1
  Next O 'prochain onglet de la boucle 2
Next J 'prochain élément de la boucle 1

T.Activate 'active l'onglet T
T.Range("B2").Select 'sélectionne la cellule B2
ActiveWindow.FreezePanes = True 'fige les volets
Application.ScreenUpdating = True 'affiche les rafraîchissements d'écran
MsgBox "Fin du traitement des données!" 'message
End Sub
Le fichier :
 

Pièces jointes

  • Jules_v01.xlsm
    95.7 KB · Affichages: 73

ChTi160

XLDnaute Barbatruc
Bonjour Jules
Bonjour le Fil ,Le Forum
Une autre présentation des Données .
Bonne fin de Journée
Amicalement
Jean Marie
Ps : Beaucoup de similitudes avec le fichier de Bebere
 

Pièces jointes

  • ClasseurJules-Test Chti160-2.xlsm
    102.6 KB · Affichages: 61
Dernière édition:

Jules33150

XLDnaute Nouveau
Bonjour les experts, bonjour le forum!

Merci 1000 fois pour vos réponses, je ne m'attendais pas à avoir un fichier clé en main mais ça me fait gagner énormément de temps et ça aide une petite entreprise pas très en forme alors vraiment MERCI!!!

Petite question : comment avez-vous acquis ces compétences ? J'utilise Excel très souvent mais uniquement les fonctions de base alors que j'aurais vraiment l'utilité de maîtriser mieux ses possibilités.
Le problème c'est qu'apprendre en autodidacte ça demande beaucoup de temps et j'en manque déjà...
Du coup existe-t-il des formation accélérées ou est-ce que tout simplement il faut accepter d'y consacrer beaucoup de temps?
Voilà merci pour vos réponses.
 

ChTi160

XLDnaute Barbatruc
Bonjour Jules
Bonjour le fil,Le Forum
pour ce qui est de l'apprentissage ,il demande effectivement du temps , je suis moi même autodidacte , je n'utilise jamais excel encore moins VBA pour des besoins personnels , mais grâce à ce forum et ceux qui l'animent , j'apprends a mon modeste niveau ,ce qui me permet d'aider ceux qui en on besoins .
Donc des formations peut être , il y a aussi des Livres consacrés au VBA , des forums dédiés etc !
n'hésite donc pas à revenir , car ce forum est une vraie Mine et ceux qui l'animent des bénévoles compétents .
Donc a très bientôt .
Bonne fin de Journée
Amicalement
Jean Marie
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…