Mise en forme sur un tableau de variables Vba

Calvus

XLDnaute Barbatruc
Bonsoir le Forum,

Un problème qui devient insoluble, et pourtant je ne dois pas être loin de la solution.

  • J'ai un fichier avec un tableau (I7:AF57) se remplissant en fonction de la saisie d'un chiffre de 1 à 10 correspondant à l'autre tableau sur la feuille (B29: D39).

Si on inscrit 2 en K34 par exemple, Jean va s'inscrire dans ladite cellule.

J'avais un code avec For each cel....etc, mais la durée d'éxécution était de 2 minutes.
J'ai avantageusement remplacé ce code par 2 tableaux (tablo et tablo2), et fait mes boucles dessus.
Tout ça fonctionne correctement.

Ce qui "pêche", c'est que mon code précédant coloriait les cellules en fonction de la valeur obtenue, ce que je ne parviens plus à faire avec mes tableaux VBA.
VB:
Option Explicit
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim i As Single, j As Single, k As Single, cel As Range
Dim tablo(10, 2), tablo2(51, 32)


If Not Application.Intersect(Target, Range("I7:AF57")) Is Nothing Then
'Alimente le 1er tableau des prénoms
For i = 1 To 10
tablo(i, 1) = Range("B" & i + 29)
tablo(i, 2) = Range("C" & i + 29)
Next

'Enregistrement des valeurs du tableau existant
Range("I7:AF57").Interior.ColorIndex = 2
For j = 7 To 57
For k = 9 To 32
tablo2(j - 7, k - 9) = Cells(j, k)
Next k
Next j

'Incrémentation des nouvelles valeurs
For i = 0 To 50
For j = 0 To 24
For k = 1 To 10
If tablo2(i, j) = tablo(k, 1) Then
tablo2(i, j) = tablo(k, 2)
'If tablo2(i, j) = tablo(k, 2) Then
'Cells(tablo2(i, j), tablo2(i, j)).Offset(6, 8).Interior.ColorIndex = 43
'End If
End If
Next
Next
Next
Range("I7").Resize(UBound(tablo2, 1), UBound(tablo2, 2)) = tablo2

End If 'intersect
   
End Sub


Comment faire donc pour colorer les cellules ? (Exemple de couleur sur la droite de la feuille)
Je viens de m'apercevoir en faisant l'exemple, qu'en plus mon tableau déborde.... !
  • De plus, j'ai une instruction qui fonctionnait, même si c'était de manière imparfaite :

VB:
'If tablo2(i, j) = tablo(k, 2) Then
'Cells(tablo2(i, j), tablo2(i, j)).Offset(6, 8).Interior.ColorIndex = 43
'End If

En effet, les cellules se décalent, ce que j'ai compris, et pense même savoir pourquoi, mais ce que j'aimerais savoir, c'est pourquoi elle provoque un bug si elle est insérée dans le reste du code.
Vous me répondrez probablement qu'on ne peut pas affecter une couleur à une variable..

En espérant que ce soit assez clair.
Merci de votre aide.
 

Pièces jointes

  • Tableau 1 dans Tableau 2.xlsm
    23.1 KB · Affichages: 45

Dranreb

XLDnaute Barbatruc
Bonsoir.
Comme vous alimentez vos tableaux, vous ne gagnez rien à les utiliser.
Il faut définir des tableaux dynamiques et y charger et en décharger en une seule instruction la totalité des plages.
Pour la petite table de correspondance vous auriez intérêt à la charger d'abord intégralement dans un tableau, puis de là dans un Dictionary.
Pour la couleur vous pourriez aussi le faire d'un coup avec [I7:AF57].SpecialCells(xlCellTypeConstants, 1).ColorIndex = 43
 

Calvus

XLDnaute Barbatruc
Bonsoir Dranreb,

Merci de votre réponse.
Vous pouvez me dire quelle piste je dois suivre ?
Je ne suis pas sûr de savoir définir des tableaux dynamiques, mais je vais chercher.
Et bien que j'ai déjà lu des codes avec Dictionary, je ne sais pas m'en servir et ne sait pas très bien à quoi ça sert.
Je n'ai plus qu'à étudier tout ça.
Je reviendrai si je ne m'en sors pas.
 

Dranreb

XLDnaute Barbatruc
Pour déclarer une variable comme tableau dynamique on la fait suivre de parenthèses ouvrante et fermante sans préciser de dimension dedans.
Plus facile d'utiliser des Dictonary en cochant Microsoft Scripting Runtime dans les références disponibles, menu Outils, Références…
Ça autorise à déclarer des variables As Dictionary et dans le code des suites son proposées dans une liste en tapant un point derrière une telle variable.
Ça sert à y retrouver un truc d'après un code.
 

Dranreb

XLDnaute Barbatruc
Bon j'en suis là :
VB:
Option Explicit

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim TNoms(), PlgD As Range, TDon(), L As Long, C As Long, N As Long ' , Dic As Dictionary

Set PlgD = [I7:AF57]
If Not Application.Intersect(Target, PlgD) Is Nothing Then
'Alimente le 1er tableau des prénoms
   TNoms = [Tableau41849].Value

'Enregistrement des valeurs du tableau existant
   TDon = PlgD.Value

'Incrémentation des nouvelles valeurs
   PlgD.Interior.ColorIndex = 2
   For L = 1 To UBound(TDon, 1): For C = 1 To UBound(TDon, 2)
      If VarType(TDon(L, C)) = vbDouble Then
         N = TDon(L, C): If N > 0 And N <= UBound(TNoms, 1) Then TDon(L, C) = TNoms(N, 2)
         End If: Next C, L
   Application.EnableEvents = False
   PlgD.Value = TDon
   PlgD.SpecialCells(xlCellTypeConstants, 2).Interior.ColorIndex = 43
   Application.EnableEvents = True
   End If 'intersect
End Sub
 

Calvus

XLDnaute Barbatruc
Ok, super.
Merci Dranreb.
En revanche, comment obtenir des couleurs différentes ?
Chaque prénom doit correspondre à une couleur différente.
C'était l'exemple à droite de la feuille, mais les valeurs ont dû s'effacer à la 1 ère exécution de ma macro, si vous l'avez exécutée.
 

Dranreb

XLDnaute Barbatruc
Ça ne pourrait pas se faire avec des mises en forme conditionnelles ?

Sinon on va être obligé de repasser par un For Each Cel in PlgD
À la rigueur PlgD.Cells(L, C).Interior ColorIndex = …
En évitant de mettre une autre expression Range à droite, bien sûr. Par exemple 43 + N ?…
 
Dernière édition:

Calvus

XLDnaute Barbatruc
Si. Je pensais que c'était faisable par vba et me suis entêté à chercher.
Je vais le faire par MFC.
Merci beaucoup.
Vous savez concernant ma question 2 ?
L'instruction, si elle est isolée, fonctionne, même si j'ai remarqué que la coloration se faisait en fonction des lignes et des colonnes et pas en fonction des valeurs.
Ce n'est donc pas exact, mais ce que je désirais comprendre, c'est pourquoi la même instruction est acceptée si elle est seule dans le code et pourquoi elle est refusée dans le bloc.
Je ne sais pas si c'est très clair.
 

Discussions similaires

Réponses
11
Affichages
277

Statistiques des forums

Discussions
312 023
Messages
2 084 714
Membres
102 637
dernier inscrit
TOTO33000