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.)
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 ?
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
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.
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:
| A | 2 | |
B | 3 | |
| G | 4 | |
| H | 1 | |
| A+C | 0 | |
| A+G+C | 0 |
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 FunctionSalut 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
A+
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
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
