Création de signets dynamiques et problème de placement

Signaler
Messages postés
6
Date d'inscription
mercredi 5 octobre 2011
Statut
Membre
Dernière intervention
11 octobre 2011
-
Messages postés
6
Date d'inscription
mercredi 5 octobre 2011
Statut
Membre
Dernière intervention
11 octobre 2011
-
Bonjour,

je voudrais créer un document Word qui permettent à des parents de remplir des fiches d'urgence pour l'école. Le Userform demande d'abord des informations aux parents qui se retrouveront sur les fiches de tous leurs enfants puis passe à un second Userform pour entrer les informations à propos des enfants.

Une fois les deux Userforms complétés, il faut se baser sur le document de départ, le dupliquer en autant de fois qu'il y a d'enfants, placer les bookmarks puis les remplir avec les infos.

Ca donne quelque chose comme ça: (je coupe le passage où je récupère le nombre d'enfants d'une famille, désigné par l'integer nbenfants

    'Créer le nouveau document si nécessaire
    If nbenfants > 1 Then
            'copier tout le document
            ThisDocument.Range(0, 0).Select
            Selection.WholeStory
            Selection.Copy
            'se mettre à la fin du document
            Selection.EndKey wdStory

            For i = 2 To nbenfants
               'sauter une page
                Selection.InsertBreak Type:=wdPageBreak
                'coller tout le document
                Selection.Paste
            Next
    End If


    'Créer les signets
    ThisDocument.Range(0, 0).Select
    For i = 1 To nbenfants
        PlacerSignet "Classe", "classe", i
        Selection.MoveDown Unit:=wdBreakPage, Count:=1
    Next


Public Sub PlacerSignet(emplacement As String, nomsignet As String, i As Integer)
     
    Selection.Find.ClearFormatting
    With Selection.Find
        .Text = emplacement
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchKashida = False
        .MatchDiacritics = False
        .MatchAlefHamza = False
        .MatchControl = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute
    
    With ThisDocument.Bookmarks
        .Add Range:=Selection.Range, Name:=(nomsignet & CStr(i))
        .DefaultSorting = wdSortByName
        .ShowHidden = False
    End With
    
    MsgBox "placement signet " & nomsignet & CStr(i)
    
End Sub  


Les deux problèmes que j'ai:
- tout d'abord, je n'arrive pas à accéder à la page suivante quand je veux remplir les signets. Je sais qu'il n'accepte pas le wdPageBreak mais je n'ai pas réussi à savoir comment faire.

- les signets semblent être placés en tout début de document. Comme si la recherche n'avait pas déplacé le curseur au bon endroit et donc comme si l'ajout de signet se faisait toujours au début du document.

Si quelqu'un a une idée, je suis très preneur.

En vous remerciant d'avance,
Mathieu

P.S. Existe-t-il un livre avec toutes les références VB ? Par exemple, où je pourrais trouver tout ce que je peux faire avec l'objet Selection et en français compréhensible. J'ai cherché dans les bouquins O'Reilly, mais ça reste de la programmation générale et pas spécialement pour Word.

4 réponses

Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
81
Salut

Bizarre.
Le code suivant, copie du tien, fonctionne très bien
    ThisDocument.Range(0, 0).Select
    Selection.WholeStory
    Selection.Copy
    Selection.EndKey wdStory
    Selection.InsertBreak Type:=wdPageBreak
    Selection.Paste

L'objet Selection est à bannir et mieux vaudrait travailler avec les objets car, si pendant l'exécution de la macro, l'utilisateur fait un simple clic dans le document, Selection est modifié et ta macro va partir en banane.
Pour corriger sans avoir à tout refaire, capture la Selection :
Private maSelection As Selection
puis, au début de ta macro
Set maSelection = ActiveDocument.Application.Selection
Ensuite, dans toutes tes lignes, au lieu de t'adresser à Selection, utilise maSelection, exemple :
    Dim maSelection As Selection
    Set maSelection = ActiveDocument.Application.Selection
    With maSelection
        '.Range.Select
        .WholeStory
        .Copy
        .EndKey wdStory
        .InsertBreak Type:=wdPageBreak
        .Paste
    End With

Quant à l'aide sur l'objet Selection : tout est décrit dans l'aide de Word

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
6
Date d'inscription
mercredi 5 octobre 2011
Statut
Membre
Dernière intervention
11 octobre 2011

merci pour la réponse, j'essaierai pour l'histoire de Selection demain (quand je serai devant mon ordi au boulot).

Par contre, mon souci de wdBreakPage je l'ai plutôt ici: Selection.MoveDown Unit:=wdBreakPage, Count:=1

Parce que tout ce qui est déplacement de curseur n'accepte pas wdBreakPage. Du coup, je ne sais pas comment atteindre facilement le saut de page.
Messages postés
6
Date d'inscription
mercredi 5 octobre 2011
Statut
Membre
Dernière intervention
11 octobre 2011

Ah damned, je n'avais pas bien lu la réponse. En fait, la première partie de code fonctionne bien, c'était juste pour donner le contexte. :)

Mes soucis sont bien dans les deuxième et troisième parties du code.

(P.S. Peut-on éditer ses messages ?)
Messages postés
6
Date d'inscription
mercredi 5 octobre 2011
Statut
Membre
Dernière intervention
11 octobre 2011

Alors j'ai trouvé la solution à mes problèmes.

Pour le souci de fin de page, j'ai tout bêtement repris la ligne: Selection.GoTo What:=wdGoToPage, Which:=i
(pas besoin de chercher un éventuel wdBreakPage dans le code).

Pour l'histoire des signets, il est arrivé quelque chose de très étrange. Je bossais sur un modèle Word avec macro. En passant en document (.doc et donc plus .dot), tout est rentré dans l'ordre.

Mais d'autres soucis sont arrivés. :)