[Word 2010] Copier coller dans un tableau en VBA

Résolu/Fermé
iratihel Messages postés 39 Date d'inscription jeudi 17 janvier 2013 Statut Membre Dernière intervention 24 avril 2013 - 15 mars 2013 à 15:11
iratihel Messages postés 39 Date d'inscription jeudi 17 janvier 2013 Statut Membre Dernière intervention 24 avril 2013 - 19 mars 2013 à 10:08
Bonjour,

J'ai un tableau en dernière page de mon document qui contient l'historique des différentes versions du document. Il se présente comme ceci :

Version | Date | Auteur | Relecteur | Commentaires

A chaque modification du contenu du texte, l'utilisateur incrémente la version et rajoute dans les commentaires ce qui a changé par rapport à la version antérieure. Chaque colonne contient des signets (sauf commentaires).

Ce que je cherche à faire à chaque nouvelle version :
- L'utilisateur clique sur un bouton en début du document
- Ce bouton insère une ligne sous la ligne 2 du tableau,
- il copie la ligne 2
- il recopie uniquement le texte de la ligne 2 vers la ligne 3.

Pour ce faire j'utilise ce petit code :

Private Sub CommandButton1_Click()
Dim oTbl As Table
ActiveDocument.Bookmarks("Tableau_V").Range.Select
Set oTbl = Selection.Tables(1)

 oTbl.Rows(3).Range.Select
 Selection.InsertRowsAbove 1

 oTbl.Cell(2, 1).Range.Copy
 oTbl.Cell(3, 1).Range.PasteAndFormat wdFormatPlainText
 oTbl.Cell(2, 2).Range.Copy
 oTbl.Cell(3, 2).Range.PasteAndFormat wdFormatPlainText
 oTbl.Cell(2, 3).Range.Copy
 oTbl.Cell(3, 3).Range.PasteAndFormat wdFormatPlainText
 oTbl.Cell(2, 4).Range.Copy
 oTbl.Cell(3, 4).Range.PasteAndFormat wdFormatPlainText
 oTbl.Cell(2, 5).Range.Copy
 oTbl.Cell(3, 5).Range.PasteAndFormat wdFormatPlainText
 oTbl.Cell(2, 6).Range.Copy
 oTbl.Cell(3, 6).Range.PasteAndFormat wdFormatPlainText
  
End Sub


Les actions sont réalisées cellule par cellule car quand j'ai essayé de faire directement un copier coller de la ligne, le code me recopie juste les 2 1ères cellules sur toute la longueur de la ligne. De plius, quand je teste ma macro, le collage rajoute automatiquement un petit carré après le texte.
Comment faire pour supprimer ce caractère? Sinon y a t il un moyen de faire un cpier de la ligne et un collage des valeurs directement?

Merci d'avance de votre aide
A voir également:

10 réponses

Le Pingou Messages postés 12041 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 22 avril 2024 1 426
15 mars 2013 à 23:01
Bonjour,
Peut-être une piste par la : https://vb.developpez.com/faqvba/?rechercher=wORD+%26+TABLEAU

0
iratihel Messages postés 39 Date d'inscription jeudi 17 janvier 2013 Statut Membre Dernière intervention 24 avril 2013 5
18 mars 2013 à 09:36
Bonjour et merci de vous pencher sur le sujet.

Le Pingou, merci pour ton lien, mais je n'ai rien trouvé qui puisse me faire avancer vers une solution.

M@rina, j'ai des signets et des champs auto sur la 2nde ligne du tableau et je souhaite conserver uniquement le texte et non pas les signets. Je dois recopier la ligne 2 vers la ligne 3 avec le contenu des signets mais pas les liens des signets. Et par la suite, il faut qu'à chaque modification du document, je puisse conserver l'historique des modifs. C'est pour ça que je ne fais pas un simple copier/coller de la ligne 2 vers la 3, sinon, à chaque activation de la macro, la ligne 3 va être écrasée et je vais perdre mon historique. D'où l'insertion d'une ligne entre les lignes 2 et 3 avant le collage.
Ensuite, je colle cellule par cellule, car le collage spécial du texte avec wdPasteText ou PasteAndFormat me recopie les 2 premières cellules sur toute la ligne au lieu de me recopier les bonnes valeurs:

Version | Date | Auteur | Relecteur | Commentaires
1 |10/03| Moi | Lui | Création

me donnera en collant la ligne directement avec une méthode wdPasteText ou PasteAndFormat:

Version | Date | Auteur | Relecteur | Commentaires
1 |10/03| 1 | 10/03 | 1

Donc, avec le collage cellule par cellule, j'arrive à obtenir ce que je souhaite, mais word me colle un petit carré après le texte et je n'arrive pas à trouver comment le supprimer...
0
iratihel Messages postés 39 Date d'inscription jeudi 17 janvier 2013 Statut Membre Dernière intervention 24 avril 2013 5
18 mars 2013 à 12:19
J'ai pensé à une autre solution mais je ne sais pas du tout comment l'intégrer.

Je lance ma macro avec le code du 1er post. J'obtiens donc le résultat que je souhaite mais avec un caractère suplémentaire, le petit "carré".

Pour l'enlever, je pensais utiliser les fonctions Left et Len. Comme ça je récupère le nombre de caractères de la chaine, je copie la chaine -1 caractère et je remplace le contenu de ma cellule. Mais le soucis, c'est que je ne sais pas utiliser ces 2 fonctions...

J'ai trouvé des exemples, mais je n'arrive pas à les exploiter. J'ai tenté avec le code ci-dessous, mais je ne suis pas certaine que j'utilise correctement ces fonctions, j'ai même l'impression de faire un peu n'importe quoi :

Private Sub Version_New1_Click()
Dim oTbl As Table
ActiveDocument.Bookmarks("Tableau_V").Range.Select
Set oTbl = Selection.Tables(1)

 oTbl.Rows(3).Range.Select
 Selection.InsertRowsAbove 1

 oTbl.Cell(2, 1).Range.Copy
 oTbl.Cell(3, 1).Range.PasteAndFormat wdFormatPlainText
 oTbl.Cell(3, 1).Range.Select
With Selection
Dim nom As String
Dim C1 As Range
Set C1 = oTbl.Cell(3, 1).Range
nom = Left(C1.Text, Len(C1) - 1).Copy
oTbl.Cell(3, 1).Range.Paste
End With
And Sub


J'ai une erreur 424. Mais je sais pas trop comment la résoudre.

Et qui plus est, j'ai 6 cellules à traiter... ça risque de faire très lourd à gérer.

Quelqu'un aurait une petite idée à me suggérer? D'avance merci.
0
Le Pingou Messages postés 12041 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 22 avril 2024 1 426
18 mars 2013 à 15:18
Bonjour,
Pouvez-vous mettre un document (y compris la macro) sur https://www.cjoint.com/ et poster le lien.

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
iratihel Messages postés 39 Date d'inscription jeudi 17 janvier 2013 Statut Membre Dernière intervention 24 avril 2013 5
18 mars 2013 à 16:22
Bonjour,

Après plusieurs essais en tout genre infructeurx avec la fonction NetText, j'ai abandonné l'idée de faire les choses dans les règles de l'art... Et je me suis rabattue sur quelque chose de beaucoup plus simple, en tout cas abordable à mon niveau de connaissances en VBA.

Mon tableau contient des signets et dans ma macro, j'appelle mon tableau via un signet. Je me suis donc dit qu'en recopiant directement le signet qui m'intéresse, j'arriverai peut-être à le coller sans que le carré s'incruste. Et ma foi, ça a fonctionné!!

Private Sub Version_New1_Click()

Dim oTbl As Table
ActiveDocument.Bookmarks("Tableau_V").Range.Select
Set oTbl = Selection.Tables(1)

 oTbl.Rows(3).Range.Select
 Selection.InsertRowsAbove 1
 
 ' Sauvegarde la version
 ActiveDocument.Bookmarks("Version").Range.Select
 Selection.Copy
 oTbl.Cell(3, 1).Range.PasteAndFormat wdFormatPlainText

 ' Sauvegarde la date d'enregistrement
 ActiveDocument.Bookmarks("DateSave").Range.Select
 Selection.Copy
 oTbl.Cell(3, 2).Range.PasteAndFormat wdFormatPlainText
 
 ' Sauvegarde l'auteur
 ActiveDocument.Bookmarks("Auteur").Range.Select
 Selection.Copy
 oTbl.Cell(3, 3).Range.PasteAndFormat wdFormatPlainText
 
 'Sauvegarde le vérificateur
 ActiveDocument.Bookmarks("Verif").Range.Select
 Selection.Copy
 oTbl.Cell(3, 4).Range.PasteAndFormat wdFormatPlainText
 
 'Sauvegarde l'approbateur
 ActiveDocument.Bookmarks("Appro").Range.Select
 Selection.Copy
 oTbl.Cell(3, 5).Range.PasteAndFormat wdFormatPlainText
 
 'Sauvegarde les commentaires
 oTbl.Cell(2, 6).Range.Copy
 oTbl.Cell(3, 6).Range.PasteAndFormat wdFormatPlainText

End Sub


Je vous remercie en tout cas pour tous vos conseils et toute l'aide apportée. Je mets le fichier en lien si vous avez envie de voir comment fonctionnent les codes que j'ai testé, mais ils ne sont plus présents que sur le forum... j'ai fait un brin de nettoyage sur le fichier!
0
iratihel Messages postés 39 Date d'inscription jeudi 17 janvier 2013 Statut Membre Dernière intervention 24 avril 2013 5
18 mars 2013 à 16:25
J'ai oublié de mettre le lien vers le fichier... quelle tête de linote!!

[url]https://www.cjoint.com/?3CsqykSUaVZ[/url]
0
Le Pingou Messages postés 12041 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 22 avril 2024 1 426
18 mars 2013 à 17:29
Bonjour,
Merci infiniment pour la mise à disposition du fichier.

0
Le Pingou Messages postés 12041 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 22 avril 2024 1 426
18 mars 2013 à 22:48
Bonjour,
Superbe application qui m'a permis d'étendre mes connaissance.
Il me semble que vous pourriez utiliser la proposition de m@rina ( salutations) adaptée à votre application ( pour autant que j'ai compris dans le bon sens... !) :
Sub versio_marina()
Dim ligne
Set ligne = ActiveDocument.Bookmarks("Tableau_V").Range.Tables(1).Rows(2)
ligne.Select
With Selection
.Copy
.PasteAndFormat (wdTableInsertAsRows)
End With
End Sub


0
m@rina Messages postés 20064 Date d'inscription mardi 12 juin 2007 Statut Contributeur Dernière intervention 23 avril 2024 11 269
19 mars 2013 à 00:06
Bonjour iratihel, salut Le Pingou ;)

iratihel, pourquoi poses-tu une question ? tu fais les réponses toi-même.. Et de toute évidence tu ne tiens pas compte de nos réponses...

Tu dis "'c'est pour ça que je ne fais pas un simple copier/coller de la ligne 2 vers la 3, sinon, à chaque activation de la macro, la ligne 3 va être écrasée et je vais perdre mon historique"

Ma macro n'a jamais écrasé de ligne mais ne fait que copier la ligne 2 du dernier tableau et l'insérer à la suite dans le tableau... C'est en tous les cas ce que j'ai indiqué, et de toute évidence, tu n'as donc pas testé.

Sinon, je te le dis en passant, tes macros ne sont pas vraiment faites dans les règles de l'art... Et puisque le but est de recopier à un autre endroit des données provenant de champs (ce qui n'était pas explicite), il eut été plus simple d'insérer une ligne vierge dans le tableau, puis dans chaque cellule de récupérer la valeur du champ sans conserver le lien. Les allers-retours de sélection-copier-coller étant inutiles.

m@rina
0
iratihel Messages postés 39 Date d'inscription jeudi 17 janvier 2013 Statut Membre Dernière intervention 24 avril 2013 5
19 mars 2013 à 10:08
Le Pingou, heureuse que mon bidouillage t'ait été utile.

M@rina, j'ai bien indiqué que la ligne à copier contenait des signets et que je ne souhaitait conserver que le texte des signets et non pas les liens. Mais peut-être n'ai-je pas employé le langage adéquat...
J'ai testé le code que tu m'as indiqué dans ton 1er post et l'ai modifié pour qu'il corresponde au bon tableau, mais à chaque fois que je l'activais, il me copiait bien la ligne, me la collait à l'identique sur la ligne du dessous (avec les liens des signets) et quand je la relançais, elle m'écrasait la ligne que je venais de coller.
Je ne me permettrai pas, compte tenu de mes connaissances quasi nulle en la matière, de faire des remarques sans avoir testé au préalable les solutions qu'on me propose.
Soit dit en passant, je ne vois pas le message auquel Le Pingou fait référence avec le code adapté au cas de mon tableau et qui lui fonctionne à la perfection en insérant correctement la ligne à chaque lancement de la macro. Mais qui garde les liens vers les signets...
Et comme je n'aime pas rester les bras ballant en attendant bien gentiment qu'une âme charitable m'apporte une solution sur un plateau doré, je continue de chercher une issue au problème que je pose. Désolée si ça donne l'impression que je fais les questions et les réponses... J'expose juste le résultat de mes recherches en espérant avoir quelques commentaires qui relance une piste vers la meilleure solution.
Et pour finir, oui, je reconnais volontiers que mon code est loin d'être élégant, formalisé et optimisé, mais il a le mérite de faire ce que je souhaite qu'il fasse avec le peu de connaissances que je possède en VB.

En tout cas, je vous réitère mes remerciements pour toute l'aide apportée dans la réalisation de mon projet et qui m'a permis d'arriver à une solution, bancale certes, mais fonctionnelle. :-)
0
m@rina Messages postés 20064 Date d'inscription mardi 12 juin 2007 Statut Contributeur Dernière intervention 23 avril 2024 11 269
16 mars 2013 à 14:41
Bonjour,

Je n'ai pas bien compris ta phrase "il recopie uniquement le texte de la ligne 2 vers la ligne 3."

Cette macro ajoute une nouvelle ligne identique à la ligne 2.

Sub tb()
Dim nbtb, ligne
nbtb = ActiveDocument.Tables.Count
Set ligne = ActiveDocument.Tables(nbtb).Rows(2)
ligne.Select
With Selection
.Copy
.PasteAndFormat (wdTableInsertAsRows)
End With
End Sub

-1