Macro qui détecte les Interactions dans une matrice

Salut tout le monde, c'est encore moi !

Bon je viens vous embêter avec ma magnifique matrice !

Alors, je vous explique ma nouvelle mission :

je dois en fait griser les cellules de ma matrice pour lesquelles les produits ne peuvent pas se rencontrer.

Je reprends la matrice que Myta avait mis sur le forum :

https://www.excel-pratique.com/~files/doc/PoulPow_Comments.xls

En fait, comme on peut le voir sur le doc, on a les mêmes produits en abscisse et en ordonnée. J'ai mis (uniquement en ordonnée : colonne B à N) les lieux où sont fabriqués les produits, mais bien sûr les mêmes lieux de fabrication s'appliquent aussi pour les produits qui sont en abscisse (j'espère que vous suivez toujours )

Donc en fait, ce que je veux, c'est que lorsque deux produits différents (un provenant de l'abscisse et l'autre de l'ordonnée) se rencontrent, si un des lieux de fabrication coincide, alors, la cellule reste tel quel. En revanche, si aucun des lieux coincide, alors, la cellule doit se griser légèrement.

Un exemple sur le doc que j'ai mis :

En abscisse, on prend le produit 8 qui est fabriqué dans les lieux R18 - R29 - R15 et il rencontre le produit 6 (dont on peut voir sur les colonnes du lieux de fabrication qu'il est fabriqué dans les lieux R20 et R18). Alors, la cellule va rester tel quel.

En revanche, si ce même produit 8 rencontre le produit 1, on peut voir que tous les deux n'ont aucun lieux en commun de fabrication, donc, dans ce cas la cellule va légèrement se griser.

Merci beaucoup !!

Houla ça devient hyper compliqué ton truc !

Attention ! Avant que quelqu'un se penche dessus...

Tu m'avais fait faire une macro pour rajouter des colonnes, pour lesquelles le produit ne s'appelait plus PRODUIT N°. Est ce que c'est toujours valable ?

En gros est ce qu'à partir de la colonne 26 (colonne "V"), le numéro de colonne R1C1 donnera toujours le numéro de produit ?

Idem pour les lignes...

Sinon tu risques de faire travailler les gens pour leur dire ensuite que ça marche pas, ça va pas leur plaire...

Au fait pour moi c'est trop compliqué, j'espère que d'autres se pencheront dessus

Salut le forum

Merci Sylvain d'avoir pris la relève de la ficelle :

https://forum.excel-pratique.com/viewtopic.php?t=6185&start=40

Qui déjà n'a pas été mise en mode [Résolu]

Merci à Poulpow de bien vouloir corriger cette lacune, avant que nous donnions suite

à cette nouvelle ficelle.

N.B. Je reste muet de toutes réponses venant de ma part si pas de suite sur la ficelle

citée ci-haut.

Amicalement Mytå

  • Dès que votre problème est résolu, merci de le marquer en tant que [Résolu]
    grâce à l'utilitaire se trouvant en bas de page, aperçu :
Mytå a écrit :

Salut le forum

Merci Sylvain d'avoir pris la relève de la ficelle :

https://forum.excel-pratique.com/viewtopic.php?t=6185&start=40

Qui déjà n'a pas été mise en mode [Résolu]

Merci à Poulpow de bien vouloir corriger cette lacune, avant que nous donnions suite

à cette nouvelle ficelle.

N.B. Je reste muet de toutes réponses venant de ma part si pas de suite sur la ficelle

citée ci-haut.

Amicalement Mytå

  • Dès que votre problème est résolu, merci de le marquer en tant que [Résolu]
    grâce à l'utilitaire se trouvant en bas de page, aperçu :

Désolé, je n'avais pas vu. Le problème est réglé !

Sylvain TBM a écrit :

Houla ça devient hyper compliqué ton truc !

Attention ! Avant que quelqu'un se penche dessus...

Tu m'avais fait faire une macro pour rajouter des colonnes, pour lesquelles le produit ne s'appelait plus PRODUIT N°. Est ce que c'est toujours valable ?

En gros est ce qu'à partir de la colonne 26 (colonne "V"), le numéro de colonne R1C1 donnera toujours le numéro de produit ?

Idem pour les lignes...

Sinon tu risques de faire travailler les gens pour leur dire ensuite que ça marche pas, ça va pas leur plaire...

Au fait pour moi c'est trop compliqué, j'espère que d'autres se pencheront dessus

Je t'avoues que jai du mal à te suivre

Pour ce qui est du nom "Produit 1", etc... oui, ce se sera changer pour mettre à la place le vrai nom de ces produits (j'espère répondre à ta question)

En fait, dans ce que tu me dis, je ne vois pas ce qu'est R1C1...

En gros, V21 : DH21 et R26 : R116 on aura les mêmes noms de produit, dans le même ordre.

Par contre, il faut toujours garder dans l'optique que la matrice pourra être complétée avec d'autres produits, donc que les cellules correspondant à ces nouveaux produits soient, elles-aussi grisées si elles n'ont pas de correspondance de lieu de fabrication avec les autres produits déjà présent dans la matrice.

J'espère être clair, c'est plus facile à expliquer en parlant qu'en l'écrivant

Toujours personne pour m'aider ?

allez, UP

Salut !

Bon je pense avoir fait de nets progrès en 15 jours.

Alors voilà une proposition de code pour ton nouveau problème.

A TESTER A FOND AVANT DE CONSIDÉRER COMME BON

Un peu long à gérer vu qu'on vérifie plusieurs fois la même chose mais bon...

En fait il faudrait au moins sauter au j suivant dés qu'on a une correspondance, ça ferait déjà ça de moins...

Peut-être dans 15 jours ?

Sub colorie()
Application.ScreenUpdating = False
Dim i, j, k, l As Integer
maxi = [R25].End(xlDown).Row
maxj = [U21].End(xlToRight).Column

' on colorie en bleu les intersections de produits dont les lieux correspondent
For i = 26 To maxi
    For j = 22 To maxj
        For k = 2 To 14
            For l = 2 To 14
                If Cells(i, k) = Cells(j + 4, l) And Cells(i, k) <> "" Then
                Cells(i, j).Interior.ColorIndex = 8
                End If
            Next l
        Next k
    Next j
Next i

' on colorie en gris toutes les cellules non bleues, et on enlève la couleur des bleues
For Each cel In Range("V26", Cells(maxi, maxj))
    If cel.Interior.ColorIndex <> 8 Then
        cel.Interior.ColorIndex = 15
    Else
        cel.Interior.ColorIndex = xlNone
    End If
Next cel
Application.ScreenUpdating = True
End Sub

En fait ma première idée était simple, mais j'avais pas les yeux en face des trous...

il suffit après la ligne :

Cells(i, j).Interior.ColorIndex = 8

de rajouter:

j = j + 1
k = 1
l = 1

En faisant fumer la matière grise on peut forcément faire encore mieux...

Bonjour,

Dans ta macro Sylvain, il faut modifier les variables.

Dim i, j, k, l As Integer

La i, j et K sont "variant" et seules l est integer

Modifie comme suit :

Dim i As Integer, j As Integer
Dim k As Byte, l As Byte
Dim maxi As Integer, maxj As Integer
Dim cel As Range

J'ai rajouté ce qui manquait

Amicalement

Dan

Dim cel As Range

d'habitude je le fais...

pour le reste je savais pas, merci ! Je pensais que la virgule me permettait de déclarer plusieurs "integer" d'un coup.

Le fait de déclarer k et l as byte ? ça soulage la procédure ? (puisqu'ils ne vont que jusqu'à 14 de toutes façons...) Il faut toujours déclarer le plus petit possible ?

Le seul sujet que j'avais trouvé sur les variables était celui là (mercy Mytå)

https://www.excel-pratique.com/forum/viewtopic.php?t=4163&highlight=variables

Re,

Le fait de déclarer k et l as byte ? ça soulage la procédure ?

Cela libère de la mémoire pour le fonctionnement. D'où l'intérêt de bien les déclarer et de choisir la plus petite possible. La Variant étant la plus lourde.

Ne rien déclare revient à mettre tout en Variant.

Puisque l'on est sur ce sujet :

  • Application.screenupdating n'a pas besoin d'être remis à True car il s'y remet automatiquement à la fin de la macro. Tu peux donc supprimer cette instruction
  • Les crochets [] pour définir les RANGE, ralentissent l'exécution du code. Il vaut mieux mettre RANGE("A1") plutôt que [A1].

Voili voilou

Amicalement

Dan

Merci à vous, c'est impressionnant comme boulot (l'ordi encaisse, vu les calculs qu'il effectue !)

Par contre, un truc me trouble... C'est comment est-il possible que certaines cellules se grisent alors que les produits ne se trouvent que dans les colonnes et que donc je n'ai pas renseigné sur le lieu de fabrication qui n'est qu'en ligne ?

Normalement, si pour le produit A, je n'ai pas renseigné son lieu de fabrication, je ne vois pas comment la comparaison avec les lieux de fabrication des autres produits (B, C ou D...) peut se faire... les cellules devraient donc rester griser (car on ne peut pas comparer).

Merci Dan pour ces clarifications.

Poulpow, quand tu ajoutes un produit complet, ou une colonne, il faut bien évidemment relancer la macro colorie().

J'espère que ton problème venait de là, sinon essayes d'expliquer clairement, quitte à joindre ton fichier en marquant les anomalies.

re,

Pas de quoi Sylvain, sauf que pour ce coup ci c'est Dan et pas Nad

Il reste du bleu dans la colonne AI c'est normal ?

Dan

Oouuupss

Serais-je dislexique ?

Erreur rectifiée... merci donc Dan

Pas de bleu pour moi dans la colonne AI

Bin j'avais vraiment un problème car c'était un produit qui était intégré dans une colonne, au milieu de ma matrice.

Mais là, je l'ai retiré puis remis à la fin (en ajoutant une colonne) puis appliquer le code couleur et j'ai l'impression que ça marche très bien !

Mais bon, il faut que je me plonge dedans pour vérifier que tout est bon, là ça sent le WE ! 8)

En tout cas merci. Et lundi, tu auras de mes nouvelles !

Bye et bon WE !

Bon après vérification tout à l'air OK donc je clôture.

Merci à vous 2 !

Sylvain TBM a écrit :
Sub colorie()

For i = 26 To maxi
    For j = 22 To maxj
        For k = 2 To 14
            For l = 2 To 14
                If Cells(i, k) = Cells(j + 4, l) And Cells(i, k) <> "" Then
                Cells(i, j).Interior.ColorIndex = 8
                End If
            Next l
        Next k
    Next j
Next i

End Sub

Par contre, tu peux m'expliquer à quoi correspond le + 4 (que je voulais mettre en rouge mais ça ne marche pas) de If Cells(i, k) = Cells(j + 4, I) ?

Parce que j'essai de l'appliquer sur 2 autres matrices, ça fonctionne mais il y a quelques incohérences et je pense que tout vient de là car en changeant ce chiffre, les cellules colorées se déplacent à droite ou à gauche.

En fait, j'ai essayé de calculer dans tous les sens mais je ne vois pas à quoi ça correspond...

Merci de ton aide !

Bonjour Poulpow et le forum,

Le "+4", c'est parce que "j" est le numéro de colonne du produit. "j" va de 22 (colonne V), jusqu'au dernier produit.

Mais pour tous ces produits en colonne, on veut connaître les "lieux" correspondant. Et ceux-ci se trouvent en lignes... de la ligne 26 jusqu'à la ligne du dernier produit.

Comme tu nous a affirmé :

Poulpow a écrit :

V21 : DH21 et R26 : R116 on aura les mêmes noms de produit, dans le même ordre.

(tu comprends maintenant le pourquoi de ma question ?)

Donc si tu prends l'exemple du produit 1, tu as j=22 et tu veux aller chercher ses lieux en ligne 26. Donc on prend j+4=26

Et ainsi de suite puisque ce décalage de 4 est (heureusement !) constant...

C'est plus clair ?

Rechercher des sujets similaires à "macro qui detecte interactions matrice"