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
exemple cell fuz

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:

exemple cell fuz 2

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
exemple cell fuz

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 . à ceci près que la solition sans boucle de Fcyspm m'oblige à connaitre à l'avance la cellule fuisonnée (et je ne sais jamais quelle sera la cellule fusionnée; c'est dans le cadre d'une Worksheet_SelectionChange que je vais utiliser tout ça).

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.

Rechercher des sujets similaires à "mergearea range"