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 :

Import et mise en forme VBA de données Excel


Sujet :

VBA Word

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2008
    Messages : 31
    Points : 21
    Points
    21
    Par défaut Import et mise en forme VBA de données Excel
    Bonjour !

    Déjà merci à vous car depuis 2 semaines que je dois programmer pour mon travail je parcours votre forum et j'y ai trouvé quasiment réponse à toutes mes questions. J'ai construit entre autres une macro qui extrait des données depuis mon classeur excel et les copie dans un .docx (préalablement enregistré sous un autre nom pour ne pas perdre le document modèle. Le tableau est ensuite mis en forme.

    Et là je suis perplexe : ça marche... une fois sur deux !
    Sinon il m'affiche :
    "Erreur d'exécution '462'
    Le serveur distant n'existe pas ou n'est pas disponible"

    Le débogage indique alors la ligne :
    ".Rows.SetHeight RowHeight:=InchesToPoints(0.3), HeightRule:=wdRowHeightExactly"

    Voyez-vous où peut se situer le problème ??

    D'avance merci beaucoup !

    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
    41
    42
    43
    44
    45
    Sub export_word()
    '
    ' export_word Macro
    '
     
    '
    ' Copie des données dans la feuille excel
        Worksheets("Disponibilité poinçons").Activate
        Union(Range("A1:A96"), Range("D1:A96")).Copy
     
        Dim WordApp As Word.Application
        Dim WordDoc As Word.Document
     
    ' Ouverture du fichier modèle et enregistrement sous un autre nom (pour ne rien écraser)
        Set WordApp = CreateObject("Word.Application")
        WordApp.Visible = True
        Set WordDoc = WordApp.Documents.Open _
            ("C:\Users\Stagiaire.soud2\Documents\doc_type_essai.docx", ReadOnly:=False)
     
        FileSaveName = Application.GetSaveAsFilename(fileFilter:="Word Files (*.doc), *.doc")
        If FileSaveName <> False Then
            WordDoc.SaveAs FileSaveName
        End If
     
    ' Collage dans le doc word
     
    ' positionne le curseur au signet "ici"
        WordApp.Selection.Goto What:=wdGoToBookmark, Name:="ici"
        WordApp.Selection.Paste
     
    'Mise en forme du tableau
        Set tablo = WordDoc.Tables(1)
        With tablo
            .Borders(wdBorderLeft).LineStyle = wdLineStyleSingle
            .Borders(wdBorderRight).LineStyle = wdLineStyleSingle
            .Borders(wdBorderTop).LineStyle = wdLineStyleSingle
            .Borders(wdBorderBottom).LineStyle = wdLineStyleSingle
            .Borders(wdBorderHorizontal).LineStyle = wdLineStyleDot
            .Borders(wdBorderVertical).LineStyle = wdLineStyleDot
            .Rows.SetHeight RowHeight:=InchesToPoints(0.3), HeightRule:=wdRowHeightExactly
            .Rows(1).SetHeight RowHeight:=InchesToPoints(0.6), HeightRule:=wdRowHeightExactly
     
        End With
     
    End Sub

  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 543
    Points
    15 543
    Par défaut
    Sur quelle ligne, l'erreur ?
    Je suppose que c'est sur l'une de ces lignes
    Set WordDoc = WordApp.Documents.Open _
    ("C:\Users\Stagiaire.soud2\Documents\doc_type_essai.docx", ReadOnly:=False)

    FileSaveName = Application.GetSaveAsFilename(fileFilter:="Word Files (*.doc), *.doc")
    If FileSaveName <> False Then
    WordDoc.SaveAs FileSaveName
    End If
    Si c'est bien ça, alors ajoute un DoEvents après chaque ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        Set WordDoc = WordApp.Documents.Open _
            ("C:\Users\Stagiaire.soud2\Documents\doc_type_essai.docx", ReadOnly:=False)
        DoEvents
     
        FileSaveName = Application.GetSaveAsFilename(fileFilter:="Word Files (*.doc), *.doc")
        DoEvents
        If FileSaveName <> False Then
            WordDoc.SaveAs FileSaveName
            Dovents
        End If
    DoEvents donne le temps au système de faire sont travail (ouverture de Word, du document, sauvegarde...)
    A+

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2008
    Messages : 31
    Points : 21
    Points
    21
    Par défaut
    Merci beaucoup de t'intéresser au problème.

    Non, lorsqu'il m'indique qu'il y a une erreur, la ligne est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Rows.SetHeight RowHeight:=InchesToPoints(0.3),HeightRule:=wdRowHeightExactly

    PS : j'ai essayé quand même avec les "DoEvents" Conseillés et le résultat ne change pas.

  4. #4
    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 543
    Points
    15 543
    Par défaut
    D'où l'intérêt d'indiquer la ligne provoquant l'erreur afin de nous éviter d'avoir à relire tout le code
    Rows est une collection d'objets et doit posséder un indice Rows(indice)
    Manque l'indice...
    (Tu peux laisser les DoEvents qui, s'ils sont inutiles ne nuisent pas)

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2008
    Messages : 31
    Points : 21
    Points
    21
    Par défaut
    A vrai dire je l'avais déjà mis dans le premier post, mais pas avec les balises de code il est vrai.

    Et ce que je ne comprends pas c'est que si il manque des infos à mon code, comment arrive-t-il à s'exécuter correctement une fois sur deux?

  6. #6
    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 543
    Points
    15 543
    Par défaut
    Moi non plus, je ne comprends pas.
    Par contre, si tu isoles les deux séries d'instructions et sépares cette ligne, ça devrait fonctionner.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        With tablo.Rows
             .SetHeight RowHeight:=InchesToPoints(0.3), HeightRule:=wdRowHeightExactly
        end with
    Pas testé mais ça semblerait logique
    Tu dis
    A+

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2008
    Messages : 31
    Points : 21
    Points
    21
    Par défaut
    J'ai effectué la modification conseillée :
    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
    'Mise en forme du tableau
        Set tablo = WordDoc.Tables(1)
        With tablo
            .Borders(wdBorderLeft).LineStyle = wdLineStyleSingle
            .Borders(wdBorderRight).LineStyle = wdLineStyleSingle
            .Borders(wdBorderTop).LineStyle = wdLineStyleSingle
            .Borders(wdBorderBottom).LineStyle = wdLineStyleSingle
            .Borders(wdBorderHorizontal).LineStyle = wdLineStyleDot
            .Borders(wdBorderVertical).LineStyle = wdLineStyleDot
        End With
     
        With tablo.Rows
            .SetHeight RowHeight:=InchesToPoints(0.3), HeightRule:=wdRowHeightExactly
        End With
     
            tablo.Rows(1).SetHeight RowHeight:=InchesToPoints(0.6), HeightRule:=wdRowHeightExactly
    Eh bien toujours pareil, ça me renvoie toujours la même erreur, pour la même ligne de programmation, avec une constance (un coup marche, un coup marche pas, un coup marche, un coup marche pas,...) surprenante. Pourquoi marcher parfois et pas d'autres, et pourquoi exactement une fois sur deux? c'est à n'y rien comprendre...

    Mais merci quand même de tes conseils, car même si la macro présente toujours le même problème j'apprends des choses au passage !

  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 543
    Points
    15 543
    Par défaut
    Je ne peux que supposer : HeightRule:=wdRowHeightExactly fixe la hauteur exacte des lignes. Je suppose donc qu'une première fois, cette propriété est appliquée, et qu'une seconde fois, elle est supprimée. Il en va ainsi si tu appuies deux fois sur "Centrer le texte".
    Si c'est bien ça, on doit pouvoir effecuter un test pour exécuter le code.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    If not Tablo.rows.HeightRule:=wdRowHeightExactly then
          Tablo.rows.HeightRule:=wdRowHeightExactly 
          else
          'rien
    endif
    Je te laisse tester ?
    Tu dis
    A+

    NB - Si ça fonctionne, tu mets sur deux lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
          .SetHeight RowHeight:=InchesToPoints(0.3)
          If .HeightRule:=wdRowHeightExactly 
                ......

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2008
    Messages : 31
    Points : 21
    Points
    21
    Par défaut
    Bon, j'ai testé ce que tu m'as proposé, bidouillé 2-3 trucs pour finalement en revenir à ce que j'avais avant et... maintenant ça marche à tous les coups !

    L'informatique des fois...

    Par acquis de conscience je te recopie fidèlement ce que j'ai désormais :
    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
    'Mise en forme du tableau
        Set Tablo = WordDoc.Tables(1)
        With Tablo
            .Borders(wdBorderLeft).LineStyle = wdLineStyleSingle
            .Borders(wdBorderRight).LineStyle = wdLineStyleSingle
            .Borders(wdBorderTop).LineStyle = wdLineStyleSingle
            .Borders(wdBorderBottom).LineStyle = wdLineStyleSingle
            .Borders(wdBorderHorizontal).LineStyle = wdLineStyleDot
            .Borders(wdBorderVertical).LineStyle = wdLineStyleDot
        End With
     
        With Tablo.Rows
            .SetHeight RowHeight:=InchesToPoints(0.3), HeightRule:=wdRowHeightExactly
        End With
     
        Tablo.Rows(1).SetHeight RowHeight:=InchesToPoints(0.6), HeightRule:=wdRowHeightExactly
    En tout cas merci !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 14/12/2010, 18h08
  2. [WD-2000] Pb mise en forme vba word
    Par mphb45 dans le forum VBA Word
    Réponses: 3
    Dernier message: 26/01/2010, 20h55
  3. [Toutes versions] Import&Mise en forme Fichier texte vers excel
    Par roadmender dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 15/12/2009, 15h45
  4. [AC-2007] Mise en forme feuille de données
    Par Invité dans le forum IHM
    Réponses: 1
    Dernier message: 25/08/2009, 17h11
  5. [VBA] Mise en forme d'un fichier Excel depuis Access
    Par morgiane dans le forum Access
    Réponses: 2
    Dernier message: 25/07/2007, 11h32

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