Mergearea sur un Range(cells,cells
Bonjours à tous, tout est dans le titre.
Ce serait un peu long à expliquer le pourquoi j'ai besoin de faire ça sur une range comme ça (j'ai une soirée ce soir je peux pas trop détailler pour le moment car je dois aller me préparer), mais en gros:
La plage peut contenir une cellule fusionnée, et si l'entièreté des cellules appartenant à cette cellule ne sont pas dans ma plage, le interior color ne coloriera que la cellule de ma cellule fusionnée qui sera dans ma range et pas toute les cellules de ma cellule fuisonnée.
Je veux donc faire ceci:
Range(cells(a,b),cells(c,d)).MergeArea.Interior.Color = 12874308
Exemple: je veux que la cellule fusionnée soit aussi coloriée:
Range(Cells(3, 2), Cells(5, 5)).Interior.Color = 192
Mais ça ne marche pas si j'essaye de solutionner le problème avec un Mergearea... Auriez vous la bonne façon de l'écrire svp?
J'ai pas encore eu le temps d'essayer avec un Application.Intersect (et ça m'oblige à faire un if de toute manière :/ et je veux faire ça en une seule ligne )
Merci à vous pour votre aide
Bonjour à tous!
ced_le_dingue, comme ceci peut-être
Range(Cells(3, 2), Cells(5, 5)).Interior.ColorIndex = 3
Le code couleur 192 je ne crois pas qu'il existe si tu veux une couleur spécifique faut passer avec RGB
Bonne journée !
Bonjour
Teste
Range("B2:B5, C3:C5").Interior.Color = 192
Bonjour,
C'est quoi cette exigence inutile ?
Donc si ça n'est pas faisable en une ligne tu n'en veux plus ?
Est-ce toujours le 1ère cellule de la plage qui peut avoir une fusion ou n'importe laquelle ?
Plusieurs fusions possibles ?
eric
Bonsoir à tous,
Non Eric, ce n'est pas une "exigeance inutile".
Je n'ai pas dit que je n'en veux pas si ce n'est pas faisable en 1 ligne, je demande juste si il y a une façon de le faire avec une "méthode merge".
Non ce n'est pas forcément la 1ère cellule de la plage, cela peut etre n'importe quelle cellule de la plage, d'ou le range(cells,cells) (sinon j'avais juste à jouer sur la 1ère ligne et la 1ère colonne).
Plusieurs fusions possible oui.
Pour M12 et Nordik:
Oui ce que vous me proposez c'est ce que j'ai écrit XD (je n'utilise pas le color index, car selon la région,version d'Excel, on peut obtenir des resultats différents sur les couleurs, mais ça en revient exactement au même, la technique de colorisation n'est pas le soucis)
Je reformule donc:
Je veux utiliser ceci (qui ne marche pas):
Range(Cells(3, 2), Cells(5, 5)).MergeArea.Interior.Color = 192
Pour obtenir ceci:
Ci dessous c'est juste pour montrer que sans préciser de merge area, seule la cellule (1,1) de ma cellule fusionnée est coloriée. (on ne le voit pas tant qu'on a pas Unmerged la cellule).
Range(Cells(3, 2), Cells(5, 5)).Interior.Color = 192
Pas très utile. On ne s'amuse pas à rajouter des lignes pour le plaisir.
On cherche toujours au plus court, sans nuire à la lisibilité et à la compréhension.
Sub test()
Dim pl As Range, c As Range
Set pl = Range("B3:E5")
For Each c In pl
If c.MergeCells Then Set pl = Union(pl, c.MergeArea)
Next c
pl.Interior.Color = 192
End Sub
Tu peux l'écrire en 1 ou 2 lignes avec des : mais ça apporterait quoi ?
Aide de MergeArea :
Remarques
La propriété MergeArea ne fonctionne que sur une plage à cellule unique.
Pas le choix, il faut boucler
eric
Bonjour
Un essai
Sub colorier()
Range("B2:B3").Merge
Range("B2,B3:E5").Interior.Color = 192
End Sub
Salut à tous
Merci Eric, merci Fcyspm.
Avant tout pour répondre à ta très bonne question Eric, en fait j'ai une enorme macro, qui fonctionne très bien mais je veux maintenant l'amliorer en réécrivant certaines procédures de manière beaucoup plus concise (quand c'est possible) afin de réduire drastiquement le temps d'exécution le ma macro... et ces petites amélioration mises bout à bout me feront gagner de précieuses secondes au final. Mais tu as raison de poser la question c'est pertinent
Vous avez eu la même idée
En me reveillant ce matin, j'ai eu une lumineuse idée encore plus simple qu'en faisant un set et une union !!! J'ai testé, et ça marche à la perfection! Que dites vous de ça? ;)
Bon après c'est pas en une ligne mais bon 3 lignes ça va encore haha:
Sub coloriage()
li_1 = 3
li_2 = 5
co_1 = 2
co_2 = 5
For Each cell In Range(Cells(li_1, co_1), Cells(li_2, co_2))
cell.MergeArea.Interior.Color = 192
Next
End Sub
En résumé, avec cette technique, pas besoin de tester la fusion ou non des cellules
Merci à vous pour vos retour et votre aide
Bonjour,
ce n'est pas le nombre de lignes de code qui fait la rapidité, mais la technique utilisée.
La différence entre ton code et le mien c'est que tu exécutes autant de .Interior.Color que de cellules, moi un seul sur la plage fabriquée.
Pour mise en une couleur la différence est minime, mais pour une écriture en cellule ta technique serait 100 fois plus lente pour gagner 1 ligne...
Pour un pouième de gain, garde ton code qui évite les limitations de Union()
Si ce n'est pas déjà fait, pour optimiser ton code fait plutôt la chasse aux .Select (inutiles dans 99% des cas et très chronophages) et aux écritures multiples quand tu peux écrire un tableau en une fois.
Pour gagner des ligne commence à perdre l'habitude de sauter 1 ligne sur 2. Là où on pourrait en lire 10, on n'en voit plus que 5. Pas efficace...
eric
Merci pour tes conseils Eric.
Dans ce cas de figure, union est très bien je trouve, c'est une excellente idée, je ne me sert jamais de union donc merci, ça m'ouvre + l'esprit à d'autres méthodes.
Oui haha, select je les utilises uniquement pour débuguer et pour activer des selectionChange ;)
Par contre oui j'ai encore un gros défaut c'est que je n'utilise pas assez les tableaux... je ne les utilises que pour sauvegarder des données entre différents modules et pas lorsque je compare ou parcours des données... c'est un tort... Tu as raison de le rappeler, je vais changer ma façon de faire, le parcours des cellules est bien trop long...
Et tu soulèves une question intéressante, les lignes de codes vides (retours chariot) augmentent elles vraiment le temps d'exécution des macros (sur de grosses macros, on se comprend bien) ?
Non, ou de façon insensible.
C'est surtout pour la lecture, si c'est compact la lecture est plus naturelle et on voit plus de choses d'un regard.
Contente-toi d'une ligne vide pour séparer les différents traitements d'une proc.
eric
PS : j'ai dit écriture, mais comme tu as compris c'est lecture et écriture des cellules qui est chronophage.