Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Word > VBA Word
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 14/12/2010, 19h20   #1
Membre du Club
 
Femme
Inscription : décembre 2010
Messages : 21
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France, Nord (Nord Pas de Calais)

Informations forums :
Inscription : décembre 2010
Messages : 21
Points : 42
Points : 42
Par défaut [VBA] dernier paragraphe de la dernière note

Bonjour!

Cela fait quelques jours que je bloque sur un problème sûrement tout bête, mais je ne trouve vraiment pas...
Je suis occupée sur une macro permettant de mettre des balises HTML sur un texte word et mon problème vient des notes : je ne sais pas comment dire à Word de faire une certaine action lorsqu'il se trouve à la fin du dernier paragraphe de la dernière note. Comment faire ce test?

Pour info, voici le morceau de code dans lequel il doit s'insérer :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
 
nbmax = ActiveDocument.Footnotes.Count
    For I = 1 To nbmax
        vide = False
        Set para = ActiveDocument.Footnotes(I)
        Set finpara = ActiveDocument.Range(para.Range.Start, para.Range.End - 1)
        para.Range.Select
        Selection.MoveLeft
        If Format(Selection.Footnotes.Item(1).Index) < 10 Then
            numnote = "00" + Format(Selection.Footnotes.Item(1).Index)
            ElseIf Format(Selection.Footnotes.Item(1).Index) < 100 Then
                numnote = "0" + Format(Selection.Footnotes.Item(1).Index)
                Else: numnote = Format(Selection.Footnotes.Item(1).Index)
        End If
        Selection.TypeText Text:="<NBP ID=""" + revue + "NBP" + numnote + """><div class=""Nbp""><P><B>" + Format(Selection.Footnotes.Item(1).Index) + ". &nbsp;</B>"
        Selection.Delete wdCharacter, 2
        Selection.EndOf wdParagraph, wdMove
        If Selection.Range = finpara Then 'c est ici que je dois faire le test. j avais utilise le Range, mais cela ne fonctionne pas...
            Selection.TypeText Text:="</P></div></NBP>"
        Else
            While Format(Selection.Footnotes.Item(1).Index) = I And Selection.Range <> finpara 'et ici
                vide = False
                Selection.MoveLeft
                Selection.TypeText Text:="</P>"
                Selection.MoveRight
                If Selection.Words(1) = Chr(13) Then
                    Selection.TypeBackspace
                    vide = True
                Else
                    Selection.TypeText Text:="<P>"
                End If
                Selection.EndOf wdParagraph, wdMove
            Wend
            Selection.MoveLeft
            If vide = True Then
                Selection.TypeText Text:="</div></NBP>"
            Else
                Selection.TypeText Text:="</P></div></NBP>"
            End If
        End If
        para.Range.Select
        txtXMLnote = txtXMLnote + Selection.Text
        para.Range.Delete
    Next
End If
Et si vous trouvez aussi des choses que je pourrais optimiser, ce qui ne m'étonnerait pas, n'hésitez surtout pas!
Merci d'avance!
dewcaro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2010, 22h48   #2
Responsable Word

 
Avatar de Heureux-oli
 
Homme Olivier Lebeau
Contrôleur d'industrie
Inscription : février 2006
Messages : 17 317
Détails du profil
Informations personnelles :
Nom : Homme Olivier Lebeau
Âge : 47
Localisation : Belgique

Informations professionnelles :
Activité : Contrôleur d'industrie
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : février 2006
Messages : 17 317
Points : 29 214
Points : 29 214
Salut,

Peut-être une piste :

Code :
1
2
3
4
5
6
7
8
9
10
 
Sub NoteBasDePage()
Dim nbp As Footnote
 
For Each nbp In ActiveDocument.Footnotes
If nbp.Index = ActiveDocument.Footnotes.Count Then MsgBox nbp.Range.Text
Next nbp
 
 
End Sub
__________________
J'ai pas encore de décodeur, alors, postez en clair ! Comment mettre une balise de code ?
Débutez en VBA

Mes articles


Dans un MP, vous pouvez me dire que je suis beau, ... mais si c'est une question technique je ne la lis pas ! Vous êtes prévenus !
Heureux-oli est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2010, 12h33   #3
Membre du Club
 
Femme
Inscription : décembre 2010
Messages : 21
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France, Nord (Nord Pas de Calais)

Informations forums :
Inscription : décembre 2010
Messages : 21
Points : 42
Points : 42
Bonjour Heureux-oli!

Merci de ta réponse, mais la piste s'est (encore) terminée en cul de sac...
Mon soucis principal est que mes notes peuvent contenir plusieurs paragraphes et que parfois ils sont vides. S'ils sont vides, je dois les supprimer, sinon je dois les baliser en <P></P>. Puis fermer ma <div> et ma <NBP> à la fin de la note.
Cela fonctionnait très bien jusqu'à la dernière note : soit ma boucle continuait à l'infini, soit elle s'arrêtait à cause d'une erreur, selon le test que j'effectuais...

Je me suis dis que j'allais changer de méthode et noter directement à la fin de ma note les balises fermantes. Du coup, je teste le dernier caractère de ma note pour savoir si j'ai traité tous les paragraphes ou non. Et cela fonctionne!
J'avais encore un soucis avec les paragraphes vides, mais je l'ai réglé en bidouillant... C'est vraiment dommage qu'il n'existe pas une variable renvoyant la fin de la dernière note...
D'ailleurs, il me semble qu'il en existe une pour la fin de document, mais je ne me souviens plus de son nom (en wordbasic je crois...)

Donc au final, cela fonctionne mais je ne suis pas sûre que ce soit très optimisé!!
Si tu as des idées pour l'optimiser, n'hésites pas!
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
 
Dim nbp As Footnote
Dim vide As Boolean
Dim para As Range
Dim numnote As String
Dim revue As String
Dim txtXMLnote As String 
Dim I As Integer
 
Application.StatusBar = "structuration des notes"
    txtXMLnote = ""
    For Each nbp In ActiveDocument.Footnotes
        I = nbp.Index
        Set para = ActiveDocument.Footnotes(I).Range
        para.InsertAfter "</P></div></NBP>"
        para.Select
        Selection.EndOf wdParagraph, wdMove
        Selection.MoveLeft wdCharacter, 1
        Selection.StartOf wdParagraph, wdMove
        Selection.MoveLeft wdCharacter, 1, True
        If Selection.Text = Chr(13) And Format(Selection.Footnotes.Item(1).Index) = I Then Selection.TypeBackspace
        If Format(Selection.Footnotes.Item(1).Index) <> I Then Selection.MoveRight
        para.Select
        Selection.MoveLeft
        If Format(Selection.Footnotes.Item(1).Index) < 10 Then
            numnote = "00" + Format(Selection.Footnotes.Item(1).Index)
            ElseIf Format(Selection.Footnotes.Item(1).Index) < 100 Then
                numnote = "0" + Format(Selection.Footnotes.Item(1).Index)
                Else: numnote = Format(Selection.Footnotes.Item(1).Index)
        End If
        Selection.TypeText Text:="<NBP ID=""" + revue + "NBP" + numnote + """><div class=""Nbp""><P><B>" + Format(Selection.Footnotes.Item(1).Index) + ". &nbsp;</B>"
        Selection.Delete wdCharacter, 2
        Selection.EndOf wdParagraph, wdMove
        vide = False
        Do While Format(Selection.Footnotes.Item(1).Index) = I
            If vide = False Then
                Selection.MoveLeft
                Selection.TypeText Text:="</P>"
                Selection.EndOf wdParagraph, wdMove
            End If
            If Selection.Words(1) = Chr(13) Then
                Selection.TypeBackspace
                vide = True
            Else
                Selection.TypeText Text:="<P>"
                Selection.EndOf wdParagraph, wdMove
                vide = False
            End If
            Selection.MoveLeft wdCharacter, 1, True
            If Selection.Text = ">" And vide = False Then Exit Do
            Selection.EndOf wdParagraph, wdMove
        Loop
        Selection.MoveLeft
        para.Select
        txtXMLnote = txtXMLnote + Selection.Text
        para.Delete
    Next nbp
End If
dewcaro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2010, 17h40   #4
Responsable Word

 
Avatar de Heureux-oli
 
Homme Olivier Lebeau
Contrôleur d'industrie
Inscription : février 2006
Messages : 17 317
Détails du profil
Informations personnelles :
Nom : Homme Olivier Lebeau
Âge : 47
Localisation : Belgique

Informations professionnelles :
Activité : Contrôleur d'industrie
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : février 2006
Messages : 17 317
Points : 29 214
Points : 29 214
Salut,

Pourquoi ne pas compter les paragraphes d'une note de fin ?
Tu sauras où se trouve la fin.
On peut aussi la sélectionner et faire un ColapseEnd
__________________
J'ai pas encore de décodeur, alors, postez en clair ! Comment mettre une balise de code ?
Débutez en VBA

Mes articles


Dans un MP, vous pouvez me dire que je suis beau, ... mais si c'est une question technique je ne la lis pas ! Vous êtes prévenus !
Heureux-oli est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2010, 15h32   #5
Membre du Club
 
Femme
Inscription : décembre 2010
Messages : 21
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France, Nord (Nord Pas de Calais)

Informations forums :
Inscription : décembre 2010
Messages : 21
Points : 42
Points : 42
C'est sûr que si je pouvais compter le nombre de paragraphe de mes notes, cela serait beaucoup plus simple. Mais je n'ai pas trouvé comment faire. C'est possible?
Cela ne me dérange pas de devoir convertir mes notes de bas de page en notes de fin.
dewcaro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2010, 16h42   #6
Responsable Word

 
Avatar de Heureux-oli
 
Homme Olivier Lebeau
Contrôleur d'industrie
Inscription : février 2006
Messages : 17 317
Détails du profil
Informations personnelles :
Nom : Homme Olivier Lebeau
Âge : 47
Localisation : Belgique

Informations professionnelles :
Activité : Contrôleur d'industrie
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : février 2006
Messages : 17 317
Points : 29 214
Points : 29 214
Salut,

Jette un oeil à ce bout de code :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
Sub bTestNoteBaseDePage()
 
 
Dim myNBP As Footnote
 
For Each myNBP In ActiveDocument.Footnotes
myNBP.Range.Select
 
Debug.Print Selection.Paragraphs.Count
 
Next myNBP
 
End Sub
__________________
J'ai pas encore de décodeur, alors, postez en clair ! Comment mettre une balise de code ?
Débutez en VBA

Mes articles


Dans un MP, vous pouvez me dire que je suis beau, ... mais si c'est une question technique je ne la lis pas ! Vous êtes prévenus !
Heureux-oli est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 20/12/2010, 10h29   #7
Membre du Club
 
Femme
Inscription : décembre 2010
Messages : 21
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France, Nord (Nord Pas de Calais)

Informations forums :
Inscription : décembre 2010
Messages : 21
Points : 42
Points : 42
Ah ben oui... C'était tellement évident que je n'y avais pas pensé!!! Pourquoi faire simple quand on peut faire compliqué, telle est ma devise...
Effectivement, c'est mieux!
Voici ce que cela donne au cas où cela pourrait aider quelqu'un :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
Function Struct_Notes(revue As String) As String
Dim txtXMLnote As String
Dim i As Integer
Dim y As Integer
Dim para As Range
Dim nbp As Footnote
Dim numnote As String
Dim vide As Boolean
Dim nbmax As Integer
 
 
    Application.StatusBar = "structuration des notes"
    txtXMLnote = ""
    nbmax = ActiveDocument.Footnotes.Count
    For Each nbp In ActiveDocument.Footnotes
 
        i = nbp.Index
        Set para = ActiveDocument.Footnotes(i).Range
        para.Select
        num = Selection.Paragraphs.Count
        Selection.MoveLeft
        If Format(Selection.Footnotes.Item(1).Index) < 10 Then
            numnote = "00" + Format(Selection.Footnotes.Item(1).Index)
            ElseIf Format(Selection.Footnotes.Item(1).Index) < 100 Then
                numnote = "0" + Format(Selection.Footnotes.Item(1).Index)
                Else: numnote = Format(Selection.Footnotes.Item(1).Index)
        End If
        Selection.TypeText Text:="<NBP ID=""" + revue + "NBP" + numnote + """><div class=""Nbp""><P><B>" + Format(Selection.Footnotes.Item(1).Index) + ".&nbsp;</B>"
        Selection.Delete wdCharacter, 2
        Selection.EndOf wdParagraph, wdMove
        y = 1
        vide = False
        Do While Format(Selection.Footnotes.Item(1).Index) = i And y <= num
               If Selection.Words(1) = Chr(13) Then
                    Selection.MoveLeft wdCharacter, 1, True
                    If Selection.Text = Chr(13) Then
                        Selection.TypeBackspace
                        Selection.MoveRight
                        vide = True
                    Else
                        Selection.MoveRight
                        If i = nbmax Then Exit Do
                    End If
 
                Else
                        Selection.MoveLeft
                        Selection.TypeText Text:="</P>"
                        Selection.EndOf wdParagraph, wdMove
 
                        Selection.TypeBackspace
                        Selection.TypeText Text:="<P>"
                        Selection.EndOf wdParagraph, wdMove
                        vide = False
 
                End If
            y = y + 1
        Loop
        If Format(Selection.Footnotes.Item(1).Index) <> i Then Selection.MoveLeft
        Selection.TypeText Text:="</P></div></NBP>"
        Set para = ActiveDocument.Footnotes(i).Range
        para.Select
        txtXMLnote = txtXMLnote + Selection.Text + Chr(13)
        para.Delete
    Next nbp
 
   Struct_Notes = txtXMLnote
Merci pour tout!
dewcaro est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h57.


 
 
 
 
Partenaires

Hébergement Web