[RÉSOLU] Reports de données dans un tableau selon feuille et critère

Gen Rose

XLDnaute Impliqué
Supporter XLD
Bonjour et bonne 14! ;)

J'ai un document que je tente de rendre maléable pour le traitement de données par TCD.

L'idée est de regrouper les données de mes onglets selon 2 conditions dans un tableau de synthèse.

Il s'agit de trouver la feuille associée à la personne et le mois; les 4 résultats sous le mois peuvent être reportés directement.


Ex.: Dans la feuille syhtese TdS, nous avons un nom en A2 qui se trouve sur la première feuille en A1
En B2 le mois qui se trouve en B3 de la première feuille.
Il s'agit de prendre le résultat en B4:B7(première feuille) et les reporter en C2:F2 de la feuille TdS.​


Ça l'air vraiment simple expliqué comme ça et peut-être que j'ai les idées embrouillées en ce début d'année mais...je bloque.

Sachant que ça sert de base à un TCD, le VBA me semble plus approprié (à cause des cellules vides qui, par formules, ne le sont jamais).

Merci à tout ceux qui prendrons le temps de jeter un coup d'oeil :eek:
 

Pièces jointes

  • Test_Report_TdS.xls
    137.5 KB · Affichages: 51
Dernière modification par un modérateur:

job75

XLDnaute Barbatruc
Re : Reports de données dans un tableau selon feuille et critère

Bonjour Geneviève :)

Tu peux utiliser cette macro :

Code:
Sub MAJ_TdS()
Dim tablo(), w As Worksheet, n As Byte, lig&
ReDim tablo(1 To 12 * (Worksheets.Count - 1), 1 To 6)
With Sheets("TdS") 'nom à adapter éventuellemnt
  For Each w In Worksheets
    If w.Name <> .Name Then
      For n = 1 To 12
        lig = lig + 1
        tablo(lig, 1) = w.[A1]
        tablo(lig, 2) = Application.Proper(Format("1/" & n, "mmmm"))
        tablo(lig, 3) = w.Cells(6 * n - 2, 2)
        tablo(lig, 4) = w.Cells(6 * n - 1, 2)
        tablo(lig, 5) = w.Cells(6 * n, 2)
        tablo(lig, 6) = w.Cells(6 * n + 1, 2)
      Next
    End If
  Next
  .[A2].Resize(lig, 6) = tablo
  .[A2].Resize(lig, 6).Replace 0, "", xlWhole 'facultatif, supprime les 0
  .Range("A" & lig + 2 & ":F" & .Rows.Count).ClearContents
End With
End Sub
Il n'y a aucun problème si les tableaux des feuilles sont bien tous disposés de la même manière.

A+
 
Dernière édition:

job75

XLDnaute Barbatruc
Re : Reports de données dans un tableau selon feuille et critère

Re,

Avec un 2ème tableau c'est un chouia plus rapide :

Code:
Sub MAJ_TdS()
Dim tablo(), w As Worksheet, nom$, t, n As Byte, lig&
ReDim tablo(1 To 12 * (Worksheets.Count - 1), 1 To 6)
With Sheets("TdS") 'nom à adapter éventuellemnt
  For Each w In Worksheets
    If w.Name <> .Name Then
      nom = w.[A1]
      t = Application.Transpose(w.[B1:B73])
      For n = 1 To 12
        lig = lig + 1
        tablo(lig, 1) = nom
        tablo(lig, 2) = Application.Proper(Format("1/" & n, "mmmm"))
        tablo(lig, 3) = t(6 * n - 2)
        tablo(lig, 4) = t(6 * n - 1)
        tablo(lig, 5) = t(6 * n)
        tablo(lig, 6) = t(6 * n + 1)
      Next
    End If
  Next
  .[A2].Resize(lig, 6) = tablo
  .[A2].Resize(lig, 6).Replace 0, "", xlWhole 'facultatif, supprime les 0
  .Range("A" & lig + 2 & ":F" & .Rows.Count).ClearContents
End With
End Sub
A+
 

Gen Rose

XLDnaute Impliqué
Supporter XLD
Re : [RÉSOLU] Reports de données dans un tableau selon feuille et critère

Job75, tu es toujours là?

Après test, y a un bug :(

Et pourtant, j'ai pris le document original et simplement modifié les noms, changé les chiffres...

Revoici le document avec bug: les lignes 110 à 130 lors de l'import. Peut-être que c'est du à l'ajout de 2 TCD (donc 2 feuilles de plus, mais pourtant à la fin du classeur).

Le problème, c'est que cette zone vide affecte les TCD; à la limite, on décoche (vide) sauf que dans mon dernier TCD, ce bug m'oblige à rajouter une zone filtre pour décocher ce vide. Je crois qu'il serait mieux de juste éliminer le bug à la base.

Peux-tu me faire un extra sur ta macro?:rolleyes:

Merci beaucoup:eek:
 

Pièces jointes

  • Test_Import 2.xls
    219.5 KB · Affichages: 53

job75

XLDnaute Barbatruc
Re : [RÉSOLU] Reports de données dans un tableau selon feuille et critère

Re,

Il n'y a aucun bug, la macro fait ce qu'elle doit faire.

Maintenant pour exclure les 2 dernières feuilles que tu as ajoutées il faut un critère.

Je constate que dans ces feuilles la cellule A1 est vide, donc :

Code:
Sub MAJ_TdS1()
Dim tablo(), w As Worksheet, nom$, t, n As Byte, lig&
ReDim tablo(1 To 12 * (Worksheets.Count - 1), 1 To 6)
With Sheets("TdS") 'nom à adapter éventuellemnt
  For Each w In Worksheets
    nom = w.[A1]
    If w.Name <> .Name And nom <> "" Then
      t = Application.Transpose(w.[B1:B73])
      For n = 1 To 12
        lig = lig + 1
        tablo(lig, 1) = nom
        tablo(lig, 2) = Application.Proper(Format("1/" & n, "mmmm"))
        tablo(lig, 3) = t(6 * n - 2)
        tablo(lig, 4) = t(6 * n - 1)
        tablo(lig, 5) = t(6 * n)
        tablo(lig, 6) = t(6 * n + 1)
      Next
    End If
  Next
  .[A2].Resize(lig, 6) = tablo
  .[A2].Resize(lig, 6).Replace 0, "", xlWhole 'facultatif, supprime les 0
  .Range("A" & lig + 2 & ":F" & .Rows.Count).ClearContents
End With
End Sub
A+
 

Gen Rose

XLDnaute Impliqué
Supporter XLD
Re : [RÉSOLU] Reports de données dans un tableau selon feuille et critère

Ah ben...

En effet, je ne voulais pas dire bug, c'est un très vilain mot! La macro, je le sais, faisais très bien son travail :)
C'est moi qui ai tout bousillé en ajoutant des TCD alors sans ton aide, je n'y serais jamais arrivé.

Merci beaucoup job, j'apprécie ton aide, comme toujours :eek:

On est chanceux de t'avoir sur XLD!

@ plus
 

job75

XLDnaute Barbatruc
Re : [RÉSOLU] Reports de données dans un tableau selon feuille et critère

Re,

Puisqu'il y a 2 TCD les 2 dernières lignes les actualisent :

Code:
Sub MAJ_TdS1()
Dim tablo(), w As Worksheet, nom$, t, n As Byte, lig&
ReDim tablo(1 To 12 * (Worksheets.Count - 1), 1 To 6)
With Feuil10 'CodeName à adapter éventuellemnt
  For Each w In Worksheets
    nom = w.[A1]
    If w.Name <> .Name And nom <> "" Then
      t = Application.Transpose(w.[B1:B73])
      For n = 1 To 12
        lig = lig + 1
        tablo(lig, 1) = nom
        tablo(lig, 2) = Application.Proper(Format("1/" & n, "mmmm"))
        tablo(lig, 3) = t(6 * n - 2)
        tablo(lig, 4) = t(6 * n - 1)
        tablo(lig, 5) = t(6 * n)
        tablo(lig, 6) = t(6 * n + 1)
      Next
    End If
  Next
  .[A2].Resize(lig, 6) = tablo
  .[A2].Resize(lig, 6).Replace 0, "", xlWhole 'facultatif, supprime les 0
  .Range("A" & lig + 2 & ":F" & .Rows.Count).ClearContents
End With
On Error Resume Next 'si les feuilles ou les TCD n'existent pas
Feuil11.PivotTables(1).PivotCache.Refresh
Feuil12.PivotTables(1).PivotCache.Refresh
End Sub
A+
 

Gen Rose

XLDnaute Impliqué
Supporter XLD
Re : [RÉSOLU] Reports de données dans un tableau selon feuille et critère

Ah ça, c'est trop généreux! Et vraiment intéressant :)

Alors, comme nous sommes dans le thème de l'automatisation, j'ai tout simplement mis ce code dans Workbook Open().

J'ai échangé Private Sub pour Workbook Open; est-ce ok? Ou ais-je créée une autre catastrophe? Après test, ça semble ok mais je veux ton approbabtion s.t.p. :eek:
 

Gen Rose

XLDnaute Impliqué
Supporter XLD
Re : [RÉSOLU] Reports de données dans un tableau selon feuille et critère

Oh...devrais-je plutôt le mettre dans un Workbook qui est plutôt événementiel? Car si j'ajoute des données dans les feuilles, parti comme ça, je vais devoir ouvrir et fermer mon document pour voir les modifications..
 

Gen Rose

XLDnaute Impliqué
Supporter XLD
Re : [RÉSOLU] Reports de données dans un tableau selon feuille et critère

Bon eh bien il faut ignorer mes tentatives; c'est impossible!

Il faudrait tout recommencer et je suis très heureuse avec le résultat actuel, même s'il faut déclencher l'importation manuellement.

Merci job, ne t'en fais pas; je suis toujours en train de me poser mille et une question ;)

@ + :eek:
 

job75

XLDnaute Barbatruc
Re : [RÉSOLU] Reports de données dans un tableau selon feuille et critère

Re Geneviève,

Perso j'utiliserais une Workbook_SheetActivate dans ThisWorkbook :

Code:
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
If InStr("Feuil10#Feuil11#Feuil12#", Sh.CodeName & "#") = 0 Then Exit Sub
Dim tablo(), w As Worksheet, nom$, t, n As Byte, lig&
ReDim tablo(1 To 12 * (Worksheets.Count - 1), 1 To 6)
With Feuil10 'CodeName à adapter éventuellemnt
  For Each w In Worksheets
    nom = w.[A1]
    If w.Name <> .Name And nom <> "" Then
      t = Application.Transpose(w.[B1:B73])
      For n = 1 To 12
        lig = lig + 1
        tablo(lig, 1) = nom
        tablo(lig, 2) = Application.Proper(Format("1/" & n, "mmmm"))
        tablo(lig, 3) = t(6 * n - 2)
        tablo(lig, 4) = t(6 * n - 1)
        tablo(lig, 5) = t(6 * n)
        tablo(lig, 6) = t(6 * n + 1)
      Next
    End If
  Next
  .[A2].Resize(lig, 6) = tablo
  .[A2].Resize(lig, 6).Replace 0, "", xlWhole 'facultatif, supprime les 0
  .Range("A" & lig + 2 & ":F" & .Rows.Count).ClearContents
End With
On Error Resume Next 's'il n'y a pas de TCD dans la feuille
Sh.PivotTables(1).PivotCache.Refresh
End Sub
A+
 

Gen Rose

XLDnaute Impliqué
Supporter XLD
Re : [RÉSOLU] Reports de données dans un tableau selon feuille et critère

Re job75,

Rien à ajouter car c'est parfait!
Ça fonctionne numéro1 et tout est automatique; qu'est-ce que l'on peut vouloir de plus?

Merci d'avoir écouté mes derniers comms, je suis on ne peux plus heureuse du résultat! :eek:
 

Discussions similaires

Statistiques des forums

Discussions
312 332
Messages
2 087 367
Membres
103 528
dernier inscrit
maro