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
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
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
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