Comment fusionner des cases précises en VBA

Bonjour à tous,

avant d'expliquer mon soucis, je tient à préciser que je suis plutôt autodidacte en VBA/Excel et c'est aussi récent donc je n'ai pas trop de connaissance là dedans donc ne soyez pas outrez s'il y a des choses dans mon fichier qui ne se font pas du tout en programmation... :S

Alors, je vous ai joint un fichier à ce post. Il y a une feuille se prénommant "feuille à remplir", celle que l'utilisateur du ficher remplie, en mettant le poste occupé et les heures de travail (comme dans la feuille "Mars" par exemple). J'ai mis un exemple du rendu que j'aimerai avoir, c'est la feuille "rendu demandé", il s'agit d'un tableau qui regroupe tout les employés par jour avec leur poste pour avoir une meilleur visibilité de chaque jours. (je ne sais pas si c'est très compréhensible, n'hésitez pas à dire si vous ne comprenez pas ce que je souhaite faire)

J'arrive, comme dans la feuille "Récap Mars", à retranscrire les poste occupé de la fiche "Mars" grâce à l'heure de début et de fin (en découpant la journée de 6h à 12h puis de 13h à 00h) en mettant une colonne pour l'heure de prise de poste et une colonne pour l'heure de fin de poste (donc 2 colonnes par employés). J'aimerai donc fusionner les cases entre celle du début et celle de fin de poste et attribuer la couleur de l'employé concerné à cette cellule.

Je procède chaque chose en son temps et dans un premier temps j'essaie faire en sorte de fusionner les cases qu'il faut, voici ce que j'ai fait (qui ne fonctionne bien évidemment pas...

Dim i, j

Sub Recap()

For i = 4 To 10

If Range("Ci").Value Like "*ML*" Then

Range("Ci").Name = débutfus

Else: i = i + 1

End If

Next

For j = 4 To 10

If Range("Dj").Value Like "*ML*" Then

Range("Dj").Name = finfus

Else: j = j + 1

End If

Next

Range("débutfus:finfus").Select

With Selection

.HorizontalAlignment = xlCenter

.VerticalAlignment = xlCenter

.WrapText = False

.Orientation = 0

.AddIndent = False

.IndentLevel = 0

.ShrinkToFit = False

.ReadingOrder = xlContext

.MergeCells = False

End With

End Sub

"Recap" étant le nom du bouton que j'ai mis dans la fiche "Mars"...

Merci d'avance pour votre aide !

Coralie

18fichier-forum.xlsm (79.93 Ko)

Bonjour Coralie

Ton code est plutôt exotique, on reconnais pas le VBA au premier coup d’œil

si tu veux on corrige ensemble

Prenons les 2 premières boucles :

Je pense que ce que tu veux faire c’est récupérer les adresses des 2 cellules contenant ML dans la plage C4 à D10 de la feuille Recap Mars (si j'ai compris ça c'est que ton principe de code n'est pas mauvais mais c'est plutôt un problème de syntaxe.)

Une cellule se nomme Range("C8") si on veut remplacer 8 par la variable de boucle i il faut écrire Range("C" & i)

Pour affecter une valeur à une variable la syntaxe est nomvariable = valeur

Exemple :

debutfus = Range("C" & i).Address
Else: i = i + 1

n'est pas utile il est fait par la boucle i

et voici le code rectifié

    For i = 4 To 10
        If Range("C" & i).Value Like "*ML*" Then
        Range("C" & i).Select
            debutfus = Range("C" & i).Address
        End If
    Next i
    For j = 4 To 10
        If Range("D" & j).Value Like "*ML*" Then
            finfus = Range("D" & j).Address
        End If
    Next j

bon maintenant pour la suite il faudrait savoir ce que tu veux faire de la plage C4:D8 tu veux les fusionner et changer la couleur de fond ou juste changer la couleur de fond

A plus sur le forum

Bonjour,

Je ne sais pas à quoi va servir ce travail, mais il faut savoir que laes fusions de cellules sont en systématiquement source de problèmes quand on veux les exploiter ultérieurement.

La fusion de cellule ne doit avoir qu'un but esthétique. : Si ce travail est juste destiné à une présentation visuelle ou à imprimer par exemple : pas de problème.

Mis si au contraire tu comptes utiliser cela pour en faire quelque chose ultérieurement (toujours avec VBA), alors ce travail est inutile et même contre indiqué, il vaut bien mieux te contenter de colorer les cellules sans fusion.

A+

Bonjour "papyg",

merci pour ta réponse ! Et oui, j'avais prévenu j'ai appris un tout petit peu à coder en langage C et encore j'ai pas appris grand chose vu que c'était juste un petit outils pour notre métier final... Du coup VBA je fais un peu en impro Faut que je profite du confinement pour trouver un bon site internet et m'y mettre à fond pour apprendre la programmation VBA bien propre...

Du coup, j'ai bien compris l'explication sur l'erreur de syntaxe, je retiens ! Merci

Maintenant, j'aimerai fusionner ces cellules et leur attribuer une couleur. C'est pour cela que dans la logique des choses, j'ai utilisé "l'enregistrement d'une macro", ce qui me fais obtenir cela :

Range("C4:D8").Select With Selection .HorizontalAlignment = xlCenter .VerticalAlignment = xlCenter .WrapText = False .Orientation = 0 .AddIndent = False .IndentLevel = 0 .ShrinkToFit = False .ReadingOrder = xlContext .MergeCells = False End With Selection.Merge ActiveWindow.SmallScroll Down:=-15 With Selection.Interior .Pattern = xlSolid .PatternColorIndex = xlAutomatic .ThemeColor = xlThemeColorAccent2 .TintAndShade = 0 .PatternTintAndShade = 0 End With

Et donc dans la logique des choses, je ne veux pas que le code prenne les cases C4 à D8 mais la première case "ML" dans la colonne de gauche jusque la seconde case "ML" dans la colonne de droite... Case que l'on a nommé "debutfus" et "finfus" . Donc naturellement j'aurai remplacé

Range("C4:D8").Select

par

Range("debutfus:finfus").Select

Mais visiblement ça ne marche pas ...

Et du coup, bonjour "galopin01", effectivement, cette fusion n'est qu'esthétique !

En fait je ne savais pas comment retranscrire le tableau 1 (feuille "feuille à remplir") en tableau 2 (feuille "rendu demandé") puisque sur la première, les jours du mois sont en colonne et les horaires en ligne et sous forme d'intervalle et que j'aimerai l'avoir avec les jours en ligne et les horaires en colonne heure par heure et en plus de cela, regrouper chaque personnel tout les jours...

J'ai donc coupé la journée en 2, de 6h à 12h puis de 13h à 00h, donc dans la feuille "récap mars", j'utilise 2 colonnes par employé, la première est l'heure de début et la seconde l'heure de fin... et donc pour finaliser le tout et avoir une bonne visibilité, j'aimerai fusionner et colorer. Et après, nous ne touchons plus au tableau, celui-ci est imprimé (ou pas d'ailleurs) mais on ne le touche plus

Voila, encore merci pour vos réponses ! J'espère avoir été clair.

Bonsoir,

Sans vouloir te vexer : Tout cela me semble terriblement improvisé et un peu brouillon.

Aussi j'ai un peu de mal à suivre tes explications, et le classeur ne m'éclaire pas plus.

Je n'irai donc pas plus loin sur ce sujet.

A+

Bonjour Coralie

Galopin a tout a fait raison

dans la mesure du possible il faut éviter la fusion de cellules en VBA ça complique beaucoup la gestion

ceci dit j'ai bien compris ce que tu voulais et je regarde ça

en attendant si tu veux vraiment une excellente formation VBA je ne saurai trop te recommander les sessions 'COURS VBA' et 'COURS VBA AVANCE' sur ce même site ils sont progressif à partir de la base, complets et bien expliqués. c'est un bon investissement gratuit tout en meublant les heures de confinements

A plus sur le forum

Re Coralie

bon voilà j'ai repris ta macro en respectant ton cheminement.

  • Suppression module2 .
  • Début de module1 ajout de Option Explicit qui évite les erreurs de traitement sur faute de frappe (si j’emploie la variable source et que une fois j’utilise sourc Vba m’avertit)
  • Déclaration des variables
  • Seule la boucle i suffit
  • Différence entre like et = : = est strict tandis que Like permet l’emploi de caractères générique comme * ? ou # ( ce qui fait que = "ML" est suffisant)
  • Sheets("Recap Mars").Activate on travaille sur la feuille Recap Mars"
  • il faut ensuite supprimer les valeurs (formules) contenues dans la plage à fusionner et ne laisser une valeur que dans la cellule de début de plage. (sinon à traitement on aura besoin de valider un message Excel "La sélection contient plusieurs valeurs")
' vide la plage sauf première cellule
stock = Range(debutfus).Value 'ranger valeur dans stock
Range(debutfus & ":" & finfus) = "" ' vider valeurs de la plage
Range(debutfus).Value = stock 'restaurer valeur à partir de  stock

- Couleur de fond

.Color = RGB(64, 224, 64)

liste de valeurs RGB dans cours VBA : Les feuilles et cellules /Couleurs

- Ajout d’un petit bouton

A plus sur le forum

17forum.xlsm (85.00 Ko)

Merci beaucoup !!

Je vais travailler dessus, mettre le programme pour que ça se fasse pour tout les jours du mois et puis faire une feuille par mois

Et après je vais essayer de trouver dans les cours VBA du site pour continuer et faire en sorte que tout le programme se fasse qu'il y ai écrit "ML" ou autre chose/n'importe quel texte et que lorsque l'on clic sur le bouton alors que le vide à déjà été fait dans stock, que le fichier ne plante pas (mais ça je l'ai déjà fait dans un autre fichier me semble-t-il !).

Encore merci, et j'espère que j'aurai pas à revenir poser d'autres questions bête

bonjour Coralie

aucune question n'est bête quand on apprends .

aucun projet ne mérite le mépris s'il ne demande qu'à évoluer .

bon courage et à plus sur le forum

Rechercher des sujets similaires à "comment fusionner cases precises vba"