Mise en forme sur concaténation...
Fermé
R*Zed
Messages postés
3
Date d'inscription
samedi 25 septembre 2010
Statut
Membre
Dernière intervention
29 septembre 2010
-
27 sept. 2010 à 19:08
eriiic Messages postés 24600 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 21 octobre 2024 - 29 sept. 2010 à 11:19
eriiic Messages postés 24600 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 21 octobre 2024 - 29 sept. 2010 à 11:19
A voir également:
- Mise en forme sur concaténation...
- Mise en forme conditionnelle excel - Guide
- Mise en forme tableau word - Guide
- Mise a jour chrome - Accueil - Applications & Logiciels
- Mise en forme tableau croisé dynamique - Guide
- Mise a jour windows 10 - Accueil - Mise à jour
3 réponses
eriiic
Messages postés
24600
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
21 octobre 2024
7 238
Modifié par eriiic le 27/09/2010 à 19:35
Modifié par eriiic le 27/09/2010 à 19:35
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
R*Zed
Messages postés
3
Date d'inscription
samedi 25 septembre 2010
Statut
Membre
Dernière intervention
29 septembre 2010
27 sept. 2010 à 22:04
27 sept. 2010 à 22:04
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
eriiic
Messages postés
24600
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
21 octobre 2024
7 238
Modifié par eriiic le 27/09/2010 à 22:56
Modifié par eriiic le 27/09/2010 à 22:56
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
R*Zed
Messages postés
3
Date d'inscription
samedi 25 septembre 2010
Statut
Membre
Dernière intervention
29 septembre 2010
29 sept. 2010 à 10:34
29 sept. 2010 à 10:34
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
eriiic
Messages postés
24600
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
21 octobre 2024
7 238
29 sept. 2010 à 11:19
29 sept. 2010 à 11:19
Bon, ben je vois que ça a fait plaisir ;-)
Merci pour le retour et bonne continuation
eric
Merci pour le retour et bonne continuation
eric