XL 2010 Traiter données sur plusieurs onglets

zendb

XLDnaute Junior
Bonjour tout le monde,

J'ai un fichier de travail à construire et ce que je souhaite faire dépasse mes compétences ... J'ai besoin de votre aide et aussi comprendre comment le faire.

J'ai un fichier ou je saisis toutes les commandes réalisées par des structures. J'ai un onglet par structure.
Dans chaque onglet j'ai, la date de la commande, ce qui a été commandé "objet et modèle" et la quantité.
Entre les onglets il n'y a pas forcement la même liste d'objets commandés.


L'objectif est d'avoir un onglet "bilan" qui va aller chercher dans chaque onglet ce qui a été commandé par chaque structure.

Je voudrais pouvoir avoir, pour chaque structure un bilan :
- l'objet + modèle
- le cumul mensuel commandé
- les lignes à 0 ne soient pas affichées


J'ai essayé avec un TCD mais je n'ai même pas réussi à l'afficher. Je pense qu'il faille passer par une macro ?

Les soucis :
- Entre les onglets/structures il n'y a pas la même liste d'objets : tout le monde ne commande pas la même chose.
- Est affichée uniquement la liste des objets qui ont été commandés
- il faut faire un cumul mensuel et afficher uniquement les objets commandés

J'ai fait un exemple avec 4 onglets et ce que je souhaite voir affiché.
Sachant quand la présentation n'est qu'un exemple, mais sur l'idée/principe c'est ce que je souhaite.

Merci, si c'est trop compliqué, tant pis je continuerai à le faire à la main :/
 

Pièces jointes

  • Essai nouveau fichier commandes.xlsx
    12.9 KB · Affichages: 53

mutzik

XLDnaute Barbatruc
bonjour

faut (à mon avis) refaire le tableau de la manière suivante
- une feuille avec tes produits (une colonne donne la ref du produit)
- une feuille avec la liste des clients (structures dans ton cas) avec une colonne donnant le num ou un abrégé du nom de ta structure
- une feuille récap commandes dans laquelle :
: tu choisis la date
: tu choisis dans une liste le produit consommé / vendu ...
: la quantité
: le client (structure)

tu écris ensuite toutes ces valeurs dans une colonne séparée pour chaque commande / vente
et chaque commande/vente dans la ligne en dessous

- ensuite, c'est tout bénefice pour trier, calculer faire des graphs à partir de ces données
et surtout, beaucoup beaucoup plus simple
 

zendb

XLDnaute Junior
Merci de la réponse,

Je vais voir la faisabilité, praticité.

Par contre je saisis pas :
tu écris ensuite toutes ces valeurs dans une colonne séparée pour chaque commande / vente
et chaque commande/vente dans la ligne en dessous

Sinon depuis le temps que je veux commencer à coder en VBA pour faire mes propres macro et arrêter de demander à droite et à gauche. Je me dis que c'est le bon moment.

EDIT : bon finalement j'ai vu le soucis différemment :
- faire 2 tables de correspondance pour les menus déroulants.
- faire une feuille avec une saisie "tout venant" en indiquant le produit vendus, quantités, la structure.
- faire un onglet par structure et à l'intérieur faire un TCD qui sera mis à jour automatiquement.

La phase de création du fichier est juste "longue" car il faut faire une 30aine de TCD sur 30 onglets, mais une fois fait le traitement des données sera très rapide.

 
Dernière édition:

klin89

XLDnaute Accro
Bonsoir zendb, mutzik, le forum :)

Essaie ceci :
VB:
Option Explicit
Sub test()
Dim ws As Worksheet, a, w(), x, y, myMonth As String
Dim i As Long, ii As Long, iii As Long, iiii As Long, n As Long, t As Long
    With CreateObject("Scripting.Dictionary")
        For Each ws In Worksheets
            If ws.Name <> "Bilan" Then
                a = ws.Range("a1").CurrentRegion.Value
                Set .Item(ws.Name) = _
                CreateObject("Scripting.Dictionary")
                For i = 3 To UBound(a, 1)
                    myMonth = Format$(a(i, 1), "mm-yyyy")
                    If Not .Item(ws.Name).exists(myMonth) Then
                        Set .Item(ws.Name)(myMonth) = _
                        CreateObject("Scripting.Dictionary")
                    End If
                    For ii = 3 To UBound(a, 2)
                        If a(1, ii) = "" Then a(1, ii) = a(1, ii - 1)
                        If Not .Item(ws.Name)(myMonth).exists(a(1, ii)) Then
                            Set .Item(ws.Name)(myMonth)(a(1, ii)) = _
                            CreateObject("Scripting.Dictionary")
                        End If
                        If Not .Item(ws.Name)(myMonth)(a(1, ii)).exists(a(2, ii)) Then
                            ReDim w(1 To 2)
                            w(1) = a(2, ii)
                        Else
                            w = .Item(ws.Name)(myMonth)(a(1, ii))(a(2, ii))
                        End If
                        w(2) = w(2) + a(i, ii)
                        .Item(ws.Name)(myMonth)(a(1, ii))(a(2, ii)) = w
                    Next
                Next
            End If
        Next
        x = .keys: y = .items
    End With
    Application.ScreenUpdating = False
    With Sheets("Bilan")
        .Cells.Clear
        For i = 0 To UBound(y)
            n = n + 1
            With .Cells(n, 1)
                .Value = x(i)
                With .Resize(, 3)
                    .HorizontalAlignment = xlCenterAcrossSelection
                    .Interior.ColorIndex = 33
                End With
            End With
            For ii = 0 To y(i).Count - 1
                If ii = 0 Then n = n + 1 Else n = n + 2
                With .Cells(n, 1)
                    .Value = y(i).keys()(ii)
                    With .Resize(, 3)
                        .HorizontalAlignment = xlCenterAcrossSelection
                        .Interior.ColorIndex = 4
                    End With
                End With
                For iii = 0 To y(i).items()(ii).Count - 1
                    For iiii = 0 To y(i).items()(ii).items()(iii).Count - 1
                        n = n + 1: t = t + 1
                        .Cells(n, 1).Offset(, 1).Resize(, 2).Value = y(i).items()(ii).items()(iii).items()(iiii)
                    Next
                    With .Cells(n + 1 - t, 1)
                        .Value = y(i).items()(ii).keys()(iii)
                        .Resize(t).Merge
                    End With
                    t = 0
                Next
                With .Cells(n, 1).CurrentRegion
                    .BorderAround Weight:=xlThin
                    .Borders(xlInsideVertical).Weight = xlThin
                    .Borders(xlInsideHorizontal).Weight = xlThin
                    .VerticalAlignment = xlCenter
                    If ii = 0 Then
                        With .Offset(2).Resize(.Rows.Count - 2)
                            .HorizontalAlignment = xlCenter
                        End With
                    Else
                        With .Offset(1).Resize(.Rows.Count - 1)
                            .HorizontalAlignment = xlCenter
                        End With
                    End If
                End With
            Next
            n = n + 1
        Next
    End With
    Application.ScreenUpdating = True
End Sub
klin89
 

Regueiro

XLDnaute Impliqué
Bonsoir le Forum
Votre fichier en retour
Toutes les données sont sous forme de Tableau dans l'onglet Données
Ensuite dans l'onglet TCD vous trouverez un tableau croisée dynamique
Avec des slicers ( segments ) pour chaque structure, objets et modèles.
et un segment pour filtrer par dates ( Années, Trimestres, mois, jours )
@+
 

Pièces jointes

  • Essai nouveau fichier commandes.xlsx
    26.1 KB · Affichages: 43

klin89

XLDnaute Accro
Re zendb, :)

Suite à cette remarque :
Je voudrais pouvoir avoir, pour chaque structure un bilan :
- les lignes à 0 ne soient pas affichées
le code réajusté :
VB:
Option Explicit
Sub test()
Dim ws As Worksheet, a, w(), x, y, myMonth As String, flag As Boolean
Dim i As Long, ii As Long, iii As Long, iiii As Long, n As Long, t As Long
    With CreateObject("Scripting.Dictionary")
        For Each ws In Worksheets
            If ws.Name <> "Bilan" Then
                a = ws.Range("a1").CurrentRegion.Value
                Set .Item(ws.Name) = _
                CreateObject("Scripting.Dictionary")
                For i = 3 To UBound(a, 1)
                    myMonth = Format$(a(i, 1), "mm-yyyy")
                    If Not .Item(ws.Name).exists(myMonth) Then
                        Set .Item(ws.Name)(myMonth) = _
                        CreateObject("Scripting.Dictionary")
                    End If
                    For ii = 3 To UBound(a, 2)
                        If a(1, ii) = "" Then a(1, ii) = a(1, ii - 1)
                        If Not .Item(ws.Name)(myMonth).exists(a(1, ii)) Then
                            Set .Item(ws.Name)(myMonth)(a(1, ii)) = _
                            CreateObject("Scripting.Dictionary")
                        End If
                        If Not .Item(ws.Name)(myMonth)(a(1, ii)).exists(a(2, ii)) Then
                            ReDim w(1 To 2)
                            w(1) = a(2, ii)
                        Else
                            w = .Item(ws.Name)(myMonth)(a(1, ii))(a(2, ii))
                        End If
                        w(2) = w(2) + a(i, ii)
                        .Item(ws.Name)(myMonth)(a(1, ii))(a(2, ii)) = w
                    Next
                Next
            End If
        Next
        x = .keys: y = .items
    End With
    Application.ScreenUpdating = False
    With Sheets("Bilan")
        .Cells.Clear
        For i = 0 To UBound(y)
            n = n + 1
            With .Cells(n, 1)
                .Value = x(i)
                With .Resize(, 3)
                    .HorizontalAlignment = xlCenterAcrossSelection
                    .Interior.ColorIndex = 33
                End With
            End With
            For ii = 0 To y(i).Count - 1
                If ii = 0 Then n = n + 1 Else n = n + 2
                With .Cells(n, 1)
                    .Value = y(i).keys()(ii)
                    With .Resize(, 3)
                        .HorizontalAlignment = xlCenterAcrossSelection
                        .Interior.ColorIndex = 4
                    End With
                End With
                For iii = 0 To y(i).items()(ii).Count - 1
                    For iiii = 0 To y(i).items()(ii).items()(iii).Count - 1
                        If y(i).items()(ii).items()(iii).items()(iiii)(2) Then
                            n = n + 1: t = t + 1: flag = True
                            .Cells(n, 1).Offset(, 1).Resize(, 2).Value = y(i).items()(ii).items()(iii).items()(iiii)
                        End If
                    Next
                    If t > 0 Then
                        With .Cells(n + 1 - t, 1)
                            .Value = y(i).items()(ii).keys()(iii)
                            .Resize(t).Merge
                        End With
                        t = 0
                    End If
                Next
                With .Cells(n, 1).CurrentRegion
                    If flag = True Then
                        .BorderAround Weight:=xlThin
                        .Borders(xlInsideVertical).Weight = xlThin
                        .Borders(xlInsideHorizontal).Weight = xlThin
                        .VerticalAlignment = xlCenter
                        If ii = 0 Then
                            With .Offset(2).Resize(.Rows.Count - 2)
                                .HorizontalAlignment = xlCenter
                            End With
                        Else
                            With .Offset(1).Resize(.Rows.Count - 1)
                                .HorizontalAlignment = xlCenter
                            End With
                        End If
                    Else
                        With .Resize(, 3)
                            .BorderAround Weight:=xlThin
                            .Borders(xlInsideHorizontal).Weight = xlThin
                        End With
                    End If
                    flag = False
                End With
            Next
            n = n + 1
        Next
    End With
    Application.ScreenUpdating = True
End Sub
klin89
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 413
Messages
2 088 199
Membres
103 764
dernier inscrit
nissassa