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

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:

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
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) :
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
0
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
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 :

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
0
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
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 :
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
0
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
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
0
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
Bon, ben je vois que ça a fait plaisir ;-)
Merci pour le retour et bonne continuation
eric
0