Mise en forme sur concaténation...
R*Zed
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,
voilà, j'essaie de réaliser des docs-outils pour gérer ma classe, et d'appliquer une mise en forme que j'aime bien et que je pratique depuis des années (sous Word).
Pour me simplifier la vie et automatiser certaines listes, emploi du temps, etc., j'ai adapté ces docs sous excel, bien plus adapté finalement... mais voilà, quand je veux rappeler certaines données (par concaténation le plus souvent), je perds la mise en forme de départ...
Grâce à l'aide d'Eriiic (merci ! ^_^), sur ce forum, on est arrivé à un truc qui colle presque parfaitement à ce que je cherche à obtenir (à savoir, les majuscules initiales en rouge dans la concaténation), grâce à la macro suivante :
Ce qui a pour effet, quelle que soit la mise en forme d'origine, de placer l'initiale de chaque mot de la chaîne (en utilisant l'espace comme séparateur).
Bon, pour ceux qui suivent bien, je n'ai pas encore posé de question... Alors voilà :
Sachant que je ne suis néophyte en VBA, qui pourrait m'aider afin de compléter la macro après "While p > 0" pour que le rouge ne soit opérant QUE sur les mots ayant une majuscule à l'initiale ? Je pense qu'il y a qqch à faire avec "If" et "Ucase=true", mais comment formuler ça, pppppppppppp ?
Merci pour votre aide,
Amicalement,
Romuald
voilà, j'essaie de réaliser des docs-outils pour gérer ma classe, et d'appliquer une mise en forme que j'aime bien et que je pratique depuis des années (sous Word).
Pour me simplifier la vie et automatiser certaines listes, emploi du temps, etc., j'ai adapté ces docs sous excel, bien plus adapté finalement... mais voilà, quand je veux rappeler certaines données (par concaténation le plus souvent), je perds la mise en forme de départ...
Grâce à l'aide d'Eriiic (merci ! ^_^), sur ce forum, on est arrivé à un truc qui colle presque parfaitement à ce que je cherche à obtenir (à savoir, les majuscules initiales en rouge dans la concaténation), grâce à la macro suivante :
Private Sub Worksheet_Change(ByVal Target As Range)
Dim fini As Boolean, p As Long
If Target.Column > 4 Then Exit Sub ' là, c'est en surveillant les 4 premières colonnes où se trouvent les données de départ
Application.EnableEvents = False
[H4] = [B4] & " " & [D4] ' là, on précise la cellule où opérer la concaténation, sans passer par une formule dans la feuille-même (sinon, c'est tout rouge)
[H4].Font.ColorIndex = 0 'là, on dit que c'est tout en noir par défaut
[H4].Characters(1, 1).Font.ColorIndex = 3 ' là, on précise qu'on veut l'initiale en rouge
p = InStr([H4], " ") ' là on sépare les mots de la chaîne de concaténation
While p > 0
[H4].Characters(p + 1, 1).Font.ColorIndex = 3 ' là, on applique aussi le rouge à l'initiale du mot à l'intérieur de la chaîne
p = InStr(p + 1, [H4], " ") ' et là on passe au suivant - soit, faire une boucle
Wend
Application.EnableEvents = True
End Sub
Ce qui a pour effet, quelle que soit la mise en forme d'origine, de placer l'initiale de chaque mot de la chaîne (en utilisant l'espace comme séparateur).
Bon, pour ceux qui suivent bien, je n'ai pas encore posé de question... Alors voilà :
Sachant que je ne suis néophyte en VBA, qui pourrait m'aider afin de compléter la macro après "While p > 0" pour que le rouge ne soit opérant QUE sur les mots ayant une majuscule à l'initiale ? Je pense qu'il y a qqch à faire avec "If" et "Ucase=true", mais comment formuler ça, pppppppppppp ?
Merci pour votre aide,
Amicalement,
Romuald
A voir également:
- Mise en forme sur concaténation...
- Mise en forme conditionnelle excel - Guide
- Mise en forme tableau croisé dynamique - Guide
- Mise a jour chrome - Accueil - Applications & Logiciels
- Mise a jour windows 10 - Accueil - Mise à jour
- Mise en forme whatsapp - Guide
3 réponses
Bonjour,
J'ai repris la partie if target.column... car si tu n'as qu'une ligne de concernée il vaut mieux ne faire le traitement que sur modification des 2 cellules qui modifie la concaténation.
Ton code devient (avec test des majuscules) :
Si plusieurs lignes sont concernées précise-le qu'on modifie les tests et l'adressage des cellules.
eric
J'ai repris la partie if target.column... car si tu n'as qu'une ligne de concernée il vaut mieux ne faire le traitement que sur modification des 2 cellules qui modifie la concaténation.
Ton code devient (avec test des majuscules) :
Private Sub Worksheet_Change(ByVal Target As Range)
Dim fini As Boolean, p As Long
If Intersect(Target, Union([B4], [D4])) Is Nothing Then Exit Sub ' là, c'est en surveillant les 2 cellules où se trouvent les données de départ
Application.EnableEvents = False
[H4] = [B4] & " " & [D4] ' là, on précise la cellule où opérer la concaténation, sans passer par une formule dans la feuille-même (sinon, c'est tout rouge)
[H4].Font.ColorIndex = 0 'là, on dit que c'est tout en noir par défaut
If Left([H4], 1) = UCase(Left([H4], 1)) Then
[H4].Characters(1, 1).Font.ColorIndex = 3 ' là, on précise qu'on veut l'initiale en rouge
End If
p = InStr([H4], " ") ' là on sépare les mots de la chaîne de concaténation
While p > 0
If Mid([H4], p + 1, 1) = UCase(Mid([H4], p + 1, 1)) Then
[H4].Characters(p + 1, 1).Font.ColorIndex = 3 ' là, on applique aussi le rouge à l'initiale du mot à l'intérieur de la chaîne
End If
p = InStr(p + 1, [H4], " ") ' et là on passe au suivant - soit, faire une boucle
Wend
Application.EnableEvents = True
End Sub
Si plusieurs lignes sont concernées précise-le qu'on modifie les tests et l'adressage des cellules.
eric
OK, merci, c'est exactement ça qu'il me fallait !
T'es trop fort ! c'est impeccable...
A propos des lignes concernées et de l'adressage, eh ben en fait, dans mes docs d'origine, cela serait appliqué sur 2 types de "zones", l'un concernant les lignes de titre de mes listes (concaténation du nom de la classe et de celui de l'école) et l'autre concernant plutôt les noms et prénoms de mes élèves... et ce sur plusieurs feuilles...
Après, si je dois entrer dans les détails, ce serait trop fastidieux, mais disons que je sais copier-coller la macro pour que cela se fasse sur chaque cellule concernée, y compris d'une feuille à l'autre automatiquement...
Par contre, pour la zone de noms de mes élèves, je peux peut-être changer :
par :
par exemple, et ça serait bon aussi, non ?
Amicalement,
Romuald
T'es trop fort ! c'est impeccable...
A propos des lignes concernées et de l'adressage, eh ben en fait, dans mes docs d'origine, cela serait appliqué sur 2 types de "zones", l'un concernant les lignes de titre de mes listes (concaténation du nom de la classe et de celui de l'école) et l'autre concernant plutôt les noms et prénoms de mes élèves... et ce sur plusieurs feuilles...
Après, si je dois entrer dans les détails, ce serait trop fastidieux, mais disons que je sais copier-coller la macro pour que cela se fasse sur chaque cellule concernée, y compris d'une feuille à l'autre automatiquement...
Par contre, pour la zone de noms de mes élèves, je peux peut-être changer :
If Intersect(Target, Union([B4], [D4])) Is Nothing Then Exit Sub
par :
If Intersect(Target, Range("A1:K24")) Is Nothing Then Exit Sub
par exemple, et ça serait bon aussi, non ?
Amicalement,
Romuald
Re,
Par contre, pour la zone de noms de mes élèves, je peux peut-être changer :
If Intersect(Target, Union([B4], [D4])) Is Nothing Then Exit Sub
par :
If Intersect(Target, Range("A1:K24")) Is Nothing Then Exit Sub
par exemple, et ça serait bon aussi, non ?
heuuu, oui, pour la 1ère ligne du code modifiée, mais loin d'être suffisant... ;-)
Je suppose que sur le même modèle tu concatènes sur les 24 lignes les 11 cellules A:K et que tu mets le résultat en L (?)
Pour concaténer les 11 cellules avec une espace en séparateur je te propose une fonction personnalisée à mettre dans un module :
Le code modifié pour tenir compte de la ligne à mettre à jour :
(target.row donne le n° de ligne modifiée)
Mais je me demande si tu as vraiment 11 cellules à concatener ????
eric
Par contre, pour la zone de noms de mes élèves, je peux peut-être changer :
If Intersect(Target, Union([B4], [D4])) Is Nothing Then Exit Sub
par :
If Intersect(Target, Range("A1:K24")) Is Nothing Then Exit Sub
par exemple, et ça serait bon aussi, non ?
heuuu, oui, pour la 1ère ligne du code modifiée, mais loin d'être suffisant... ;-)
Je suppose que sur le même modèle tu concatènes sur les 24 lignes les 11 cellules A:K et que tu mets le résultat en L (?)
Pour concaténer les 11 cellules avec une espace en séparateur je te propose une fonction personnalisée à mettre dans un module :
Function ConcatPlage(plage As Range, separateur As String) As String
Dim c As Range
Dim rep As String
For Each c In plage
rep = rep & separateur & c.Value
Next c
ConcatPlage = Mid(rep, Len(separateur) + 1)
End Function
Le code modifié pour tenir compte de la ligne à mettre à jour :
(target.row donne le n° de ligne modifiée)
Private Sub Worksheet_Change(ByVal Target As Range)
Dim fini As Boolean, p As Long
If Intersect(Target, Range("A1:K24")) Is Nothing Then Exit Sub ' là, c'est en surveillant les x cellules où se trouvent les données de départ
Application.EnableEvents = False
With Cells(Target.Row, 12) 'même ligne, colonne 12 (L)
.Value = ConcatPlage(Cells(Target.Row, 1).Resize(1, 11), " ") ' là, on précise la cellule où opérer la concaténation, sans passer par une formule dans la feuille-même (sinon, c'est tout rouge)
.Font.ColorIndex = 0 'là, on dit que c'est tout en noir par défaut
If Left(.Value, 1) = UCase(Left(.Value, 1)) Then ' si 1er caractère majuscule
.Characters(1, 1).Font.ColorIndex = 3 ' là, on précise qu'on veut l'initiale en rouge
End If
p = InStr(.Value, " ") ' là on sépare les mots de la chaîne de concaténation
While p > 0
If Mid(.Value, p + 1, 1) = UCase(Mid(.Value, p + 1, 1)) Then ' si majuscule
.Characters(p + 1, 1).Font.ColorIndex = 3 ' là, on applique aussi le rouge à l'initiale du mot à l'intérieur de la chaîne
End If
p = InStr(p + 1, .Value, " ") ' et là on passe au suivant - soit, faire une boucle
Wend
End With
Application.EnableEvents = True
End Sub
Mais je me demande si tu as vraiment 11 cellules à concatener ????
eric
Extra ! Je ne pouvais pas espérer mieux, ni aussi rapidement !
Encore tous mes plus chaleureux remerciements ! ^_^
Pour répondre à ta question, effectivement, je n'ai pas une chaîne de 11 cellules à rattrouper en une seule (!!!), je voulais simplement signifier que dans cette zone (mais ce n'est qu'un exemple ici, car en réalité cela varie selon le document où je veux placer la macro), j'aurai besoin de surveiller certaines cellules définies plus loin, comme les nom-prénom des élèves, pour les concaténer par la suite.
Par contre, il est vrai que j'ai bien plus d'une dizaine de concaténations (mais pas une concaténation d'une dizaine de données, entendons-nous bien ! ^_^) à réaliser ainsi sur au moins deux docs différents... d'où le côté "fastidieux" à décrire dans ce post... et le côté "pratique" de la macro à placer en module !
L'un concerne des listes d'élèves (tri alphabétique, chronologique, par dates d'anniversaire, avec pyramide des âges, histogrammes...) avec en "en-tête" la classe et le nom de l'école et en bas de page les nom et adresse de l'établissement (1 page avec les données de départ, 5 pages avec les rappels de données - concaténées)... là, ça fait 10 références...
L'autre concerne l'emploi du temps de la classe : 1 "de base" avec les données de départ (comme nom de la classe et nom de l'école, noms-prénoms des élèves) , 1 "général" avec les diverses prises en charge extérieures des élèves qui interfèrent au cours de la semaine - donc, rappel de données du premier en "en-tête", et 1 page avec les emplois du temps individuels pour récapituler / compiler le tout à chacun de mes élèves - ils sont 12 au total -, avec re-"en-tête" puis leur nom-prénom au-dessus de chaque EdT individuel avec la présentation "qui va bien" (majuscule initiale en rouge)... Donc oui, au niveau de l'adressage, c'est un peu complexe, mais le plus dur est fait... grâce à toi !
Donc, là, merci, merci, merci... je suis vraiment trop content ! ^o^
Voilà, je devrais pouvoir me débrouiller maintenant pour continuer mes docs... mais si je "bloque" encore... eh bien je crée une nouvelle discussion ! ^_^
Amicalement,
Romuald
Encore tous mes plus chaleureux remerciements ! ^_^
Pour répondre à ta question, effectivement, je n'ai pas une chaîne de 11 cellules à rattrouper en une seule (!!!), je voulais simplement signifier que dans cette zone (mais ce n'est qu'un exemple ici, car en réalité cela varie selon le document où je veux placer la macro), j'aurai besoin de surveiller certaines cellules définies plus loin, comme les nom-prénom des élèves, pour les concaténer par la suite.
Par contre, il est vrai que j'ai bien plus d'une dizaine de concaténations (mais pas une concaténation d'une dizaine de données, entendons-nous bien ! ^_^) à réaliser ainsi sur au moins deux docs différents... d'où le côté "fastidieux" à décrire dans ce post... et le côté "pratique" de la macro à placer en module !
L'un concerne des listes d'élèves (tri alphabétique, chronologique, par dates d'anniversaire, avec pyramide des âges, histogrammes...) avec en "en-tête" la classe et le nom de l'école et en bas de page les nom et adresse de l'établissement (1 page avec les données de départ, 5 pages avec les rappels de données - concaténées)... là, ça fait 10 références...
L'autre concerne l'emploi du temps de la classe : 1 "de base" avec les données de départ (comme nom de la classe et nom de l'école, noms-prénoms des élèves) , 1 "général" avec les diverses prises en charge extérieures des élèves qui interfèrent au cours de la semaine - donc, rappel de données du premier en "en-tête", et 1 page avec les emplois du temps individuels pour récapituler / compiler le tout à chacun de mes élèves - ils sont 12 au total -, avec re-"en-tête" puis leur nom-prénom au-dessus de chaque EdT individuel avec la présentation "qui va bien" (majuscule initiale en rouge)... Donc oui, au niveau de l'adressage, c'est un peu complexe, mais le plus dur est fait... grâce à toi !
Donc, là, merci, merci, merci... je suis vraiment trop content ! ^o^
Voilà, je devrais pouvoir me débrouiller maintenant pour continuer mes docs... mais si je "bloque" encore... eh bien je crée une nouvelle discussion ! ^_^
Amicalement,
Romuald