Code VBA lire et reimplanter couleur celulle [Résolu]

- - Dernière réponse :  micheldu52 - 12 nov. 2019 à 00:40
Bonjour,

J'ai écris le code suivant :

Dim numero As Integer
Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Excel.Range)
'MAJ 10112019
Static xLastRng As Range
On Error Resume Next
numero = 1
While numero <= 2
numero = numero + 1 'Le num?ro est augment? de 1 ? chaque boucle
Application.Wait (Now + TimeValue("00:00:01")) 'le temps du clignotement
Target.Interior.ColorIndex = 32
Target.Border.ColorIndex = 6
xLastRng.Interior.ColorIndex = xlColorIndexNone
xLastRng.BorderAround.ColorIndex = xlColorIndexNone
Application.Wait (Now + TimeValue("00:00:01")) 'le temps du clignotement
Target.Interior.ColorIndex = 6
Target.Border.ColorIndex = 32
xLastRng.Interior.ColorIndex = xlColorIndexNone
xLastRng.BorderAround.ColorIndex = xlColorIndexNone
Wend
Set xLastRng = Target
End Sub

Cela me permet de faire clignoter la(les) cellule(s) sélectionnée(s).

Problème sur lequel je bute, si la cellule était préalablement (par exemple) sur fond rouge (avant sélection)
elle perd cette couleur rouge à l'arrivée.

Je n'arrive pas à lire, mémoriser puis ré-implanter en final la couleur d'origine (l'utilisateur doit pouvoir saisir du texte mais cela ne doit pas altérer la couleur initial de la cellule)

Question subsidiaire 1, je voulais aussi jouer sur la bordure mais le "target.border" ne semble pas très probant dans mon code….

Question subsidiaire 2 : puis-je grossir (provisoirement) dans la cellule où l'utilisateur saisi la police de caractère (qui devra revenir ensuite à la taille d'origine) (effet de zoom sur la saisie)

Ces deux questions subsidiaires sont…. subsidiaires!

Merci d'avance pour votre aide !

Bien cordialement,

Michel
Afficher la suite 

3 réponses

Messages postés
8952
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 novembre 2019
458
0
Merci
bonjour, moi je bute sur un autre problème: ton code est peu lisible parce que tu n'as pas utilisé les balises de code.
nonobstant, pour le non subsidiaire, je suggère de faire ainsi:
dim couleurinterieure as int, couleurbord as int
couleurinterieure = Target.Interior.ColorIndex
couleurbord =xLastRng.Interior.ColorIndex
Target.Interior.ColorIndex = 32
Target.Border.ColorIndex = 6
xLastRng.Interior.ColorIndex = xlColorIndexNone
xLastRng.BorderAround.ColorIndex = xlColorIndexNone
Application.Wait (Now + TimeValue("00:00:01")) 'le temps du clignotement
Target.Interior.ColorIndex = couleurinterieure 
Target.Border.ColorIndex = couleurbord 

plutôt que:
Target.Interior.ColorIndex = 32
Target.Border.ColorIndex = 6
xLastRng.Interior.ColorIndex = xlColorIndexNone
xLastRng.BorderAround.ColorIndex = xlColorIndexNone
Application.Wait (Now + TimeValue("00:00:01")) 'le temps du clignotement
Target.Interior.ColorIndex = 6
Target.Border.ColorIndex = 32
(re)Bonjour,
Merci pour ta réponse ultra rapide!
Désolé je débute en VBA, j'avais juste "copié-collé" mon code….
J'ai reporté "le tien" mais (sauf erreur de manipulation de mon coté) cela ne conserve pas la couleur initiale de la cellule avant sélection.
Les cellules sont ensuite "sans couleur" et plus rouge dans mon exemple (ce qui était la couleur initiale, mais cela peut varier)
Merci pour tes lumières dont j'ai bien besoin !
yg_be
Messages postés
8952
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 novembre 2019
458 > micheldu52 -
peux-tu, peut-être, partager ton fichier (sans données confidentielles)?
Voici un exemple hyper simplifié, mais suffisant je pense

https://wetransfer.com/downloads/72f8a8eb43d454aae23b1d539bba788d20191110203318/d002fc65356674d6e5e7e563bed2216d20191110203318/f3c742

dis moi ce que tu en penses ?

Le principe est qu'il faut sélectionner une zone se saisie et que sa couleur devrait être rendue à la fin….

Mon niveau de VBA est encore assez loin de cela….

Dis moi donc si c'est possible !

Mark Twain "Ils ne savaient pas que c'était impossible, alors ils 'lont fait"
yg_be
Messages postés
8952
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 novembre 2019
458 > micheldu52 -
tu n'as pas expliqué exactement ce que tu voudrais que ton code fasse, et en quoi il en dévie.
à chaque fois, tu fais des changements dans la cellule courant, ainsi que dans la cellule précédente. cela ne rend pas les choses plus claires.
décris peut-être précisément ce qui se passe, et à quel moment cela dévie de ce que tu attends.
Dans mon exemple si on sélectionne -par exemple- H21, elle doit clignoter pour signaler que c'est la cellule active. L'utilisateur entre sa réponse et sélectionne une autre cellule -par exemple B21:E21 qui clignotera brièvement;
La cellule H21 doit alors contenir la réponse saisie et être redevenue bleue gris.
Et ainsi de suite, dans l'exemple les cellules B21:E21 devront être rouge lorsqu'on en sélectionnera une autre
Est-ce plus clair ?
Commenter la réponse de yg_be
Messages postés
23077
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
17 novembre 2019
5757
0
Merci
Bonjour,

on voit que noël approche à grand pas ! :-)
On met en place les décos
eric

En essayant continuellement, on finit par réussir. 
Donc plus ça rate, plus on a de chances que ça marche.(les Shadoks)
En plus du merci (si si, ça se fait !!!), penser à mettre en résolu. Merci
J'ai essayé d'implanter sur un nouveau fichier, mais il ne se passe rien, j'ai mis une mise en forme conditionnelle avant bien sur.

Cela étant, pour le "vrai" fichier, je ne peux pas utiliser de MFC dans le contexte précis.
eriiic
Messages postés
23077
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
17 novembre 2019
5757 -
C'est à mettre dans le module de la feuille.
Pas besoin de mettre une MFC, la macro s'occupe de tout.
https://mon-partage.fr/f/5tf5TlH2/

Quel est ce mal mystérieux qui empêche toute MFC ?
Ca marche en Feuil1 merci.
Peut-on lui donner comme portée tout le classeur, même pour les feuilles qui seront intégrées par la suite?
Grand merci à toi !
eriiic
Messages postés
23077
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
17 novembre 2019
5757 -
à mettre dans Thisworkbook (et supprimer l'autre) :
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
    Dim fc As Object
    For Each fc In Sh.Cells.FormatConditions
        On Error GoTo suite
        If fc.Formula1 = "=VRAI" Then fc.Delete
suite:
        On Error GoTo 0
    Next fc
    Target.FormatConditions.Add Type:=xlExpression, Formula1:="=VRAI"
    Target.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
    Target.FormatConditions(1).Interior.Color = vbYellow
    Target.FormatConditions(1).StopIfTrue = True
End Sub

eric
Génial !
un très grand MERCI !!!!!
je vais essayer de comprendre chaque ligne, je débute en VBA....
(si, par bonté, tu ajoutes des commentaires ca sera hyper sympa!)

Le cas échéant les questions subsidiaires (surtout la 2) ca te parle ?

Question subsidiaire 1, je voulais aussi jouer sur la bordure mais le "target.border" ne semble pas très probant dans mon code….

Question subsidiaire 2 : puis-je grossir (provisoirement) dans la cellule où l'utilisateur saisi la police de caractère (qui devra revenir ensuite à la taille d'origine) (effet de zoom sur la saisie)

j'ai trouvé ca dans un forum :

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Range("C6:H50").Font.Size = 11
If Not Intersect(Target, Range("c6:h50")) Is Nothing Then Target.Font.Size = 20
End Sub

pourrais-tu l'adapter à "ta solution" ?

Cela répondrai alors complétement à ma problématique ! (je précise que tu m'as déjà fait faire un gros pas en avant!)

Encore MERCI pour la solution et pour le temps passé à m'aider!

Michel
Commenter la réponse de eriiic
Messages postés
23077
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
17 novembre 2019
5757
0
Merci
Bonjour,

il n'y a pas grand chose à expliquer.
La boucle balaie toutes les MFC pour supprimer celles posées par la macro et effacer le précédent marquage.
La suite met la MFC sur la nouvelle sélection.
Pour les propriétés et méthodes que tu ne connais pas il suffit de faire F1 dessus pour accéder à l'aide pas si mal faite.

Question subsidiaire 1, je voulais aussi jouer sur la bordure mais le "target.border" ne semble pas très probant dans mon code….
les bordures pour une MFC, c'est assez limité.
On ne peut pas choisir l'épaisseur, juste la couleur et le style de trait.
Pas sûr que ça apporte plus de visibilité...

Question subsidiaire 2 : puis-je grossir (provisoirement) dans la cellule où l'utilisateur saisi la police de caractère (qui devra revenir ensuite à la taille d'origine) (effet de zoom sur la saisie)
Si la taille d'origine de la police est toujours la même sur toutes les cellules ça peut se faire facilement.
Dans ce cas quelle est la taille à rétablir ? 11 ?
Si elles varient ça oblige à mémoriser toutes les tailles de chaque cellule. Faisable si indispensable mais on risque de partir sur une usine à gaz pas forcément fiable ou cas de plantage ou de fermeture brutale.
eric

En essayant continuellement, on finit par réussir. 
Donc plus ça rate, plus on a de chances que ça marche.(les Shadoks)
En plus du merci (si si, ça se fait !!!), penser à mettre en résolu. Merci
eriiic
Messages postés
23077
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
17 novembre 2019
5757 -
Voilà :
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
    Dim fc As Object
    For Each fc In Sh.Cells.FormatConditions
        On Error GoTo suite
        If fc.Formula1 = "=VRAI" Then
            fc.AppliesTo.Font.Size = 11
            fc.Delete
        End If
suite:
        On Error GoTo 0
    Next fc
    Target.FormatConditions.Add Type:=xlExpression, Formula1:="=VRAI"
    Target.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
    Target.FormatConditions(1).Interior.Color = vbYellow
    Target.FormatConditions(1).StopIfTrue = True
    Target.Font.Size = 20
End Sub

eric
Un seul mot : Parfait
Plutôt deux : MERCI
Je vais continuer le traitement de mes données en me servant de cela!
Ta grande disponibilité a été plus qu'appréciable!
Bien cordialement,
Michel
PS: je progresse peu à peu en VBA, mais encore pas mal de chemin à faire….
si je n'abuse pas….
la fonction "effacer la dernière saisie" (flèche arrondie sens contraire des aiguilles d'une montre) est désactivée. Normal? C'est gênant en cas d'erreur !
eriiic
Messages postés
23077
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
17 novembre 2019
5757 -
Oui, c'est normal.
L'utilisation d'une macro efface la pile des undo, plus d'annulation possible.
De la même façon que quand tu enregistres le fichier.
Commenter la réponse de eriiic