IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Word Discussion :

Sélectionner et déplacer une ligne dans un tableau


Sujet :

VBA Word

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 21
    Points : 15
    Points
    15
    Par défaut Sélectionner et déplacer une ligne dans un tableau
    Bonjour,

    Encore un petit soucis, mais cette fois-ci c'est pour un tableau...

    Je cherche à sélectionner la 2ème ligne d'un tableau défini, la copier et coller uniquement le contenu 1 ligne en dessous.

    Je pensais utiliser

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WordDocument.Tables(5).Rows(2).Range.Copy
    mais d'autres tableaux pourront être rajoutés dans mon document, le n° de table risque de changer.

    J'ai donc défini un signet sur mon tableau mais quand j'utilise le code pour appeler le signet je sélectionne la totalité de la table et non juste la ligne qui m'intéresse

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Selection.GoTo What:=wdGoToBookmark, Name:="Tableau_V"
    J'ai essayé de "bidouiller" avec l'aide de Word (F1) et différentes informations glanées sur le net mais je n'ai obtenu que des erreurs de compilation... Je n'emploie certainement pas les bons arguments au bon endroit. Je reconnais volontiers que je ne sais pas trop quoi placer où.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ActiveDocument.Bookmarks("Tableau_V").Selection.Rows (2)
    ActiveDocument.Bookmarks("Tableau_V").Range.Rows (2)
    Merci à celles et ceux qui voudront bien me donner quelques explications sur la marche à suivre.

  2. #2
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

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

    Informations forums :
    Inscription : Février 2006
    Messages : 21 087
    Points : 42 926
    Points
    42 926
    Par défaut
    Salut,

    Dans l'ordre, il faut sélectionner le tableau à l'aide de ton signet.
    Ton tableau est le premier de la sélection.
    Tu peux alors passer par un objet tableau, c'est plus facile.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Dim oTbl As Table
     
    ActiveDocument.Bookmarks("Tableau_V").Range.Select
     
    Set oTbl = Selection.Talbes(1)
     
    oTbl.Rows(2).Range.Copy
    oTbl.Rows(3).Range.Paste

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 21
    Points : 15
    Points
    15
    Par défaut
    Merci beaucoup Heureux-Oli !!!! Ca fonctionne à la perfection!

    Mais, et oui sinon ce serait trop beau, je me retrouve confrontée à un petit soucis de collage.

    Dans la ligne que je veux copier coller, j'ai des champs automatiques et des signets. Je voudrais coller uniquement le texte afin qu'il reste "en dur" à chaque nouvelle insertion de ligne.

    Or, avec Range.Paste les signets et champs sont recopiés. Donc si l'utilisateur modifie les valeurs de références et mets à jour les champs, je perds l'historique que je cherche à conserver.

    J'ai donc essayé avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    oTbl.Rows(3).Range.PasteSpecial DataType:=wdPasteText
    mais ça me colle les valeurs des 2 premières colonnes sur toute la ligne (cf. fichier attaché).

    J'ai utilisé l'enregistreur de macro pour voir comment word traitait le copier-coller et j'ai essayé avec PasteAndFormat et toutes les variables proposées par Word (wdFormat...) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    oTbl.Rows(3).Range.PasteAndFormat (wdFormatPlainText)
    Au mieux, je recopie ma ligne avec les signets et champs mais jamais les valeurs texte.

    Or, j'ai effectué un dernier test via l'enregistreur de macro, en copiant puis en choisissant dans les options de collage uniquement le texte. Quand je fais cette manipulation cellule par cellule, word me recopie bien les valeurs et non plus les signets et champs.

    Est-ce que je dois traiter la ligne de tableau cellule par cellule et non plus par ligne entière pour pouvoir conserver uniquement les valeurs des champs et signets ?

    Merci encore pour votre aide et désolée si mes demandes n'ont pas un grand intérêt pour des développeurs chevronnés.
    Images attachées Images attachées  

  4. #4
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

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

    Informations forums :
    Inscription : Février 2006
    Messages : 21 087
    Points : 42 926
    Points
    42 926
    Par défaut
    Salut,

    Peut-être en utilisant le résultat et pas le contenu de la cellule ?

    Le code sera un peu plus complexe, il faut contrôler le contenu de la section et prendre les actions nécessaires.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 21
    Points : 15
    Points
    15
    Par défaut
    Encore merci du temps que tu m'accordes Heureux-Oli.

    J'ai regardé ton code et essayais avec la variable Cell.

    Voilà ce que ça donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    Dim oTbl As Table
     
    ActiveDocument.Bookmarks("Tableau_V").Range.Select
     
    Set oTbl = Selection.Tables(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
    C'est long et certainement optimisable, mais bon je débute . J'obtiens bien le collage uniquement des valeurs. Mais il y a des petits carrés qui viennent s'ajouter au texte.

    J'ai vu dans un de tes articles qu'il existait une fontion NetText mais je n'ai trouvé aucune information sur comment l'utiliser sur l'aide word, et avec ce que j'ai trouvé sur le net, ça n'a pas l'air de fonctionner. Où faut il intégrer cette fonction dans le code?

    Autre chose, pour que le code ci-dessus fonctionne, il faut que la ligne 3 soit vide. Je voudrais donc insérer une ligne juste après la ligne2 mais que j'utilise :
    InsertRowsBelow 2 ou Row.Add (2)
    j'obtiens des erreurs de compilation.
    Est-ce que je dois bien utiliser ?
    Parce que le code obtenu par l'enregistreur est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Selection.InsertRowsBelow 2
    Du coup je pense qu'il doit y avoir un autre moyen d'insérer la ligne.

    Merci pour toutes vos explications.

  6. #6
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

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

    Informations forums :
    Inscription : Février 2006
    Messages : 21 087
    Points : 42 926
    Points
    42 926
    Par défaut
    Salut,

    Les petits carrés sont liés au fait que tu utilises le range complet de la cellule, ce range contient aussi les caractères de fin de cellule.

    Il y a une explication et une solution là : http://heureuxoli.developpez.com/off...t-tiroir/#L2-B

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 21
    Points : 15
    Points
    15
    Par défaut
    Merci Heureux-Oli.

    J'ai lu le tuto en long en large et en travers, mais je ne comprends pas vraiment comment utiliser le module contenant NetText ni où le placer.

    J'ai essayé de le placer à divers endroits mais je n'ai que des erreurs en retour.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NetText (oTbl.Cell(2, 1).Range.Copy)
    Le deboggeur me sélectionne .Copy et me retourne l'erreur : "Erreur de compilation : Fonction ou variable attendue"

    Et si je mets

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NetText (oTbl.Cell(3, 1).Range.PasteAndFormat wdFormatPlainText)
    j'obtiens "Erreur de compilation : Attendu séparateur de liste ou )"

    J'ai tenté aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     NetText = Left(stToBeCl, Len(stToBeCl) - 2).oTbl.Cell(2, 1).Range.Copy
    Et là c'est : "Erreur de compilation : Un appel de fonction dans la partie gauche de l'affectation doit renvoyer Variant ou Objet"

    Et pour finir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NetText = Left(stToBeCl, Len(stToBeCl) - 2).oTbl.Cell(3, 1).Range.PasteAndFormat wdFormatPlainText)
    "Erreur de compilation : Erreur de syntaxe"

    Honnêtement, même si je comprends la logique de NetText, je n'arrive pas à savoir quoi en faire...

  8. #8
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

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

    Informations forums :
    Inscription : Février 2006
    Messages : 21 087
    Points : 42 926
    Points
    42 926
    Par défaut
    Salut,

    J'ai peut-être trouvé une autre méthode, je fais une selection du range et que je copie la sélection, je n'ai pas ce petit "carré".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Selection.Cells(1).Range.Select
     
    Selection.Copy
     
    ActiveDocument.Tables(1).Cell(4, 1).Range.Paste

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 21
    Points : 15
    Points
    15
    Par défaut
    Hello et merci encore de ton aide.

    Le code ne fonctionne pas comme je cherche à le faire :

    Il copie la 1ère cellule de la 1ère ligne du bon tableau (qui se trouve être la ligne de titre donc pas la bonne...), puis il va la coller dans le 1er tableau du document, qui n'est pas le tableau sur lequel je travaille. J'ai testé en mettant un signet dans cette cellule qui est copiée/collée et le signet est recopié. Donc le texte ne sera pas conservé si un utilisateur modifie le texte cible du signet (je sais pas si je suis claire). J'ai aussi tenté en faisant un collage spécial du texte et le "carré" est toujours présent dans le résultat.

    Je vais creuser la question pour voir si je peux lui indiquer de copier la bonne ligne et de la coller au bon endroit. J'ai défini mon tableau par signet et je pense pouvoir l'identifier grace à ça pour le collage.

    Sinon, est-ce que tu saurais où je peux trouver plus d'informations sur NetText? L'aide de word ne connait pas et mes recherches sur google ne donnent pas grand chose sur son intégration dans le code.

    [edit] Je pense que tout vient de Paste. Si j'utilise juste Range.Paste, le collage se fait bien mais conserve le signet. Si j'utilise Range.PasteSpecial ou Range.PasteAndFormat, le collage prend bien juste le texte mais rajoute le "carré".

  10. #10
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

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

    Informations forums :
    Inscription : Février 2006
    Messages : 21 087
    Points : 42 926
    Points
    42 926
    Par défaut
    Salut,

    J'ai fait un test avec un tableau que j'avais sous la main.

    Dans cet exemple, je copie effectivement le contenu de la première cellule.

    Pour le NetText, c'est juste un fonction que j'ai faite et que j'utilise pour nettoyer le texte d'une cellule.
    Suite à ta remarque, je ne suis pas certain que ça va fonctionner dans ton cas avec un copier coller.
    NetText est utile pour traiter le texte contenu dans une cellule.

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 21
    Points : 15
    Points
    15
    Par défaut
    Bonjour, et merci Heureux-Oli pour toutes ces précisions.

    J'ai un peu plancher ce week end sur une solution avec NetText pour récupérer uniquement le texte de la cellule et non pas le Range.

    De plus, quand j'utilise la fonction NetText de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub Version_New1_Click()
     
    Dim oTbl As Table
    ActiveDocument.Bookmarks("Tableau_V").Range.Select
    Set oTbl = Selection.Tables(1)
    Dim myStrig As String
     
     oTbl.Rows(3).Range.Select
     Selection.InsertRowsAbove 1
     
     myString = netText(oTbl.Cell(2, 1).Range.Text)
     oTbl.Cell(3, 1).Range.PasteAndFormat wdFormatPlainText
    avec NetText défini :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Function netText(stToBeCl As String) As String
        'Récupération du début de la chaîne
        netText = Left(stToBeCl, Len(stToBeCl) - 2)
     
    End Function
    Ca me colle : "Func-tion netText(stToBeCl As String) As String 'Ré-cupé-ration du début de la chaîne netText = Left(stTo-BeCl, Len(stTo-BeCl) - 2)
    End Func-tion" dans la 1ère cellule de la ligne 3 de mon tableau. Je pense que j'ai du oublier quelque chose dans le code ou que je n'ai pas combiné les bons éléments...

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 21
    Points : 15
    Points
    15
    Par défaut
    Sinon,
    J'ai trouvé une autre solution en me servant des 2 neurones qui n'ont pas encore grillés.

    Pour accéder au tableau que je souhaite compléter, j'utilise un signet. Comme les champs de ce tableau sont aussi définis par signet, je me suis demandée si je ne pouvais pas m'en servir de la même façon.

    Et donc, je suis enfin parvenue à mes fins!!!!!

    Voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Private Sub Version_New1_Click()
     
    Dim oTbl As Table
    ActiveDocument.Bookmarks("Tableau_V").Range.Select
    Set oTbl = Selection.Tables(1)
    Dim myStrig As String
     
     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
    Merci beaucoup pour toutes tes indications et si tu vois un moyen de simplifier le code pour le rendre plus "convivial", je suis ouverte à toute proposition!!!

Discussions similaires

  1. sélectionner une ligne dans un tableau
    Par cotede2 dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 13/05/2009, 14h16
  2. [HTML] Sélectionner une ligne dans un tableau en html
    Par jehlg dans le forum Balisage (X)HTML et validation W3C
    Réponses: 8
    Dernier message: 16/06/2008, 11h55
  3. [VBA-E]insertion automatique d'une ligne dans un tableau
    Par janus82 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 06/04/2006, 15h42
  4. selection d'une ligne dans un tableau en html
    Par jehlg dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 08/02/2006, 23h08
  5. probleme bizarre de hauteur auto d'une ligne dans un tableau
    Par zax-tfh dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 17/01/2005, 23h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo