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 27/12/2006, 13h39   #1
Invité de passage
 
Inscription : décembre 2006
Messages : 4
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 4
Points : 1
Points : 1
Par défaut VBA Word - Problèmes de signets

Bonjour,

J'essaie de créer un formulaire dans word à l'aide de signets. J'arrive grace aux lignes de commandes suivantes à remplir automatiquement le document word en confirmant à l'aide d'un commandbutton le texte de 2 text box (nom et Prénom):

Code :
1
2
3
4
5
6
With ActiveDocument
.Bookmarks("nom").Range _
.InsertBefore TextBox1
.Bookmarks("Prénom").Range _
.InsertBefore TextBox2
End With
Donc pas trop de souci de ce point de vu là. Le problème se corse en cas d'erreur : je voudrais avoir la possibilité de retourner dans le formulaire (userform) et modifier les données déjà existantes mais là... je sèche, j'ai chercher de partout (enfin sans doute pas assez me direz vous) mais je ne trouve rien. Tout ce que j'ai vu de partout, c'est qu'une fois qu'on a confirmé, c'est fini, c'est dans la boite et en relancant la macro je ne ferai que rajouter des données à celles existantes mais sans les remplacer...

J'suis un peu dépassé. Avez vous une solution ?

Merci beaucoup.

Milapyl
Milapyl est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/12/2006, 17h33   #2
Membre du Club
 
Inscription : février 2003
Messages : 95
Détails du profil
Informations personnelles :
Âge : 31
Localisation : Etats-Unis

Informations forums :
Inscription : février 2003
Messages : 95
Points : 54
Points : 54
Bonjour.

Ajoute cela dans l'événement Initialize de ton UserForm.
Code :
1
2
3
4
5
6
7
8
 
    With ActiveDocument
        .Bookmarks("Nom").Select
        If InStr(.Range(Start:=Selection.Start), Chr(13)) <> 0 Then
            TextBox1.Text = Mid(.Range(Start:=Selection.Start), 1, InStr(.Range(Start:=Selection.Start), Chr(13)) - 1)
            .Range(Selection.Start, Selection.Start + InStr(.Range(Start:=Selection.Start), Chr(13)) - 1).Delete
        End If
    End With
C'est à adapter en fonction de tes besoins.
Au lancement on récupère le texte du signet puis on le supprime. A l'insertion on a que le nouveau texte.

Cordialement,

Mathieu Driesbach.
__________________
Un verre vide se plaint, un verre plein se vide ...
mdriesbach est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2006, 11h49   #3
Invité de passage
 
Inscription : décembre 2006
Messages : 4
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 4
Points : 1
Points : 1
Par défaut Problème persistant

Bonjour,

Merci beaucoup pour votre réponse aussi rapide et de votre disponibilité.
Concernant votre réponse, en fait, j'avais simplifié le problème en ne mettant que nom prénom mais j'ai des champs plus compliqués et qui prévoient l'utilisation d'espaces or votre réponse (que j'aurai jamais trouvé tout seul d'ailleurs et merci...), si j'ai bien compris, prévoit l'effacement des données d'un signet jusqu'au 1er espace rencontré. Ainsi pour une adresse par exemple(25 rue de rien), seul le numéro 25 sera effacé et le reste de l'adresse s'affichera toujours.

Si vous avez un autre moyen pour contourner le problème, je suis preneur...
et si j'ai mal compris le code, n'hésitez pas à me le signaler...
Merci encore

Milapyl
Milapyl est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2006, 13h16   #4
Membre du Club
 
Inscription : février 2003
Messages : 95
Détails du profil
Informations personnelles :
Âge : 31
Localisation : Etats-Unis

Informations forums :
Inscription : février 2003
Messages : 95
Points : 54
Points : 54
Bonjour.

En me relisant, je m'apperçois que le code n'était pas très clair.
Je l'ai amélioré et commenté :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Dim debut As Long, fin As Long
 
With ActiveDocument
 
        'Sélection du signet
        .Bookmarks("Nom").Select
 
        'Position de début et de fin de la chaîne
        debut=Selection.Start
        fin=InStr(.Range(debut), Chr(13)) 'Remplacer Chr(13) par le caractère de séparation
 
        'Si le caractère de séparation est présent, alors on récupère et supprime jusqu'à celui-ci
        If fin <> 0 Then
            TextBox1.Text = Mid(.Range(debut), 1, fin - 1)
            .Range(debut, debut + fin - 1).Delete
        Else
        'Sinon on récupère et supprime jusqu'à la fin
            TextBox1.Text = .Range(debut)
            .Range(debut).Delete
        End If
 
End With
Le caractère de séparation est ici Chr(13) pour la fin de la ligne (et non un espace). On peut le remplacer par ce que l'on veut, y compris une chaîne de caractères donnée.
Mais c'est vrai que ce code reste limité par l'utilisation d'un caractère séparateur.
Il existe peut-être un moyen d'affecter un texte au signet et le gérer, mais alors je ne sais pas comment ...
Peut-être une recherche dans la FAQ et les tutos de ce site t'en apprendrait plus.

Cordialement,

Mathieu Driesbach.
__________________
Un verre vide se plaint, un verre plein se vide ...
mdriesbach est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2006, 14h01   #5
Invité de passage
 
Inscription : décembre 2006
Messages : 4
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 4
Points : 1
Points : 1
Par défaut effacement texte affecté à un signet

Je te remercie pour la précision... En fait le souci perdure avec l'adresse car il faudrait que dans un même textbox, je mette toute l'adresse y compris les retours à la ligne pour le code postal, etc. donc dans ce cas, le Chr 13 n'est plus efficace pour sélectionnée tout le texte voulu et j'ai beau cherché, je ne vois pas d'autres éléments séparateurs qui pourrait faire comprendre qu'on est à la fin du texte affecté au signet. J'ai fait des recherches dans cette voie mais j'ai rien trouvé.

A l'inverse j'ai lu qu'on pouvait non pas définir le texte affecté au signet mais affecter un signet à un texte. mais pour ca ca nécessite que je le sélectionne et donc plus d'automatisation !!

Je ne sais franchement pas comment faire...

Si tu as une autre idée, n'hésite pas sinon tant pis, merci beaucoup pour l'aide déjà apportée...

Milapyl
Milapyl est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2007, 00h05   #6
Inactif
 
Avatar de ouskel'n'or
 
Inscription : février 2005
Messages : 12 466
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 12 466
Points : 11 930
Points : 11 930
Désolé de répondre si tard, je n'avais pas vu ton post.
Voui, j'ai une idée. Ta dernière réflexion est exacte, pour retrouver un texte possédant un signet, c'est le texte lui-même qui doit recevoir le signet
Dans ton code, il manque la sélection du texte que tu insères. Donc, cette longueur est = à Len(Textboxn)
Ce que tu fais, tu
1 - mesures Textbox,
2 - recherches le signet
3 - sélectionnes le texte en arrière
4 - renommes le signet
Ce qui donne un truc comme ça
Code :
1
2
3
4
5
6
7
8
9
    With ActiveDocument
        'TextBox1 = "Coucou l'oiseau" 'j'en avais besoin pour tester
        Longueur = Len(TextBox1)
        .Bookmarks("nom").Select
        Selection.TypeText Text:=TextBox1
        Selection.MoveLeft Unit:=wdCharacter, Count:=Longueur, Extend:=wdExtend
        .Bookmarks.Add Range:=Selection.Range, Name:="Nom"
        'idem pour le second
    End With
Et tu peux remplacer "Coucou l'oiseau" par "Coucou le merle" le coup d'après puisque tu sélectionnes la phrase à remplacer... Youpi !
A+
ouskel'n'or est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2007, 09h39   #7
Invité de passage
 
Inscription : décembre 2006
Messages : 4
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 4
Points : 1
Points : 1
Par défaut Merci pour tout

Merci pour la réponse.

En fait j'avais trouver mais en trichant un peu !! J'ai affecté un signet à un espace dans mon document word, j'ai donc eu un signet entre crochet et non plus un seul crochet. A partir de ce moment, le fait de sélectionner le signet me sélectionnait du même coup tout le texte en même temps. Je n'avais plus qu'à le faire effacer et recréer le signet avec son espace aussitôt (puisqu'il s'efface avec le texte). et voilà !

C'est sur que ta méthode me fait un peu moins de lignes de programmation !

Merci d'avoir répondu.

Milapyl
Milapyl 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 00h17.


 
 
 
 
Partenaires

Hébergement Web