Problème de tri de couleurs

Magic_Doctor

XLDnaute Barbatruc
Bonsoir,

Je veux trier des couleurs et je n'y parviens pas.
Le plus simple est d'aller dans le classeur où tout y est bien expliqué.

Merci pour me sortir de cette impasse.
 

Pièces jointes

  • PbCouleurs.xlsm
    67.4 KB · Affichages: 50
  • PbCouleurs.xlsm
    67.4 KB · Affichages: 51
  • PbCouleurs.xlsm
    67.4 KB · Affichages: 51

Magic_Doctor

XLDnaute Barbatruc
Re : Problème de tri de couleurs

Bonsoir Stakov,

Sur la feuille il y a en haut un tableau avec 4 couleurs.
Normalement il y a un compteur (que je n'ai pas mis) qui peut prendre, quand on clique dessus, 4 valeurs : 1, 2, 3 et 4.
Chaque fois que l'on clique sur le compteur la macro se déclenche.
Tant que la valeur du compteur est < 4, la macro renvoie les couleurs comme dans le tableau.
Quand la valeur du compteur est 4, les couleurs ne se succèdent alors plus comme dans le tableau :
1ère couleur = 3ème couleur
2ème couleur = 4ème couleur
3ème couleur = 1ère couleur
4ème couleur = 2ème couleur

Comme indiqué dans la petite colonne à droite de celle qui recueille les couleurs.
Le petit algorithme devrait normalement gérer ce problème :
VB:
x = IIf([N11] = 4, IIf(x < 3, x + 2, x - 2), x)

Et bien non !
 

Stakov

XLDnaute Nouveau
Re : Problème de tri de couleurs

Au risque de dire une ânerie, je vois dans ton algorithme la mension [N11] qui fait, me semble-t-il, référence à une plage nommée. Hors elle n'apparait pas dans le gestionnaire des Noms, il n'y a que TitresCouleursLignes.

Cela dit, j'ai remplacé [N11] par Range("C11").Value mais cela ne change pas le résultat de l'algo.
 

Magic_Doctor

XLDnaute Barbatruc
Re : Problème de tri de couleurs

En effet ça ne change rien.
Avec le compteur cela ne marche pas non plus.
La seule plage nommée "TitreCouleursLignes" est l'en-tête du petit tableau des couleurs.
Pour localiser les cellules du tableau avec les couleurs, on se repère à partir de cette cellule nommée.
 

Stakov

XLDnaute Nouveau
Re : Problème de tri de couleurs

Je pense que j'ai compris la source du problème mais je n'arrive pas dans l'immédiat à faire quelque chose qui fonctionne complètement.

J'ai modifié ton algorithme, ce qui me dérange dedans c'est que tu utilises la même variable x pour indiquer les coordonnées de ta zone source et pour indiquer les coordonnées de ta zone destination.

Le code suivant, que j'ai un peu remanié (je ne suis pas familier avec la notation IIF() donc j'ai rédigé avec les simples If then... qui me permettent de mieux visualiser :) ), renvoie ce que tu souhaites :

Attention à déclarer les nouvelles variables : Indic, iCell et nCell en Byte

Code:
Indic = Range("C11").Value

For icell = 1 To nblgn

    If Indic = 4 Then
        If icell < 3 Then
            ncell = icell + 2
        Else
            ncell = icell - 2
        End If
    Else
        ncell = icell
    End If

    Debug.Print icell & " " & ncell

'    Set couleurlignes(ncell) = [TitreCouleursLignes].Offset(ncell, 1).Offset(, -1) 'localisation de la cellule correspondant à chaque couleur
'    coul(ncell) = couleurlignes(icell).Interior.Color 'récupération de la couleur de chaque ligne

Next

Le Debug.Print montre que l'algo convertit correctement icell > ncell 1>3 ; 2>4 ; 3>1 ; 4>2 quand Indic vaut 4

Maintenant que tu as les correspondances, il doit y avoir moyen de renvoyer facilement les bonnes couleurs dans les bonnes cases !
 

Magic_Doctor

XLDnaute Barbatruc
Re : Problème de tri de couleurs

Bonsoir Modeste geedee,
J'ai regardé, dans le lien que vous m'avez indiqué, la fonction "ColorRank". Elle peut être intéressante si le besoin s'en fait sentir. Je la conserve donc au cas oú. Cette fonction indique quelle position une couleur dans une cellule quelconque de la feuille occupe dans un tableau où elle est référenciée.
Retrouver la chronologie de la position de chacune des couleurs n'est pas bien compliqué, et au moyen d'une courte boucle j'y suis arrivé. En revanche, je ne parviens pas à modifier la position des couleurs, même si l'algorithme le permettant fonctionne, du moins théoriquement.
Mais tout se passe dans la macro. Je m'explique : la petites colonnes que j'ai mise et qui récupère les couleurs du petit tableau des couleurs, n'est là qu'à titre indicatif pour vérifier si la macro marche ou pas. Il ne faut donc pas se fixer sur elle. Quand ça marchera elle n'existera plus. Ce qui compte ce sont les "coul(1), coul(2)..." dans la macro.

Stakov, j'avoue que le "Debug.Print", je n'ai absolument rien compris. J'ai essayé, ça ne marche toujours pas. Je suis allé dans l'aide d'Excel (toujours aussi nulle que ce soit en français, en espagnol ou en volapük...) et je n'ai rien compris avec leurs exemples bidons comme de coutume.
Enfin, il n'y a, je pense, aucun problème à ce que j'utilise la même variable, la preuve en est, c'est qu'en rajoutant une autre variable, ça ne marche toujours pas.

Je glisse un autre classeur avec quelques indices numériques rendant le problème, peut-être, un peu plus clair.

Mais merci à tous pour vos interventions.
 

Pièces jointes

  • PbCouleurs.xlsm
    68.1 KB · Affichages: 26
  • PbCouleurs.xlsm
    68.1 KB · Affichages: 31
  • PbCouleurs.xlsm
    68.1 KB · Affichages: 32

Stakov

XLDnaute Nouveau
Re : Problème de tri de couleurs

Le Debug.Print affiche le résultat du code dans la fenêtre d'exécution. Pour l'ouvrir tu peux soit faire CTRL+G ou aler dans Affichage/Fenêtre d'exécution.

Quand tu vas exécuter la macro, les indications renvoyées par Debug.Print (qui fonctionne comme un MsgBox en fait) s'affichent dans la fenêtre d'exécution.

J'ai une petite idée concernant ton problème, je te donne mes pistes dans la soirée.
 

Stakov

XLDnaute Nouveau
Re : Problème de tri de couleurs

Re,

Donc comme je disais j'avais une petite idée, voici le code de Sub TriCouleurs(), la seule que j'ai modifiée.

J'ai conservé la forme étendue de l'algorithme puisqu'avec elle je suis sûr que ça fonctionne. Après quelques tests, ta version condensée m'avait l'air moins fiable.
J'ai également conservé sous forme de commentaires les anciens éléments de ton code (ou presque tous), et ai ajouté des notes pour expliquer le fonctionnement.

Ici, couleurlignes() se construit directement dans l'ordre dans lequel il faut afficher les couleurs, pour ça il se base sur old_x qui va dans l'ordre 1 2 3 4 etc, et sur new_x qui va lui être dans l'ordre 3 4 1 2 si le choix est 4. Du coup, avec choix 4, quand old_x = 1, new_x = 3, et dans le tableau couleurlignes(1) est inscrite la couleur de la cellule qu'ont obtient en appliquant un offset(3,0).


Code:
Sub TriCouleurs()

Dim nblgn As Byte, new_x As Byte, old_x As Byte, indic As Byte
Dim couleurlignes() As Range, coul() As Long

nblgn = HTABLO([TitreCouleursLignes], 1)
ReDim couleurlignes(nblgn), coul(nblgn)


indic = [C11] 'valeur test


For old_x = 1 To nblgn

    'routine de choix
    If indic = 4 Then
        If old_x < 3 Then
            new_x = old_x + 2
        Else
            new_x = old_x - 2
        End If
    Else
        new_x = old_x
    End If
    
    'x = IIf([N11] = 4, IIf(x < 3, x + 2, x - 2), x)
    
    Debug.Print old_x & " " & new_x 'pour débuggage (s'affiche dans fenêtre d'exécution CTRL+G)
    
    'on inscrit ensuite dans couleurlignes en suivant l'ordre 1 2 3 4 ... les couleurs des cellules de rang 3 4 1 2 si indic vaut 4 ou de rang standard sinon, grâce à offset(new_x,0)
    Set couleurlignes(old_x) = [TitreCouleursLignes].Offset(new_x, 0)
    
    Cells(12 + old_x, 3).Interior.Color = couleurlignes(old_x).Interior.Color

Next

'Autre possibilité : inscrire les couleurs après la boucle For, réalisable dans une autre boucle pour automatisation
'[c13].Interior.Color = couleurlignes(1).Interior.color
'[c14].Interior.Color = couleurlignes(2).Interior.color
'[c15].Interior.Color = couleurlignes(3).Interior.color
'[c16].Interior.Color = couleurlignes(4).Interior.color

End Sub

J'ai testé, et cela fonctionne. Est ce que cela te convient ?

Cordialement,
Stakov
 

Magic_Doctor

XLDnaute Barbatruc
Re : Problème de tri de couleurs

Rebonsoir,

Après réflexion au sujet de ce que me disait Stakov concernant la variable x, j'ai revu (de très mauvaise humeur) la macro.
En effet il faut rajouter dans la boucle une variable (voir la macro corrigée).
Stakov m'a fait découvir un truc pratique : "Debug.Print". Pour ceux qui lisent ce post et qui ne connaîtraient pas, voilà à quoi ça sert. Dans le module faites Ctrl + G ; apparaît alors une petite fenêtre en bas de l'écran. Dans la macro, sous une boucle par exemple, où évolue une variable x, vous écrivez : Bebug.Print x
Déclenchez la macro et dans la petite fenêtre vous voyez l'évolution de x ; ce qui permet de voir quand ça déconne.
Bien sûr, quand tout est enfin nickel vous effacez le Debug.Print x.
Mais j'avoue que cette boucle était (pour moi) tordue...
Je crois que sans ce Debug.Print je n'y serais pas arrivé.

VB:
Sub TriCouleurs()

Dim nblgn As Byte, x As Byte, i As Byte
Dim couleurlignes() As Range, coul() As Long

nblgn = HTABLO([TitreCouleursLignes], 1)
ReDim couleurlignes(nblgn), coul(nblgn)

For x = 1 To nblgn
    i = x: i = IIf([C11] = 4, IIf(x < 3, i + 2, i - 2), x)
    'Debug.Print i 'ne pas oublier Ctrl + G
    Set couleurlignes(i) = [TitreCouleursLignes].Offset(i, 1).Offset(, -1) 'localisation de la cellule correspondant à chaque couleur
    coul(x) = couleurlignes(i).Interior.Color 'récupération de la couleur de chaque ligne
Next

[c13].Interior.Color = coul(1)
[c14].Interior.Color = coul(2)
[c15].Interior.Color = coul(3)
[c16].Interior.Color = coul(4)

End Sub

Gracias Stakov !
 

Pièces jointes

  • PbCouleurs2.xlsm
    67.3 KB · Affichages: 35
Dernière édition:

job75

XLDnaute Barbatruc
Re : Problème de tri de couleurs

Bonjour Magic_Doctor, le fil,

Sur la base du fichier du post #1 :

Code:
Sub TriCouleurs()

Dim nblgn As Byte, x As Byte, x1 As Byte
Dim couleurlignes As Range, coul() As Long

nblgn = HTABLO([TitreCouleursLignes], 1)
Set couleurlignes = [TitreCouleursLignes].Offset(1).Resize(nblgn)
ReDim coul(1 To nblgn)

For x = 1 To nblgn
  x1 = IIf([C11] = 4, IIf(x < 3, x + 2, x - 2), x)
  coul(x) = couleurlignes(x1).Interior.Color
Next

For x = 1 To nblgn
  [c13].Offset(x - 1).Interior.Color = coul(x)
Next

End Sub
Tu te mélangeais bien les pédales entre la plage, le tableau, la variable x.

A+
 

job75

XLDnaute Barbatruc
Re : Problème de tri de couleurs

Re,

La 2ème boucle est d'ailleurs inutile :

Code:
Sub TriCouleurs()

Dim nblgn As Byte, x As Byte, x1 As Byte
Dim couleurlignes As Range, coul() As Long

nblgn = HTABLO([TitreCouleursLignes], 1)
Set couleurlignes = [TitreCouleursLignes].Offset(1).Resize(nblgn)
ReDim coul(1 To nblgn)

For x = 1 To nblgn
  x1 = IIf([C11] = 4, IIf(x < 3, x + 2, x - 2), x)
  coul(x) = couleurlignes(x1).Interior.Color
  [c13].Offset(x - 1).Interior.Color = coul(x)
Next

End Sub
En plus, si le tableau coul() n'est utilisé que là, il est totalement inutile :

Code:
Sub TriCouleurs()

Dim nblgn As Byte, x As Byte, x1 As Byte
Dim couleurlignes As Range

nblgn = HTABLO([TitreCouleursLignes], 1)
Set couleurlignes = [TitreCouleursLignes].Offset(1).Resize(nblgn)

For x = 1 To nblgn
  x1 = IIf([C11] = 4, IIf(x < 3, x + 2, x - 2), x)
  [c13].Offset(x - 1).Interior.Color = couleurlignes(x1).Interior.Color
Next

End Sub
A+
 

Discussions similaires

  • Résolu(e)
Microsoft 365 Code de tri
Réponses
22
Affichages
404
Réponses
16
Affichages
549

Statistiques des forums

Discussions
312 489
Messages
2 088 868
Membres
103 980
dernier inscrit
grandmasterflash38