Mise en forme sur concaténation...

R*Zed Messages postés 3 Statut Membre -  
eriiic Messages postés 24581 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 :

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

3 réponses

  1. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    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
  2. R*Zed Messages postés 3 Statut Membre
     
    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
    1. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      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
  3. R*Zed Messages postés 3 Statut Membre
     
    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
    1. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      Bon, ben je vois que ça a fait plaisir ;-)
      Merci pour le retour et bonne continuation
      eric
      0