Code VBA lire et reimplanter couleur celulle

Résolu/Fermé
micheldu52 - 10 nov. 2019 à 20:27
 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
A voir également:

3 réponses

yg_be Messages postés 22717 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 22 avril 2024 1 474
Modifié le 10 nov. 2019 à 20:38
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
0
(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 !
0
yg_be Messages postés 22717 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 22 avril 2024 1 474 > micheldu52
10 nov. 2019 à 20:57
peux-tu, peut-être, partager ton fichier (sans données confidentielles)?
0
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"
0
yg_be Messages postés 22717 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 22 avril 2024 1 474 > micheldu52
10 nov. 2019 à 22:16
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.
0
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 ?
0
eriiic Messages postés 24569 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 28 décembre 2023 7 212
Modifié le 10 nov. 2019 à 22:40
Bonjour,

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

0
on peut voir ca comme ça (-: !!!!
mais la déclinaison "sur le terrain" est très réelle pourtant !
Si tu as une réponse, je suis preneur !
Cordialement,
0
eriiic Messages postés 24569 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 28 décembre 2023 7 212
Modifié le 10 nov. 2019 à 23:21
Bah, excel n'est pas un sapin de noël ;-)
La sélection avec une MFC =VRAI pour préserver sa couleur d'origine c'est le plus simple.
A chaque sélection tu supprimes cette MFC pour la recréer sur la nouvelle cellule, ça tient en 5 lignes :
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim fc As FormatCondition
    For Each fc In Cells.FormatConditions
        If fc.Formula1 = "=VRAI" Then fc.Delete
    Next fc
    Target.FormatConditions.Add Type:=xlExpression, Formula1:="=VRAI"
    Target.FormatConditions(1).Interior.Color = vbYellow
End Sub

Et ne me dit pas que tu ne vois pas le jaune pétard !
On peut mettre rouge mais l'écriture noire sera moins lisible.
Tu peux même marquer une plage.
eric

Edit : et si tu as d'autres MFC non 'standard' sur la feuille :
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim fc As Object
    For Each fc In 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
0
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.
0
eriiic Messages postés 24569 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 28 décembre 2023 7 212
10 nov. 2019 à 23:48
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 ?
0
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 !
0
eriiic Messages postés 24569 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 28 décembre 2023 7 212
Modifié le 11 nov. 2019 à 12:21
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

0
effectivement police par defaut =11
MERCI si tu arrives à adapter le code que j'ai trouvé!
Cordialement,
Michel
0
eriiic Messages postés 24569 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 28 décembre 2023 7 212
11 nov. 2019 à 14:42
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
0
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….
0
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 !
0
eriiic Messages postés 24569 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 28 décembre 2023 7 212
11 nov. 2019 à 23:52
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.
0