VBA pourquoi la mise en forme s'applique seulement à une partie du texte ?

fb62840

XLDnaute Impliqué
Bonjour à toutes et à tous,

Voici mon problème,

Je cherche à mettre en forme différents textes présents dans une cellule.
Ces textes sont contenus dans une array.

Voici la première partie du code qui donne bien le résultat attendu (texte de la variable en bleu et souligné):
Code:
For Each Cel In Range ("C1")
If Instr(Cel, Tablo(I, 8)) Then
a = Instr(Cel, Tablo(I, 8))
With Cel.Characters(Start:=a, Length:=Len(Tablo(I, 8))).Font
.Color = 16711680
.Underline = xlUnderlineStyleSingle
End With
End If
Next

Par contre, pas moyen de mettre en gras les deux premiers mots (contenus dans deux variables (Tablo(I,1) et Tablo(I,2) :
Code:
For Each Cel In Range ("C1")
If Instr(Cel, Tablo(I, 1)) Then
a = Instr(Cel, Tablo(I, 1))
With Cel.Characters(Start:=a, Length:=(Len(Tablo(I, 1))) + Len(Tablo(I,2)) + 1).Font
.FontStyle = "Gras"
End With
End If
Next

Merci pour votre aide
 

Pièces jointes

  • Base116.xls
    73.5 KB · Affichages: 39

Roland_M

XLDnaute Barbatruc
Re : VBA pourquoi la mise en forme s'applique seulement à une partie du texte ?

bonjour,

affaire de ()

ici
With Cel.Characters(Start:=a, Length:=(Len(Tablo(I, 1))) + Len(Tablo(I,2)) + 1).Font.FontStyle = "Gras"

essai
With Cel.Characters(Start:=a, Length:=(Len(Tablo(I, 1)) + Len(Tablo(I, 2)) + 1)).Font.FontStyle = "Gras"
 

francedemo

XLDnaute Occasionnel
Re : VBA pourquoi la mise en forme s'applique seulement à une partie du texte ?

bonjour,
dans ton deuxième code, remplace "a" par "1" (variable "Start:=")
à+
nota: dans ton fichier joint, tu a omis le "." avant "Fontstyle", si tu le mets, ça fonctionne...(chez moi)
 
Dernière édition:

fb62840

XLDnaute Impliqué
Re : VBA pourquoi la mise en forme s'applique seulement à une partie du texte ?

Merci Roland pour cette proposition,

J'ai appliqué la correction mais cela ne fonctionne pas, le texte ne passe pas en gras.

bonjour,

affaire de ()

ici
With Cel.Characters(Start:=a, Length:=(Len(Tablo(I, 1))) + Len(Tablo(I,2)) + 1).Font.FontStyle = "Gras"

essai
With Cel.Characters(Start:=a, Length:=(Len(Tablo(I, 1)) + Len(Tablo(I, 2)) + 1)).Font.FontStyle = "Gras"
 

fb62840

XLDnaute Impliqué
Re : VBA pourquoi la mise en forme s'applique seulement à une partie du texte ?

Merci Roland,

En effet, cela fonctionne parfaitement bien maintenant.
J'aurais dû être plus attentif.

Un grand merci pour votre disponibilité.

bonjour,
dans ton deuxième code, remplace "a" par "1" (variable "Start:=")
à+
nota: dans ton fichier joint, tu a omis le "." avant "Fontstyle", si tu le mets, ça fonctionne...(chez moi)
 

Roland_M

XLDnaute Barbatruc
Re : VBA pourquoi la mise en forme s'applique seulement à une partie du texte ?

re

For Each Cel In Range("C1")
If InStr(Cel, Tablo(I, 1)) Then
b = InStr(Cel, Tablo(I, 1))
Cel.Characters(Start:=b, Length:=Len(Tablo(I, 1)) + Len(Tablo(I, 2)) + 1).Font.Bold = True
End If
Next

EDIT: pas vu la réponse. mais c'est exact il manquait le (.)
 

Gorfael

XLDnaute Barbatruc
Re : VBA pourquoi la mise en forme s'applique seulement à une partie du texte ?

Salut fb62840 et le forum
Comme j'arrive après la bataille, je ne vais pas essayer de répondre, d'autres s'en sont occupé.
Alors juste des "critiques".
Avant de répondre à une question, je regarde la macro, recrée ce que je crois son algorithme et essayant de le comprendre.
Ton code (avec quelques modifications) :
Code:
Sub EditionCVs()
Dim Tablo, I As Long, Wkb As Workbook, NbLignes As Long, LgNP As Long, Cel As Range

Application.ScreenUpdating = False

Tablo = ThisWorkbook.Sheets("Base").Range("A1").CurrentRegion.Value

Set Wkb = Workbooks.Add
For I = Wkb.Sheets.Count To 2 Step -1
    Application.DisplayAlerts = False
    Wkb.Sheets(I).Delete
    Application.DisplayAlerts = True
Next I
For I = 2 To UBound(Tablo, 1)
    With Wkb.Sheets(I - 1)
        If Tablo(I, 1) <> "" Then
            .Name = Tablo(I, 1)
            .Range("C1").Value = Tablo(I, 1) & " " & Tablo(I, 2) & vbLf & _
                  Tablo(I, 3) & " " & Tablo(I, 4) & " " & Tablo(I, 5) & vbLf & Tablo(I, 8) 'Nom et prénom du Candidat
            .Range("D1").Value = Len(Tablo(I, 1)) + Len(Tablo(I, 2)) + Len(Tablo(I, 3)) _
                                                               + Len(Tablo(I, 4)) + Len(Tablo(I, 5))
            .Range("C10").Value = Tablo(I, 6) 'N° Candidat téléphone fixe Candidat
            .Range("F10").NumberFormat = "0#"" ""##"" ""##"" ""##"" ""##" 'formate en N° Tel '*********
            .Range("DC11").Value = Tablo(I, 7) 'N° Mobile Candidat
            .Range("F11").NumberFormat = "0#"" ""##"" ""##"" ""##"" ""##" 'formate en N° Tel '*********
            .Range("C8").Value = Tablo(I, 8) 'Adresse mail Candidat
        
            'ça ce serait la façon d'appliquer le format à la cellule C8 mais mon objectif c'est d'appliquer le format à la variable Tablo(I, 8)
            'Wkb.Sheets(I - 1).Range("D8").Value = Len(Tablo(I, 8))
            '.Hyperlinks.Add .Range("C8"), "aaa@lll.com"
        
            For Each Cel In Range("C1")
                If InStr(Cel, Tablo(I, 8)) Then
                    a = InStr(Cel, Tablo(I, 8))
                        With Cel.Characters(Start:=a, Length:=Len(Tablo(I, 8))).Font
                            .Color = 16711680
                            .Underline = xlUnderlineStyleSingle
                        End With
                End If
            Next
        
        
            LgNP = Len(Tablo(I, 1)) + Len(Tablo(I, 2)) + 1
            
            For Each Cel In Range("C1")
                If InStr(Cel, Tablo(I, 1)) Then
                    b = InStr(Cel, Tablo(I, 1))
                        With Cel.Characters(Start:=b, Length:=Len(Tablo(I, 1)) + Len(Tablo(I, 2)) + 1).Font
                            FontStyle = "Gras"
                        End With
                End If
            Next
            
            .Range("B1").Value = Tablo(I, 9) 'Nom du métier
            .Range("A6").Value = Tablo(I, 10) 'Motivation professionnelle
            .Range("A14").Value = Tablo(I, 11) 'Permis
            .Range("A15").Value = Tablo(I, 12) 'Moyen Candidat transport
            .Range("A16").Value = Tablo(I, 13) 'Mobilité
            .Range("B15").Value = Tablo(I, 14) & " " & Tablo(I, 15) & " " & Tablo(I, 16) 'Année Candidat la formation 1, Nom Candidat la formation, niveau
            .Range("B17").Value = Tablo(I, 17) 'Connaissances acquises Candidat la formation 1
            .Range("B19").Value = Tablo(I, 18) & Tablo(I, 19) & " - " & Tablo(I, 20)  'Formation 2 année, Nom, Niveau
            .Range("b21").Value = Tablo(I, 21) 'Formation 2 connaissances
            .Range("B23").Value = Tablo(I, 22) & Tablo(I, 23) & " - " & Tablo(I, 24)  'Formation 3 année, Nom, Niveau
            .Range("B27").Value = Tablo(I, 25) 'Formation 3 connaissances
            .Range("B29").Value = Tablo(I, 26) & Tablo(I, 27) & " - " & Tablo(I, 28)  'Formation 4 année, Nom, Niveau
            .Range("B31").Value = Tablo(I, 29) 'Formation 4 connaissances
            .Range("B33").Value = Tablo(I, 30) & " - " & Tablo(I, 31) & " - " & Tablo(I, 32)   'Formation 5 année, Nom, Niveau
            .Range("B35").Value = Tablo(I, 33) 'Formation 5 connaissances
            .Range("B36").Value = Tablo(I, 34) & " - " & Tablo(I, 35) & " - " & Tablo(I, 36) & " - " & Tablo(I, 37)    'Expérience 1 Année, Titre poste, Nom entreprise, Ville
            .Range("B38").Value = Tablo(I, 38) 'Expérience 1 Candidatscriptif du poste et missions
            .Range("B40").Value = Tablo(I, 39) & " - " & Tablo(I, 40) & " - " & Tablo(I, 41) & " - " & Tablo(I, 42)    'Exp 2 Année, Titre poste, Nom entreprise, Ville
            .Range("B43").Value = Tablo(I, 43) 'Exp 2 Candidatscriptif du poste et missions
            .Range("B45").Value = Tablo(I, 44) & " - " & Tablo(I, 45) & " - " & Tablo(I, 46) & " - " & Tablo(I, 47)    'Exp 3 Année, Titre poste, Nom entreprise, Ville
            .Range("B47").Value = Tablo(I, 48) 'Exp 3 Candidatscriptif du poste et missions
            .Range("C47").Value = Tablo(I, 49) & " - " & Tablo(I, 50) & " - " & Tablo(I, 51) & " - " & Tablo(I, 52)     'Exp 4 Année, Titre poste, Nom entreprise, Ville
            .Range("C53").Value = Tablo(I, 53) 'Exp 4 Candidatscriptif du poste et missions
            .Range("B55").Value = Tablo(I, 54) & " - " & Tablo(I, 55) & " - " & Tablo(I, 56) & " - " & Tablo(I, 57)    'Exp 5 Année, Titre poste, Nom entreprise, Ville
            .Range("B57").Value = Tablo(I, 58) 'Exp 5 Candidatscriptif du poste et missions
            .Range("A35").Value = Tablo(I, 59) 'Attestations
            .Range("A36").Value = Tablo(I, 60) 'Habilitations
            .Range("A37").Value = Tablo(I, 61) 'Langues
            .Range("A38").Value = Tablo(I, 62) 'Informatique
            .Range("A1:G65").Font.Name = "Arial"
            .Range("A1:G65").Font.Size = "12"
        End If
    
    .Columns(1).ColumnWidth = 25
    .Columns(2).ColumnWidth = 55
    .Columns(3).ColumnWidth = 50
    
    .Rows(1).RowHeight = 40
    .Rows(4).RowHeight = 40
    .Rows(11).RowHeight = 100
        
    End With
Next I
NbLignes = Range("A65535").End(xlUp).Row '**************
 
For l = NbLignes To 3 Step -1
    If Range("IV" & l).End(xlToLeft).Column = 1 And Cells(l, 1) = "" Then Rows(l).Delete
Next l

If I < UBound(Tablo, 1) Then Wkb.Sheets.Add After:=Wkb.Sheets(Wkb.Sheets.Count) '**************
End Sub
Comme je nai pas tout compris, quelques remarques :
- Déclarer ses variables, c'est bien. Mais les déclarer toutes c'est mieux !
- Il est préférable de toutes les déclarer en un seul endroit : ça facilite la lecture du code, et permet de la retrouver facilement en cas de changement de type, et je ne sais pas ce qu'en pense excel quand c'est dans une boucle (quoique, normalement, il lit les déclarations avant de commencer le code).

- Tu utilises with dans ton code, mais je ne suis pas sûr de comment tu t'en sets. Regarde les différence entre ton utilisation et la mienne.

- Les indentations ne sont pas là pour rendre beau le code, elles ont un but purement fontionnel : elle permettent de s'y retrouver dans la boucle, le With ou le test. Plus un code est lisible, plus il est facile d'en détecter les erreurs.

Les lignes où j'ai rajouté des *** me pose problème

- Dans la boucle, les mise en format ne sont pas rattachées à la nouvelle feuille. Si c'est volontaire... une fois suffit. Si c'est un oubli, avec les descriptions Classeur/feuille en clair, ça me semble... visible.
Code:
For Each Cel In Range("C1")
Comme tu utilises plusieurs fois la même instruction, je suppose que tu limites à C1 au lieu d'une vraie plage pour tes tests. Seulement, pourquoi sur la feuille active, et pas sur celle où tu est en train de travailler ?

- Derrière la boucle, je ne comprends pas à quoi ça sert.

- If à deux syntaxes possibles :
if .... then ... else ... => en une seule ligne, sans end if
ou
If .... then
...
else
...
end if
Le Else est facultatif, mais tu ne peux combiner les deux syntaxes !
A+
 

fb62840

XLDnaute Impliqué
Re : VBA pourquoi la mise en forme s'applique seulement à une partie du texte ?

Bonjour,

Merci pour cette réponse très aimable, certaines sont parfois un peu "rudes". Sans aucun doute elle me permettra d'épurer le code et de le rendre plus lisible. Je vais tâcher de digérer l'ensemble et dès lors que j'aurai revu les choses, je posterai le code plus propre que j'aurais été capable d'écrire.

Je suis un "autodidacte" de la programmation vba. Je m'appuie sur les nombreuses contributions et tutoriels que l'on trouve sur le net. Mais parfois ça ne suffit pas et je suis alors bien heureux de pouvoir faire appel à la communauté d'Excel Downoads.

Un grand merci donc à tous ceux qui comme toi prennent de leur temps pour essayer de nous aider.
 

fb62840

XLDnaute Impliqué
Re : VBA pourquoi la mise en forme s'applique seulement à une partie du texte ?

Re-bonjour,

J'ai revu ma série de lignes IF,

Je pensais avoir correctement rédigé les choses ainsi :
Code:
For Each Cel In Range("C1")
If InStr(Cel, Tablo(I,8)) Then 'Si la cellule C1 contient le texte de la variable tablo(I,8)
a = InStr(Range(Cel, Tablo(I, 8)) 'alors a sera le 1er caractère du texte de la variable tablo(I,8)
With Cel.Characters(Start:=a, Length:=Len(Tablo(I,8))).Font 'Du premier au dernier caractère de tablo(I, 8) la font sera
.Color = 16711680 'De couleur bleu
.Underline : xlUnderlineStyleSingle ' et souligné (de façon à "simuler" l'écriture d'une adresse mail
End With

Else
LgNP = Len(Tablo(I, 1)) + Len(Tablo(I,2)) +1 'je définie la variable LgNP : longueur variable 1 + long variable 2 + 1 (pour l'espace)
With Range(Cel.Characters(Start:=1, Length:=LgNP).Font 'Du 1er caractère jusqu'à LgNP (total caractères 2 premiers mots + 1)
.FontStyle = "Gras" 'devraient être en gras
End With

Malheureusement ça ne marche pas.
Seule la première condition semble avoir de l'effet, c'est à dire que le texte passe en bleu et et souligné.

Une piste ?

Une piste ?

End If
 

fb62840

XLDnaute Impliqué
Re : VBA pourquoi la mise en forme s'applique seulement à une partie du texte ?

Je viens de me rendre compte de mon erreur, j'ai un peu honte.

En fait je tester une condition, puis une seconde, mais la première était toujours exacte puisque la cellule contient les 3 variables.

Ainsi mon code de condition se résume maintenant à une expression plus simple et plus claire et sans IF mais avec For et With :

Code:
For Each Cel In Range("C1")
LgNP = Len(Tablo(I, 1))+ Len(Tablo(I, 2)) + 1
a = InStr (Cel, Tablo (I, 8))
With Cel.Characters(Start:=a, Length:=Len(Tablo(I, 8))).Font
.Color = 16711680
.Underline = xlUnderlineStyleSingle
End With
With Cel.Characters(Start:=1, Length=LgNP).Font
.FontStyle = "Gras"
End With
Next

Encore merci à tous
 

Discussions similaires

Statistiques des forums

Discussions
314 656
Messages
2 111 610
Membres
111 224
dernier inscrit
Test66