Trie données via critères

Bonjour à tous,

Voilà mon problème, je suis stagiaire et je dois créer un tableau de synthèse (en gros). Pour cela je dois aller chercher mes valeurs dans plusieurs tableau différents (Tableau 1, Tableau 2,....). Le truc c'est que les données dans ces tableaux ne sont pas triées et je pensais pourvoir le faire via VBA.

Dans ces tableaux j'aimerais pouvoir exécuter le programme suivant :

  • Je prend ma 1ère valeur dans la cellule A1 de ma 1ère feuille
  • Je vais dans la seconde feuille et je cherche dans la colonne J les valeurs égale A1 (feuille 1) quand je trouve une valeur égale je vais chercher la valeur de la cellule F correspondante (ex : J8 (feuille 2) = A1 (feuille 1) je cherche et stock F8)
  • Une fois le tableau "sondé" complètement la somme des valeurs de F doivent apparaitre dans ma cellule B1 de ma 1ère feuille
  • Je recommence ensuite la valeur de A2 et ce jusqu'à ce que je tombe sur une cellule vide en A

J'ai de vague connaissance en VBA pour en avoir fait en cours mais malheureusement je ne pourrais récupérer mes cours et mes fichiers que dans une semaine.

Merci d'avance pour votre et si vous avez besoin de plus de précision n'hésitez pas.

Salut Zixx,

Bienvenue sur le forum,

Ah oui désolé ^^

Le fichier qui suit est un exemple étant donné le caractère confidentiel des données.

Ce que je voudrais que la macro fasse c'est qu'elle trouve le poids de tous les "A-man" et me donne la somme dans la feuille 1 comme dans l'exemple.

18exemple.xlsx (14.31 Ko)

Bonjour,

En l'état une formule utilisant SOMME.SI ou SOMMEPROD te donnera le résultat recherché, pourquoi ne pas le faire ?

Bonjour MFerrand,

Je ne connaissait pas ces formules avant que tu m'en parles et je dois probablement mal les utiliser car j'obtiens 0 en valeur avec les 2 formules ^^

Et je voulais essayer de mettre une macro car les tableaux sont assez différents les uns des autres et surtout je voulais rendre le tout le plus automatisé possible.

Mais si cela peut fonctionner avec des formules ça me vas aussi

Au passage je suis sur la version 2010

=SOMME.SI(Feuil2!$J$5:$J$23;A1;Feuil2!$F$5:$F$23)

En B1 et tu la tires jusqu'en B5.

Une macro ne résoudra pas la question de différences, pas plus que des formules d'ailleurs !

Dans les deux cas il faudra adapter pour prendre en compte les différences, ce qui implique préalablement de savoir en quoi consistent ces différences !

Nickel ça marche l'erreur venait bien de moi

Je me demande si avec cette formule je peux l'appliquer sur plusieurs feuilles à la fois dans le même classeur ?

Si par exemple j'avais un tableau similaire à celui de la feuille 2, mais aussi sur la feuille 3,4,.... car quand j'essaye la plage que j'ai choisi se déporte automatiquement sur la feuille activée.

Est-ce que je dois forcément faire une cellule somme pour chaque feuille ?

Toujours fournir un modèle correspondant rigoureusement au résultat que l'on veut obtenir... !

Cordialement.

Tu as raison j'aurais du y penser des le début mais c'est que le tableau aux plusieurs feuilles et un tableau différent de celui que je traitait lorsque j'ai fournis mon exemple ^^

Mais bon voila une version corrigée du tableau avec comme seul solution à mon problème plusieurs cellules somme.

15exemple.xlsx (17.36 Ko)

Tu entres dans le domaine de formule 3D ! Pour avoir le total des 3 feuilles avec une seule formule :

=SOMMEPROD(SOMME.SI(INDIRECT("Feuil"&LIGNE($2:$4)&"!J5:J23");A1;INDIRECT("Feuil"&LIGNE($2:$4)&"!F5:F23")))

Mais là on est avec des noms de feuilles génériques dont les numéros se suivent...

Il serait donc bon pour mettre au point une formule qui marche d'avoir les noms réels des feuilles.

Cordialement.

Jolie formule Mferrand,

Je me suis amusé à un petit test en vba,

Je voulais boucler sur les feuilles mais bon j'ai calé.

Bonne soirée

Merci pour les compliments mais je dois les décliner... En matière de formule 3D, l'inspiration vient toujours de chez Boisgontier !

Je suis déjà assez content lorsque j'arrive à en modifier une pour l'adapter à un autre contexte...

Côté macro, voici une façon de calculer :

Sub Calculer()
    Dim Ts(), Ff, Man, f%, m%, n%, i%
    Ff = Array("Feuil2", "Feuil3", "Feuil4")
    With ActiveSheet
        n = .Cells(.Rows.Count, 1).End(xlUp).Row
        Man = .Range("A1:A" & n).Value
    End With
    ReDim Ts(1 To n, 0)
    For f = 0 To UBound(Ff)
        With Worksheets(Ff(f))
            n = .Cells(.Rows.Count, 10).End(xlUp).Row
            For i = 5 To n
                For m = 1 To UBound(Man)
                    If Man(m, 1) = .Cells(i, 10) Then
                        Ts(m, 0) = Ts(m, 0) + .Cells(i, 6)
                        Exit For
                    End If
                Next m
            Next i
        End With
    Next f
    ActiveSheet.Range("F1").Resize(UBound(Ts)).Value = Ts
End Sub

On boucle sur les feuilles (à partir d'un tableau des noms de feuilles. On boucle sur les lignes de chaque feuille, et on recherche l'adéquation du 'Man' dans un tableau des 'Man' cherchés (encore une boucle) qui nous fournit l'indice d'un tableau de résultats (dimensionné sur les 'Man' cherchés) : élément du tableau dans lequel on additionne le poids.

A la fin, il n'y a plus qu'à matérialiser le tableau sur la feuille.

Cordialement.

Tout d'abord un grand merci les gars !

J'ai testé et ça fonctionne à merveille.

Je sais que je vais encore abuser de votre gentillesse mais serait il possible d'avoir un peu plus de détails sur le fonctionnement de ces macros ? Afin que je puisse les adapter car là le niveau me dépasse un peu ^^

Encore merci pour votre aide

Salut le forum Mferrand, Zixx.

Ah ce cher Boisgontier

J'ai testé ton code , du coup tu affiches pas le total par feuille pour ?

Feuil2 Feuil3 Feuil 4

A-man

B-man

C-man

D-man

E-man

Après je sais pas si c'est ce que veux Zixx, j'ai lu rapidement.

Bonne journée à tous.

Personnellement avoir le total par feuille ou seulement celui du classeur pour A, B, C,... comme dans le code MFerrand n'est pas dérange. En soit je perds, certes, un niveau de détail mais dans mon cas ce n'est pas vraiment problématique.

D'accord,

Bon j'ai fait avec une boucle (donc un truc plus propre qu'hier soir). Et qui fait la répartition par feuille

Pour info le code

Sub programmeprincipal()
Dim recap As Worksheet
Dim sh4 As Worksheet
Dim X As Long

'compte nombre de feuille
y = Sheets.Count

For i = y To 2 Step -1
    Set sh4 = Sheets(i)
    sh4.Range("$A$1:$E$1").ClearContents
    LastRow = sh4.Cells(sh4.Rows.Count, "J").End(xlUp).Row
        For X = 4 To LastRow
                Select Case sh4.Cells(X, "J")
                    Case "A-man"
                        With sh4
                         .Range("A1") = .Cells(X, "F") + .Range("A1")
                        End With
                    Case "B-man"
                        With sh4
                        .Range("B1") = .Cells(X, "F") + .Range("B1")
                        End With
                    Case "C-man"
                        With sh4
                        .Range("C1") = .Cells(X, "F") + .Range("C1")
                        End With
                    Case "D-man"
                        With sh4
                        .Range("D1") = .Cells(X, "F") + .Range("D1")
                        End With
                    Case "E-man"
                        With sh4
                        .Range("E1") = .Cells(X, "F") + .Range("E1")
                        End With
                End Select
        Next X
Next i

'copy final dans tableau

For J = y To 2 Step -1
    Sheets(J).Range("$A$1:$E$1").copy
    Sheets("feuil1").Range(Cells(2, J), Cells(2, J)).PasteSpecial Transpose:=True
Next J
'mise en forme
Application.CutCopyMode = False

Sheets("feuil1").Cells(1, 1).Select
End Sub

Merci pour les explications en plus

Avant de le mettre en résolu je vais essayer de l'adapter aux autre tableaux, histoire que si je bloque encore je puisse demander encore un peu d'aide ^^"

Dès que j'ai fini cela je passe le topic en résolu

ça marche

Aller j'ai encore simplifié le code.

Sub programmeprincipalv2()
Dim recap As Worksheet
Dim sh4 As Worksheet
Dim X As Long
Dim sh1 As Worksheet

Application.ScreenUpdating = False

Set sh1 = Sheets("Feuil1")

sh1.Range("calcul").ClearContents

'compte nombre de feuille
y = Sheets.Count

For i = y To 2 Step -1
    Set sh4 = Sheets(i)
    LastRow = sh4.Cells(sh4.Rows.Count, "J").End(xlUp).Row
        For X = 4 To LastRow
                Select Case sh4.Cells(X, "J")
                    Case "A-man"
                        With sh1
                         .Range(.Cells(2, i), .Cells(2, i)) = sh4.Cells(X, "F") + .Range(.Cells(2, i), .Cells(2, i))
                        End With
                    Case "B-man"
                        With sh1
                        .Range(.Cells(3, i), .Cells(3, i)) = sh4.Cells(X, "F") + .Range(.Cells(3, i), .Cells(3, i))
                        End With
                    Case "C-man"
                        With sh1
                        .Range(.Cells(4, i), .Cells(4, i)) = sh4.Cells(X, "F") + .Range(.Cells(4, i), .Cells(4, i))
                        End With
                    Case "D-man"
                        With sh1
                        .Range(.Cells(5, i), .Cells(5, i)) = sh4.Cells(X, "F") + .Range(.Cells(5, i), .Cells(5, i))
                        End With
                    Case "E-man"
                        With sh1
                        .Range(.Cells(6, i), .Cells(6, i)) = sh4.Cells(X, "F") + .Range(.Cells(6, i), .Cells(6, i))
                        End With
                End Select
        Next X
Next i

MsgBox "Calcul terminé"

End Sub

Bonne journée

Bonjour,

Pour la procédure de calcul que j'ai fournie, j'ai déjà indiqué dans le même post comment elle opérait. Pour le détail de la méthode, elle opère en tableaux et boucles... Ff : tableau de noms de feuilles (mais on peut s'en passer si toutes ou presque sont concernées, on opère alors la boucle classiquement sur les feuilles avec une variable Worksheet, en excluant celles qui doivent l'être...).

Man : tableau des codes man à rechercher (par affectation des valeurs de la plage qui les contient).

Ts : tableau de résultats (dimensionné sur Man, en assurant la correspondance d'indices). Si l'on veut d'autres résultats, on garde son dimensionnement en lignes et on ajoute des colonnes, par exemple une par feuille traitée et une pour le Total, ajout qu'on peut faire en redimensionnant à chaque feuille traitée, sans avoir à connaître préalablement le nombre, et si l'on veut réserver une ligne pour placer les en-têtes de colonnes, on enlève le "1 To..." du premier dimensionnement pour dimensionner à partir de 0 en lignes...

On opère avec le moins d'interaction possible, sans écrire sur Excel, avant la fin, et sans copier-coller et les calculs se font hors Excel, ce qui garantit la rapidité d'exécution... et c'est adaptable à tout résultat que l'on souhaite obtenir.

Cordialement.

Salut Mferrand, le foum,

C'est clair que l'utilisation d'un tableau est bien puissant 8) . Juste je comprends pas à quel moment tu fais ton test A-man, B-man etc??

Sauf erreur j'ai l'impression que le calcul pour les B-man est erroné (voir capture). J'ai essayé de regardé mais j'ai pas trouvé ou ça pouvait clocher.

En tout cas je risque de me resservir de ce code si tu acceptes les copyrights lol.

@+

capture resultat
Rechercher des sujets similaires à "trie donnees via criteres"