Excel et coloriage de cellules en VBA
pietreo
Messages postés
3
Statut
Membre
-
eriiic Messages postés 25847 Date d'inscription Statut Contributeur Dernière intervention -
eriiic Messages postés 25847 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
Je souhaite colorier l'arrière plan d'une seule cellule en vérifiant une condition
dans 2 autres cellules ex: si B2<A2 colorier l'arrière plan de la cellule C2 en rouge
sinon en vert
jusque à maintenant j'utilisais le code suivant:
Je souhaite maintenant plutôt coder la chose de la façon suivante:
car la personne qui va utiliser le fichier ne doit pas modifier le code VBA
et que la fonctionnalité soit préservée si elle fait un copier-coller:
à l'intérieur de la cellule c2
=SI(B2<A2;COLORCELL(C2:C2;3);COLORCELL(C2:C2;4))
par contre quand je définis ma fonction dans VBA rien ne se passe sur
ma cellule c2 il y a une alerte avec réf inconnue??
ma fonction:
Voilà avez vous une idée? Merci d'avance pour les suggestions.
Je souhaite colorier l'arrière plan d'une seule cellule en vérifiant une condition
dans 2 autres cellules ex: si B2<A2 colorier l'arrière plan de la cellule C2 en rouge
sinon en vert
jusque à maintenant j'utilisais le code suivant:
Private sub. Worksheet_Change(ByVal Target As Range) Application.EnableEvents = False If [Feuil1!b2] < [Feuil1!a2] Then [Feuil1!c2].Interior.Color = RGB(255, 0, 0) Else: [Feuil1!c2].Interior.Color = RGB(51, 150, 0) End If Application.EnableEvents = True End Sub
Je souhaite maintenant plutôt coder la chose de la façon suivante:
car la personne qui va utiliser le fichier ne doit pas modifier le code VBA
et que la fonctionnalité soit préservée si elle fait un copier-coller:
à l'intérieur de la cellule c2
=SI(B2<A2;COLORCELL(C2:C2;3);COLORCELL(C2:C2;4))
par contre quand je définis ma fonction dans VBA rien ne se passe sur
ma cellule c2 il y a une alerte avec réf inconnue??
ma fonction:
Sub ColorCell() Dim Plage As Range Dim couleur As Integer Plage.Interior.ColorIndex = couleur End Sub
Voilà avez vous une idée? Merci d'avance pour les suggestions.
A voir également:
- Excel et coloriage de cellules en VBA
- Word et excel gratuit - Guide
- Liste déroulante excel - Guide
- Somme de plusieurs cellules excel - Guide
- Verrouiller cellules excel - Guide
- Si et ou excel - Guide
6 réponses
Bonjour,
si tu écris =SI(B2<A2;COLORCELL(C2:C2;3);COLORCELL(C2:C2;4))
c'est que tu veux faire une fonction personnalisée.
Une fonction personnalisée se déclare avec function xxx et non sub xxx.
Le problème c'est qu'une fonction personnalisée ne peut en aucun cas modifier l'environnement (donc une couleur de fond), elle retourne une valeur c'est tout.
Mais si tu as mis une couleur de fond par macro et que tu fais un copier-coller ensuite la couleur est emmenée aussi....
eric
si tu écris =SI(B2<A2;COLORCELL(C2:C2;3);COLORCELL(C2:C2;4))
c'est que tu veux faire une fonction personnalisée.
Une fonction personnalisée se déclare avec function xxx et non sub xxx.
Le problème c'est qu'une fonction personnalisée ne peut en aucun cas modifier l'environnement (donc une couleur de fond), elle retourne une valeur c'est tout.
Mais si tu as mis une couleur de fond par macro et que tu fais un copier-coller ensuite la couleur est emmenée aussi....
eric
Bonjour,
dans la formule de cellule, tu utilises une formulle (COLORCELL) qui a 2 paramètres. Or ta fonction de départ (que tu as malheureusement défini en tant que Sub alors qu'il faudrait définir en Function) n'a pas de paramètres... Je pense que c'est ce qui peut expliquer le fait que ta couleur ne s'ajoute pas sur ta cellule.
Cordialement.
dans la formule de cellule, tu utilises une formulle (COLORCELL) qui a 2 paramètres. Or ta fonction de départ (que tu as malheureusement défini en tant que Sub alors qu'il faudrait définir en Function) n'a pas de paramètres... Je pense que c'est ce qui peut expliquer le fait que ta couleur ne s'ajoute pas sur ta cellule.
Cordialement.
Merci,
Oui je sais j'ai copier collé un peu vite mais le code que je voulais mettre était effectivement défini sous la forme d'un fonction:
Ce code ne marche pas mais j'ai une explication comme me l'a signalé eriiic avec la notion d'environement
j'essaie de trouver un astuce.
Merci en core
Oui je sais j'ai copier collé un peu vite mais le code que je voulais mettre était effectivement défini sous la forme d'un fonction:
Public Function ColorCell(Plage As Range, couleur As Integer) Application.Volatile Plage.Interior.ColorIndex = couleur End Function
Ce code ne marche pas mais j'ai une explication comme me l'a signalé eriiic avec la notion d'environement
j'essaie de trouver un astuce.
Merci en core
Re,
Cherche un peu si tu veux mais n'y perds pas trop de temps. L'aide d'excel est très claire là-dessus...
Je pense qu'il faut que tu cherches une autre approche.
Limites des fonctions complémentaires
- Attribution
VBA pour Excel impose des limites très strictes aux fonctions appelées à l'intérieur de formules de feuilles de calcul. Leur seule attribution est de renvoyer une valeur à la cellule hôte. Ces fonctions ne peuvent effectuer aucune autre action susceptible de modifier le contenu du classeur.
En particulier, une fonction complémentaire ne peut pas modifier la valeur d'autres cellules que celles où elles ont été saisies. De même, il est impossible de renommer une feuille, déplacer une plage, changer le format d'une cellule, etc. à l'intérieur d'une fonction complémentaire. Les seules actions autorisées sont celles qui n'ont aucun effet sur le contenu du classeur, comme par exemple afficher un message par MsgBox.
eric
Cherche un peu si tu veux mais n'y perds pas trop de temps. L'aide d'excel est très claire là-dessus...
Je pense qu'il faut que tu cherches une autre approche.
Limites des fonctions complémentaires
- Attribution
VBA pour Excel impose des limites très strictes aux fonctions appelées à l'intérieur de formules de feuilles de calcul. Leur seule attribution est de renvoyer une valeur à la cellule hôte. Ces fonctions ne peuvent effectuer aucune autre action susceptible de modifier le contenu du classeur.
En particulier, une fonction complémentaire ne peut pas modifier la valeur d'autres cellules que celles où elles ont été saisies. De même, il est impossible de renommer une feuille, déplacer une plage, changer le format d'une cellule, etc. à l'intérieur d'une fonction complémentaire. Les seules actions autorisées sont celles qui n'ont aucun effet sur le contenu du classeur, comme par exemple afficher un message par MsgBox.
eric
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Bonjour,
je rebondis sur ce post car je cherchais également depuis quelques temps à colorer certaines cellules dans le cadre d'une fonction personnalisée.
Si cela n'est pas possible car l'environnement (donc une couleur de fond) ne peut pas être modifiée à partir d'une fonction personnalisée, y-a-t-il une alternative / solution de remplacement ?
Merci de vos réponses.
je rebondis sur ce post car je cherchais également depuis quelques temps à colorer certaines cellules dans le cadre d'une fonction personnalisée.
Si cela n'est pas possible car l'environnement (donc une couleur de fond) ne peut pas être modifiée à partir d'une fonction personnalisée, y-a-t-il une alternative / solution de remplacement ?
Merci de vos réponses.
Bonjour,
Il faut que tu utilises un évènement (change, selectionchange, activate,...) et que dans le code appelé tu recalcules et applique les couleurs sur les cellules concernées.
Bien sûr si tu as plusieurs centaines de cellules concernées ça va ralentir l'utilisation, essaie de restreindre aux seules cellules susceptibles d'être concernées.
eric
PS : tu as pensé à la mise en forme conditionnelle ?
Il faut que tu utilises un évènement (change, selectionchange, activate,...) et que dans le code appelé tu recalcules et applique les couleurs sur les cellules concernées.
Bien sûr si tu as plusieurs centaines de cellules concernées ça va ralentir l'utilisation, essaie de restreindre aux seules cellules susceptibles d'être concernées.
eric
PS : tu as pensé à la mise en forme conditionnelle ?
effectivement j'ai lu que les fonctions ne pouvaient modifier l'environnement je vais essayer
de trouver un "workaround" et posterai si je trouves une solution.