Dénombrement vers massifié

Bonjour à vous !

Je souhaiterais savoir si quelqu'un est capable de m'aider !!

Je souhaiterais par macro ou formule, résoudre un casse-tête que je résous sur environ 100 Colonnes et avec des cas différents tous les mois.

Je ne peux expliquer la raison exacte qui est d'ordre professionnel....

Le problème, je dois massifier des nombres en priorisant quand j'ai le plus d’élément dans ma mass, voici une petite capture et je joins le fichier :

Est-ce qu'un dieu existe ??!!!

(J'arrive avec des si plus grand etc à faire des choses mais rien de génial et polyvalent.)

capture1

Bonjour,

peux-tu expliquer comment tu "massifies". Que faut-il faire pour passer de la base au résultat attendu ? merci d'illustrer par un exemple, le calcul pour les différents cas possibles.Je vois bien quelques liens entre la base et le résultat attendu, mais comment être sûr que ma boule de cristal fonctionne bien ?

Je sais pas si ça peux aider mais la démarche est la ...

De plus,
la macro doit comprendre et retrouver les lettres qui en réalité sont des mots de 5 caractères.. je suis prêt à faire une visio ou échange téléphonique ^^

capture3

Enfaite, Je dois massifier en priorité les ensembles qui possèdent le plus d’éléments en prenant dans ma mass des quantités d’élément égale.

exemple

j'ai 3 pommes, 4 bananes, 2 tartes , 8chaussures , 7 savons , 10 chaises

Et je dois massifier:

1)pommes+tartes+chaussures+savon

2)pommes+tartes+bananes

3)savons+chaussures

1) Je prends donc:

2 pommes + 2 tartes + 2 chaussures + 2 savons

Il me reste alors:

1 pommes, 4 bananes, 0 tartes , 6 chaussures , 5 savons , 10 chaises

2) Je prends donc:

0 pommes + 0 tartes + 0 bananes

Il me reste alors:

1 pommes, 4 bananes, 0 tartes , 6 chaussures , 5 savons , 10 chaises

3) Je prends donc:

5 savons + 5 chaussures

Il me reste alors:

1 pommes, 4 bananes, 0 tartes , 1 chaussures , 0 savons , 10 chaises

Voili voilou,

Bonjour,

le casse-tête c'est de comprendre tes semblants d'explications en fait...
A commencer par le terme 'massifier' dont on se demande sa présence ici.
eric

Bonjour à tous,

j'ai 3 pommes, 4 bananes, 2 tartes , 8chaussures , 7 savons , 10 chaises

Cela correspond à quoi dans ton tableau d'exemple ? Les chiffres dans la colonne B ?

Et effectivement, donne nous une définition claire de ce que signifie massifier, c'est sûrement très clair pour toi mais pour nous c'est un peu plus difficile !

Bonsoir,

peux-tu indiquer les paramètres à prendre en compte ? car il me semble que pour le cas que tu as présenté, tu as déjà les formules à utiliser.

j'imagine qu'il faut des formules qui s'adaptent :

1) aux valeurs du tableau de départ

2) au nombre de lignes et de colonnes du tableau de départ

3) aux équations de "massification", leur nombre et leur position (leur ordre) dans la chaine de "massification"

Salut Romain,
Salut les devins,

ainsi, sans doute...
Je relève cependant, me semble-t-il, une erreur dans ton tableau-exemple, sauf s'il s'agit d'une exception exceptionnelle !

Dernière colonne de ton tableau "inférieur" (sur 3 lignes).
A+B+C+F = 1 -> correct
A+B+C - B12 = 2 -> correct
A+B - (B11+B12) = 1 or le MIN( AB ) = 3 - (1 + 2) = 0, ce qui entraîne une erreur dans la dernière colonne du tableau-résultat...

La boucle étant correcte sur les autres colonnes et sur l'ensemble du tableau sauf cette colonne...
Autre question que je me pose : la macro doit reconnaître les mots, dis-tu. Pour le tableau-résultat, je n'ai pas cherché à les situer (FIND), contrairement au tableau inférieur : je suppose qu'en réalité, il faut aussi faire cette recherche de position pour exécuter les "formules" ?

Reste à savoir comment ta feuille de travail est organisée pour régler ça globalement.

Un double-clic sur la feuille démarre la macro.

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
'
Dim tSplit
'
Cancel = True
For x = 2 To 7
    For y = 11 To 9 Step -1
        tSplit = Split(Cells(y, 1), "+")
        For Z = 0 To UBound(tSplit)
            iRow = Columns(1).Find(what:=tSplit(Z), lookat:=xlWhole, LookIn:=xlValues).Row
            Cells(y, x) = IIf(Z = 0, Cells(iRow, x), WorksheetFunction.Min(Cells(y, x), Cells(iRow, x)))
        Next
        If y = 9 Then Cells(9, x) = Cells(9, x) - (Cells(10, x) + Cells(11, x))
        If y = 10 Then Cells(10, x) = Cells(10, x) - Cells(11, x)
    Next
    For y = 2 To 7
        If y < 5 Or y = 7 Then
            Cells(y, x).Offset(0, 7) = Cells(y, x) - _
                IIf(y < 4, WorksheetFunction.Sum(Range(fctCol(x) & "9:" & fctCol(x) & 11)), _
                IIf(y = 4, WorksheetFunction.Sum(Range(fctCol(x) & "10:" & fctCol(x) & 11)), Cells(11, x)))
        Else
            Cells(y, x).Offset(0, 7) = Cells(y, x)
        End If
    Next
Next
'
End Sub
3romain.xlsm (225.29 Ko)


A+

OUAAAA

Rebonjour et merci à vous tous !

Je n'aurais jamais pensé avoir autant de réponses !!

Effectivement je ne suis pas très claire.

Bon, je travail dans la maintenance (pas automobile mais dans le fichier que je viens de joindre c'est la même chose juste les nom des données diffère ...)

35copie-de-romain.xlsm (244.13 Ko)

Pour planifier des opérations de maintenance nous faisons des regroupements.

En gros si j'ai un parc de voiture à gérer, et que j'ai plein d'opérations de maintenance qui tombe, autant les regrouper en une seule.. ( il est question de capacitaire )

Je sais que je vais avoir 4 distributions 2 plaquettes et 3 jeux de pneus à faire sur une semaine.

L'objectif du regroupement et le gain de temps de travail planifié

(exemple bidon)Nous savons qu'une distribution compte 4H de travail et qu'une vidange compte 1H30, mais si je fais ces deux opérations en même temps je gagne 1H car je fais des taches qui sont identiques dans les deux opérations.

Je peux donc dire que sur ma semaine je vais pouvoir regrouper 2fois: 1 distribution + 1 jeu de plaquettes + 1 jeu de pneus; et qu'il me restera 2 distributions seule et 1 jeu de pneus seul.

J’espère être un peu plus explicite

Merci curulis57

Oui, j'ai fais une erreur sur la dernière colonne comme quoi l'humain fait des erreurs qu'excel ne fait pas !

Et pour répondre à ta question, oui le top c'est qu'il retrouve tout seul leurs positions et il peut y avoir des regroupements qui sont impossibles car pas d'opération..

du genre:

A2

B

3
G4
H1
A+C0
A+G+C0
Mais d’où vous viennes tout se savoir exclien?

Un big merci encore !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Bonjour,

Pour être plus explicite met la réalité des libellés. On suppose (?) que ce sont les A à E, mais que représente 1 à 6 ? Mystère et boule de gomme...
Pour les gains de temps sur 2 opérations ou plus, on fait un tirage aléatoire ou tu penses les fournir ?

Je pose mes questions mais ne compte pas sur moi. Devant tant de légèreté sur une demande je préfère passer mon tour.

eric

Bonjour à tous,

edit : je viens de découvrir toutes les réactions après le message de Curulis à 1:06 ce matin. (donc ma réponse ne tient pas compte de ces réactions)

une proposition. les différents paramètres sont en début de macro.

j'ai utilisé une autre méthode de calcul et l'ordre des équations est important. Pour arriver au même résultat que toi (à une erreur près sur la 6eme colonne), il faut mettre les équations dans l'ordre de prise en compte (inverse de ce que tu as mis). lancer la macro par alt-F8

Sub aargh()
    With ActiveSheet
'paramètres
        lm = 3 ' 1ere ligne mot
        nm = 6 'nombre de mots
        nc = 6 ' nombre de colonnes
        tabmot = .Cells(lm, 1).Resize(nm, 1) 'vecteur des mots
        leq = 10 'ligne 1ere equation
        neq = 3 'nombre d'équations

        For j = 2 To nc + 1
            tabcol = .Cells(lm, j).Resize(nm, 1) 'vecteur des valeurs de la colonne j
            For i = leq To leq + neq - 1 'on prend les equations une à une
                eq = Split(.Cells(i, 1), "+") 'on isole les mots
                mini = 1000 'on recherche le minimum pour les mots
                For k = LBound(eq) To UBound(eq)
                    ligne = cherchemot(tabmot, eq(k)) 'recherche de la ligne du mot
                    If ligne <> 0 Then If tabcol(ligne, 1) < mini Then mini = tabcol(ligne, 1) 'nouveau minimum
                Next k
                For k = LBound(eq) To UBound(eq)
                    ligne = cherchemot(tabmot, eq(k)) 'recherche de la ligne du mot
                    tabcol(ligne, 1) = tabcol(ligne, 1) - mini 'soustraction du minimum au vecteur en cours
                Next k
            Next i
            .Cells(3, 18 + j).Resize(6, 1) = tabcol 'affichage du vecteur résultat
        Next j
    End With
End Sub

Function cherchemot(mots, mot)
    For i = LBound(mots) To UBound(mots)
        If mots(i, 1) = mot Then cherchemot = i: Exit Function
    Next i
End Function

Bonjour Eriiic,

Dans le fichier "copie de romain" dans l'onglet données j'ai mi des exemples similaire des libellés.

Je ne peux pas mettre les vrais donnée suite à des données sensible d'un point de vue espionnage industrielle.

Pour ta demande sur les temps gagnés... je ne les connais pas moi même c'est un pôles gestion finances qui assemble le tout.

Plus il y a d'intervention regroupé et plus c'est avantageux ...

Désolé face à la légèreté apporté, il faut juste comprendre que je ne peux pas donner les détails... Les entreprises maintenant ne pardonnent plus ...

Mais merci pour ces questions qui vont surement aider quelqu'un d'autre à comprendre.

YEAH Merci H2SO4et merci aussi à curulis57

J'ai modifié le début du code pour qu'il calcul le nombre de ligne etc !!!

Il me manque juste le nombre de regroupement en résultat.. sinon les valeurs sont bonnes HORMIS SI JE RAJOUTE PAR EXEMPLE "+F" EN A12 POUR TROUVER "A+B+F" !

Curulis57 avec ton code j'ai réussi à avoir du négatif mais je sais plus comment... mais je l'enregistre bien soigneusement...

Sub aargh()

    With ActiveSheet
    Range("A3").Select
        lm = 3 ' 1ere ligne mot
        nm = [A3].End(xlDown).Row - 2 'nombre de mots
        nc = [B2].End(xlToRight).Columns ' nombre de colonnes
        tabmot = .Cells(lm, 1).Resize(nm, 1) 'vecteur des mots
        leq = nm + 4 'ligne 1ere equation
        neq = .Cells(leq, 1).End(xlDown).Row - leq + 1 'nombre d'équations

        For j = 2 To nc + 1
            tabcol = .Cells(lm, j).Resize(nm, 1) 'vecteur des valeurs de la colonne j
            For i = leq To leq + neq - 1 'on prend les equations une à une
                eq = Split(.Cells(i, 1), "+") 'on isole les mots
                mini = 1000 'on recherche le minimum pour les mots
                For k = LBound(eq) To UBound(eq)
                    ligne = cherchemot(tabmot, eq(k)) 'recherche de la ligne du mot
                    If ligne <> 0 Then If tabcol(ligne, 1) < mini Then mini = tabcol(ligne, 1) 'nouveau minimum
                Next k
                For k = LBound(eq) To UBound(eq)
                    ligne = cherchemot(tabmot, eq(k)) 'recherche de la ligne du mot
                    tabcol(ligne, 1) = tabcol(ligne, 1) - mini 'soustraction du minimum au vecteur en cours
                Next k
            Next i
            .Cells(3, 8 + j).Resize(6, 1) = tabcol 'affichage du vecteur résultat
        Next j
    End With
End Sub

Function cherchemot(mots, mot)
    For i = LBound(mots) To UBound(mots)
        If mots(i, 1) = mot Then cherchemot = i: Exit Function
    Next i
End Function

Salut Romain,
Salut l'équipe,

bravo, Romain, c'est bien rare quelqu'un qui met les mains dans le cambouis !

Maintenant que nous avons un tableau digne de ce nom, je vais y aller de mon petit code cette soirée.


A+

bonsoir

Il me manque juste le nombre de regroupement en résultat.. sinon les valeurs sont bonnes HORMIS SI JE RAJOUTE PAR EXEMPLE "+F" EN A12 POUR TROUVER "A+B+F" !

nouvelle version pour correction de l'affichage des résultats. Pour le +F en ligne, je n'ai pas de problème. (un cas précis à me montrer ?)

Salut Romain,
Salut H2so4,

- Nouvelle version adaptée au nouveau tableau qui se coordonne automatiquement avec les dimensions de tes deux tableaux (Données et Critères).
- J'ose espérer que la structure présentée est fixe (Série, Type) avec des données commençant en ligne 2, colonne "C" !!
- Pour que ça fonctionne, je ne te demande, en plus, que de garder le mot "Critères" en colonne [A:A] comme en-tête du tableau "Critères".
- Je constate qu'il faut respecter un nombre au moins égal ou supérieur de critères de "massification" de ligne en ligne d'où vérification en début de processus.
- Tu peux donc ajouter un critère ou l'autre à n'importe quelle ligne à condition de respecter cette condition.
- Je copie le tableau de données sous le tableau "Critères", histoire de garder intactes les données de base.
- Pas matheux pour un sou, il faudra me dire comment tu calcules le nombre de regroupements .

Un double-clic démarre la macro, à volonté...

For x = 3 To iCol                                       'lecture par colonne de données
    For y = iC To rCel.Offset(1, 0).Row Step -1         'calcul du tableau "Critères" de la dernière à la première ligne
        tSplit = Split(Cells(y, 2), "+")                'tableau SPLIT de la ligne de critères
        For Z = 0 To UBound(tSplit)                     'recherche brute du minimum entre critères
            For k = 2 To iM                             'vérification de la concordance entre les "Série" et "Type"
                If Cells(k, 1) = Cells(y, 1) And Cells(k, 2) = tSplit(Z) Then _
                    Cells(y, x) = IIf(Z = 0, Cells(k, x), WorksheetFunction.Min(CInt(Cells(y, x)), CInt(Cells(k, x))))
            Next
        Next
        If y < iC Then                                  'affinage du tableau "Critères" dès l'avant-dernière ligne de critères
           For k = y + 1 To iC                          'lecture depuis la la ligne inférieure jusqu'en bas du tableau
               iOK = 0                                  'calcul de la présence de chaque critère
               For w = 0 To UBound(tSplit)
                   If InStr(Cells(k, 2), tSplit(w)) > 0 Then iOK = iOK + 1
               Next
               If iOK = UBound(tSplit) + 1 Then Cells(y, x) = CInt(Cells(y, x)) - CInt(Cells(k, x)) 'tous critères présents = soustraction
           Next
        End If
    Next
    For y = 2 To iM                                     'affinage du tableau "Résultats"
        For Z = rCel.Offset(1, 0).Row To iC             'si donnée présente dans "Critères" = soustraction
            If Cells(Z, 1) = Cells(y, 1) And InStr(Cells(Z, 2), Cells(y, 2)) > 0 Then _
                Cells(y, x).Offset(iC + 1, 0) = CInt(Cells(y, x).Offset(iC + 1, 0)) - CInt(Cells(Z, x))
        Next
    Next
Next
8romain.xlsm (112.23 Ko)


A+

Merci Curilis57 !! Je vois que tu n'aimes pas dormir !!

Rien à dire sur la mise en forme ect... juste, si je change en "A11" CLIO par MEGANE ça ne vas plus ... et ça, je ne comprend pas bien.

J'ai suivi le déroulé de la macro et je ne vois pas pourquoi..?

Mais sinon niveau valeur tu es bon !!

Salut Romain,
Salut H2SO4,

à mon humble avis, c'est le doublement des mêmes valeurs "Type" qui pose problème.
Tu demandes le minimum pour chaque poste puis, dans le cas que tu soulèves, tu fais 2 soustractions pour 1 même poste là où il n'y a eu nulle part d'addition de ces postes de deux "Série" différentes.

Quand tu fais tes calculs à la main, j'imagine que tu additionnes les "Type" similaires de "Série" différentes ?
Si j'ai raison, il faut alors créer une "Série" mixte, par exemple C6M3, pour CLIO= 6 pneus - Mégane = 3 pneus, et ne garder qu'1 "Type" unique "PNEUS".
À toi, après le calcul, de splitter le résultat entre les 2 "Série".

Si tu as une autre solution...
Que raconte la nouvelle version d'H2SO4 à ce propos ?


A+

bonjour à tous,

Que raconte la nouvelle version d'H2SO4

Cette version est toujours basée sur le premier modèle de classeur fourni par Romain

Rechercher des sujets similaires à "denombrement massifie"