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 :

[VBA][WORD]Identifier un tableau dans un document


Sujet :

VBA Word

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut [VBA][WORD]Identifier un tableau dans un document
    Bonjour à tous,

    J'ai un document modèle que je dois éditer, et j'ai besoin, dans le code, de savoir s'il y a un tableau quelque part...

    J'peux faire un champ caché ou un truc comme ça, mais ça serait mieux si word permettait de donner un nom ou un titre à un tableau...

    Que feriez vous à ma place?

    Merci

    A bientôt

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Déjà, tu peux affecter un signet à l'ensemble de ton tableau. Pour le nommer, tu dois d'abord le trouver
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        On Error Resume Next
        For i = 1 To ActiveDocument.Tables.Count
            ActiveDocument.Tables(i).Select
            If Err <> 0 Then
                MsgBox "Aucun tableau trouvé"
                Exit For
            End If
            With ActiveDocument.Bookmarks
                .Add Range:=Selection.Range, Name:="MonTableau" & CStr(i)
            End With
        Next
        On Error GoTo 0
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        'Pour créer un tableau de    '4 lignes et 5 colonnes
     
        Selection.EndKey Unit:=wdStory  'Envoie à la fin du document
        ActiveDocument.Tables.Add Range:=Selection.Range, NumRows:=4, NumColumns:=5
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        'Pour sélectionner le tableau
        Selection.GoTo What:=wdGoToBookmark, Name:="MonTableau2"
    Tu dis

    A+

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    Merci beaucoup Nikel

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    Une autre petite question...

    Une fois le tableau sélectionné, j'ai besoin de le dupliquer autant de fois que nécessaire (c'est l'utilisateur qui décide). Dans ce cas, comment fait-on pour le dupliquer?

    Merci beaucoup

  5. #5
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        Selection.GoTo What:=wdGoToBookmark, Name:="MonTableau2"    'Selection du tableau 2
        Selection.Copy                                              'Copie (!)
        Selection.EndKey Unit:=wdStory                              'Aller à la fin du document
        Selection.TypeParagraph                                     'Ajouter une ligne - pour séparer les tableaux
        Selection.Paste                                             'Colle le tableau (ici en fin de document
    Tu essaies et tu nous dis

    A+

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    Bah c'est bon,

    J'ai sélectionné le tableau, je l'ai copié, et j'ai fait paste.

    ça les colle l'un à l'autre, je ferai un Selection.TypeParagraph pour laisser une ligne

    merci beaucoup beaucoup

    A bientôt ouskel

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    Heu... j'ai un p'tit soucis

    lorsque je fais
    Selection.GoTo What:=wdGoToBookmark, Name:="contactTab"

    ça me met une erreur: "variable objet ou variable bloc With non défini"

    Que dois-je faire?

    Merci

    A bientôt

  8. #8
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Hello te revoilou...

    Peux-tu mettre le code qui précède ta ligne ? Juste quelques lignes pour voir le contexte...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        With Selection
              .GoTo What:=wdGoToBookmark, Name:="contactTab"
        End with
    Avec ça, ça devrait marcher, sinon, c'est que tu n'es pas dans ton document ou que le signet n'existe pas

    A+

  9. #9
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    Merci pour répondre aussi vite

    En fait j'ai fait un tableau contactTab. Dedant y'a "nom, prenom, adresse" etc... et le but du jeu, c'est de copier ce tableau, le remplir, et à chaque contact ultérieur coller le tableau de "référence" avec les signets et tout.

    Alors, je fais ça:

    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
     
    Dim rangeTab As range
    With Selection
              Set rangeTab = .GoTo(What:=wdGoToBookmark, Name:="contactTab")
    End With
     
    'remplissage du tableau
    For i = 1 To 5
        'Si c'est pas le premier, alors il faut faire une copie du tableau
        If i > 1 Then
            rangeTab.Paste
        End If
        oWord.Bookmarks("nomContact").range.Text = contacts(i).nom
        oWord.Bookmarks("prenomContact").range.Text = contacts(i).prenom
        oWord.Bookmarks("jfContact").range.Text = contacts(i).jf
        oWord.Bookmarks("adresseContact").range.Text = contacts(i).adresse
        oWord.Bookmarks("cpContact").range.Text = contacts(i).cp
        oWord.Bookmarks("villeContact").range.Text = contacts(i).ville
    Next
    Au préalable, j'ai fait un tableau de contact en dur, c'est pour tester, mais plus tard ça sera issue d'une base de donnée.

    Donc je commence par copier le tableau portant le signet "contactTab". Par la suite, pour la première insertion, on peut remplir le tableau définit dans le modèle, et ensuite coller le tableau de base. Normalement, les signets se déplacent, ce qui fait que pour remplir après la copie, les nom ne changent pas, et ça se rempli correctement.

    Avec ce code, ça me met une erreur 91 à la ligne "Set rangeTab =..."

    Je comprend pas, y me semble avoir fait la même chose y'a pas longtemps et que ça fonctionnait...

    En tout cas merci beaucoup

  10. #10
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    Ha ouais ça y'es je me rapel...

    Quand ça marchait, c'est parceque j'avais affecté chaque signé à une cellule. Maintenant j'essaye en en affectant à une position. Lorsque je copie le tableau et le colle, les signets restent dans le tableau référence, et par conséquent, ça rempli par la suite toujours dans le tableau de référence, le premier.

    Donc au finale je me retrouve avec 4 tableaux vide, et un (le premier, la référence) avec les 5 nom, les 5 prénom etc...

    Y a-t-il une solution pour copier les signets en même temps que le tableau?

    Merci

    A bientôt

  11. #11
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Hello,

    Voilà, j'ai pu sauver ça.
    Cette solution, inspirée d'une réponse de zazaraignée (rendons aux arachnides ce qui appartient aux zaraignées) Ces lignes copient les données du tableau 1 dans les cellules du tableau 2

    Tu adaptes à tes besoins et tu nous dis.

    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
    Sub TableauCopierColler()
        Dim r As Integer, c As Integer
        Dim indice As Integer
        indice = 1 ' La collection Tables commence à 1
        'sélectionne la première cellule du premier tableau
        ActiveDocument.Tables(indice).Cell(0, 0).Select
        For r = 1 To ActiveDocument.Tables(indice).Rows.Count
            For c = 1 To ActiveDocument.Tables(indice).Columns.Count
                ActiveDocument.Tables(indice).Cell(r, c).Select
                ' Modifie le contenu de la cellule
                MsgBox Selection '.TypeText.Text ':=Str(r) & ", " & Str(c)
                Selection.Copy
                ActiveDocument.Tables(2).Cell(r, c).Select
                Selection.Paste
            Next c
        Next r
    End Sub
    Tu n'as plus besoin des signets dans cette solution. Je t'avais donné la solution des signets parce que j'ignorais ce que tu voulais faire, au bout.
    Comme quoi, faut toujours poser le problème en entier avant de se poser une question...

    Raconte nous la suite...

    A+

  12. #12
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    Merci beaucoup

    Mais je ne pense pas que ça ira, puisque sans élément nommé, je n'ai pas d'indication sur "ou inscrire la valeur". Il vaut mieux un p'tit exemple qu'un long discourt.

    J'ai fait un exemple qui caractérise bien le soucis:
    http://kinju.free.fr/sources.zip

    Dedant il y a un p'tit modèle de document WORD.
    Dans les sources, il y a d'abord l'ouverture du modèle. Puis une complétion toute bête.
    Ensuite j'ai une structure "contact". J'en cré 5.

    Et pour finir, je dois balayer les 5 contacts, et inscrire leurs infos dans des tableaux caractérisé par le signet "contactTab" du modèle.

    Le soucis concerne le cas ou le signet doit être attribué à une position, et non une céllule (signet "test" dans mon modèle).

    Voili voilou

    A bientôt

    Aurélien

  13. #13
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Ok, j'ai ton fichier, mais ton appli est en VB, donc... j'ai pas VB

    Mais voilà ce que tu peux faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Sub Collection_Créer()
     Dim MaColect  As New Collection
        ' Rempli la collection
        MaColect.Add "1-1", "Nom"
        MaColect.Add "1-3", "Prénom"
        MaColect.Add "2-1", "Adresse"
        MaColect.Add "3-2", "CP"
        MaColect.Add "3-4", "Ville"
        'etc
        'Affichage
        Debug.Print MaColect("Nom") & " " & MaColect("Prénom") & " " & MaColect("Adresse") & " " & MaColect("CP") & " " & MaColect("Ville")
        MsgBox MaColect("Nom") & " " & MaColect("Prénom") & " " & MaColect("Adresse") & " " & MaColect("CP") & " " & MaColect("Ville")
    End Sub
    Ainsi, tu peux récolter tes N° de lignes et de colonne en utilisant le libellé comme index
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    NoLigne = Val(Left(MaColect("Nom"),1))
    NoCol = Val(Right(MaColect("Nom"),1))
    Tu dis

    A+

  14. #14
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    Merci beaucoup

    J'ai proposé cette solution à mon supérieur, je dois la mettre au propre et on en discutera avec plus de précision.

    Les inconvénients sont qu'on ne peut pas mettre un libellé dans une case avec sa valeur dans la même case.
    Par exemple:
    Nom: bruno
    Il faudra deux céllule avec une séparation invisible.

    Autre inconvénient, si l'utilisateur modifie un tablea dans son modèle, il devra modifier le fichier de complétion du document, puisque les coordonnées des cases aurons changés.

    Enfin j'ai trouvé plusieurs solutions, mais aucune stable, simple et fiable. J'en discuterai avec l'chef tout à l'heure

    Je te tiens au courant.

    Merci beaucoup beaucoup

    A bientôt

    Aurélien

  15. #15
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Les inconvénients sont qu'on ne peut pas mettre un libellé dans une case avec sa valeur dans la même case.
    Par exemple:
    Nom: bruno
    Il faudra deux céllule avec une séparation invisible.
    Alors tu as mal lu.
    Dans mon exemple, repris de ton propre fichier, j'ai sauté toutes les cellules comportant un libellé pour les N° de lignes et colonnes. Vérifie.
    Enfin, dans l'exemple précédent, tu as le moyen de passer d'un tableau à l'autre. Maintenant, tu as tout ce qu'il te faut. A toi de faire...

    A+

  16. #16
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    Oui dans mon propre fichier y'a des cellules cachées, c'est ça qu'on voudrait éviter.

    Je te tiens au courant

    Merci encore

    A bientôt

    Aurélien

Discussions similaires

  1. [Débutant] changer l'emplacement de mon tableau dans un document word
    Par pocahentez dans le forum VB.NET
    Réponses: 2
    Dernier message: 15/08/2011, 14h37
  2. [VBA-W]Retrouvez des objets dans son document
    Par tazamorte dans le forum VBA Word
    Réponses: 11
    Dernier message: 06/02/2007, 14h47
  3. [VBA-W] Faire une fusion dans un document ouvert
    Par zahui_eric dans le forum VBA Word
    Réponses: 6
    Dernier message: 22/01/2007, 12h41
  4. [VB6 - Word] Insertion d'entêtes dans un document Word
    Par tmcgrady dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 27/09/2006, 14h45
  5. [VBA-E] Problème de tableau dans macro VBA
    Par Chouls dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 12/06/2006, 15h20

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