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

Macros et VBA Excel Discussion :

VBA excel - envoyer des données d'un fichier excel sur plusieurs fichiers words [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 010
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 1 010
    Points : 181
    Points
    181
    Par défaut VBA excel - envoyer des données d'un fichier excel sur plusieurs fichiers words
    Bonjour,

    Je travaile sur des stats sur un fichier excel et j'aimerais envoyer les données du fichier excel sur plusieurs fichiers word. C'est là que je bloque donc si quelqu'un pouvais m'aider, merci

    Voir ci dessous le code: il envoye que sur un fichier word

    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
     
    Option Explicit
    Sub auto()
     
            Dim WordApp As Word.Application
            Dim WordDoc As Word.Document
     
                Set WordApp = CreateObject("word.application")
                WordApp.Visible = True    'mettre False pour garder Word masqué
                Set WordDoc = WordApp.Documents.Open("R:\PREVENTION ET SECURITE\NOUVELLE STRUCTURE\TABLEAUX DE BORD\MODAT Indicateurs\Modat Ind en cours\Année 2011\Docs_pierre\test_vba\Fenouillet_test11.doc")    'ouvre le document Word
     
                'Tables(2) correspond au 2eme tableu du document Word
                'transfert la donnée de la cellule A1 dans la 3eme cellule de la 1ere colonne
     
                     WordDoc.Tables(3).Columns(2).Cells(2).Range.Text = Sheets("faits_constates").Range("C14").Text
     
                  'transfert la donnée de la cellule A2 dans la 2eme cellule de la 3eme colonne
     
                      WordDoc.Tables(3).Columns(3).Cells(2).Range.Text = Sheets("coups_blessures").Range("C14").Text
                    'WordDoc.Close True 'ferme le document Word en enregistrant les modifications
                     'WordApp.Quit 'ferme l'application Word
        End Sub

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 141
    Points : 414
    Points
    414
    Par défaut
    Pourquoi ouvrir une troisième discussion sur le même sujet à quatre minutes d'intervalle de la seconde discussion alors que le code fourni ne diffère que par le chemin du document à ouvrir (sur réseau ou en local) et le n° de table dans le document ?

    1. Constantes descriptives des feuilles Excel et du document Word

    Pour éviter le codage en dur des cellules :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("faits_constates").Range("C14")
    on avait suggéré de décrire les deux feuilles Excel qui sont les sources des données à copier dans le document Word cible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ' ============ Description de la feuille Excel ============
    Public Const nameSheetFact = "faits_constates"
    Public Const rowFactStat = 14
    Public Const colFactIsbn = 3 ' Contrats ISBN
    Public Const colFactTitle = colFactIsbn + 1 ' Contrats Titre
     
    Public Const nameSheetBlow = "coups_blessures"
    Public Const rowBlowStat = 14
    Public Const colBlowOther = 2 ' Contrats autre
    On aimerait que vous preniez en compte ces recommandations plutôt que de publier dans deux nouvelles discussions consécutives le même code avec des constantes numériques différentes à l'intérieur d'une procédure.

    2. Compilation conditionnelle si le document Word est en réseau ou en local

    Concernant le chemin du document à ouvrir sur réseau ou en local, on avait proposé une solution par compilation conditionnelle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ' ============ Description du document Word    ============
    ' VBE menu "Outils" > "Propriété de VBA Project" > "Arguments de compilation conditionnelle"
    ' isNetwork=1 pour un accès réseau. isNetwork=0 ou non défini pour un accès local
    #If isNetwork = 1 Then
    Public Const filenameDoc = "R:\PREVENTION ET SECURITE\NOUVELLE STRUCTURE\TABLEAUX DE BORD\MODAT Indicateurs\Modat Ind en cours\Année 2011\Docs_pierre\test_vba\Fenouillet_test11.doc"
    #Else
    ' Test en local
    Public Const filenameDoc = "C:\Users\You\Documents\Excel\Developpez\peter11\test11.doc"
    #End If
    On a même donné la méthode pour travailler avec une copie locale du document distant !

    3. Gestion d'erreur

    Où est la gestion d'erreur à l'ouverture du document Word ou lors de l'accès à son tableau d'un n° donné ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ' Remplir la table n° indDocTableStat du document
    Function WordTable(wordDoc As Word.Document, ByVal contrats_ISBN As String, _
        ByVal contrats_Titre As String, ByVal contrats_autre As String) As Boolean
    Dim lineLastDoc As Long
     
        WordTable = False
        If wordDoc.Tables.Count < indDocTableStat Then
            Warning "4000: Impossible de trouver la table n° " & indDocTableStat & _
                    " dans le document Word"
            Exit Function
        End If
    On avait fourni la procédure Warning() et comment l'utiliser ?
    Evitez de publier à nouveau un code sans gestion d'erreur.

    4. Etre précis dans la description du problème

    Définir le problème avec plus de précision.

    Citation Envoyé par peter11 Voir le message
    C'est que je bloque
    Où bloquez-vous ? Indiquez la ligne précise de code et le n° d'erreur et son message d'erreur s'il y a une erreur. Indiquez le résultat attendu.

    5. Conclusion

    Prenez en compte les recommandations que l'on a déjà suggérées.

    6. Votez

    Encouragez les personnes qui prennent le temps de vous répondre en votant par un clic sur le bouton vert ci-dessous
    particulièrement quand le sujet a été résolu dans le cas où vous voulez avoir de nouvelles réponses à de nouvelles questions.

  3. #3
    Membre habitué
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 010
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 1 010
    Points : 181
    Points
    181
    Par défaut VBA excel
    oui je suis desolé d'avoir ouvert une nouvelle discussion mais comme j'avais un nouveau probléme (diffusion des données excel sur plusieurs tableaux de plusieurs pages word) je pensais qu'il fallait en ouvrir une autre.
    Et si je ne prends pas en compte les recommandations c'est juste parce que je ne comprends pas comment ça marche donc je ne le rajoute pas dans le code.(ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     ' ============ Description du document Word    ============
    ' VBE menu "Outils" > "Propriété de VBA Project" > "Arguments de compilation conditionnelle"
    ' isNetwork=1 pour un accès réseau. isNetwork=0 ou non défini pour un accès local
    #If isNetwork = 1 Then
    mais promis je vais essayer de faire des efforts! Encore merci pour l'aide que vous m'apportez.

    Bonne semaine

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 141
    Points : 414
    Points
    414
    Par défaut Compilation conditionnelle dans Excel VBA
    1. Généralisation à plusieurs tableaux dans plusieurs documents Word cibles

    Citation Envoyé par peter11 Voir le message
    envoyer les données du fichier excel sur plusieurs fichiers word.
    Citation Envoyé par peter11 Voir le message
    diffusion des données excel sur plusieurs tableaux de plusieurs pages word
    Comme le projet se complexifie (plusieurs documents Word cibles contenant plusieurs tableaux), vous ne pourrez pas faire tenir le code dans une seule procédure auto() dans la limite recommandée d'une trentaine de ligne par procédure.

    C'est pour cela qu'il faut structurer en procédures courtes comme dans l'exemple que j'avais fourni.

    Avec l'augmentation des cibles à mettre à jour, cela signifie également l'augmentation des sources de données, il devient obligatoire de décrire avec précision chaque source et chaque cible avec des constantes dont le nom soit significatif et de mettre en place une gestion d'erreur conséquente sinon la mise au point du projet sera beaucoup plus longue.

    A première vue, définir les constantes semble une perte de temps.
    En fait au final, cela fait gagner du temps car si on structure bien les noms des constantes, on peut en déduire qu'est-ce qu'on pourra factoriser.

    De plus les commentaires de chaque déclaration de constantes apportent une compréhension immédiate du projet en terme de source à lire et de cible à écrire.

    2. Compilation conditionnelle #If isNetwork = 1 Then puis #Else ... et enfin #End If dans Excel VBA

    Citation Envoyé par peter11 Voir le message
    je ne comprends pas comment ça marche
    C'est préférable de l'écrire comme cela on peut détailler l'usage de la solution.

    En phase de mise au point, c'est plus long d'utiliser le document sur le réseau R:\
    Vous l'avez probablement déjà copié en local sur son disque dur dans votre répertoire de travail quelque part dans C:\...

    2.1 Définir le chemin du document test11.doc en local sur C:\

    Définir ce chemin dans la constante filenameDoc en changeant le chemin suivant du document de test test11.doc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ' Test en local
    Public Const filenameDoc = "C:\Users\You\Documents\Excel\Developpez\peter11\test11.doc"
    Cette définition de constante se trouve dans la partie #Else du test #If isNetwork = 1.

    2.2 Session de mise au point dans le débogueur

    Mettre un point d'arrêt sur la première ligne du programme principal de la maquette RemplirTableauWordDepuisDonneesExcel() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        If isCopyDoc Then If Not WordCopy(filenameDoc, WordTmp()) Then Exit Sub
    Dans la fenêtre d'Exécution immédiate (Ctrl+G) du VBE (Visual Basic Editeur) d'Excel, copier-coller et valider par ENTER :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RemplirTableauWordDepuisDonneesExcel
    Le programme s'arrête sur le point d'arrêt et l'instruction If isCopyDoc Then devient jaune.

    Dans la fenêtre d'édition du VBE, survolez la constante filenameDoc avec le pointeur de la souris pour lire l'info-bulle.

    Dans la fenêtre d'Exécution immédiate copier-coller et valider par ENTER :
    C:\Users\You\Documents\Excel\Developpez\peter11\test11.doc

    Bien sûr, vous avez au préalable adapté la déclaration de la constante filenameDoc avec votre chemin du document Test11.doc dans votre disque dur (pas en réseau).

    Stopper l'exécution du la procédure dans le débogueur.
    VBE menu "Run" > "Reset".

    2.3 Définir la constante de compilation conditionnelle isNetwork dans les propriétés du projet VBA

    Dans le VBE, cliquez sur le menu "Outils" > "Propriété de VBA Project" > "Arguments de compilation conditionnelle"
    VBE menu "Tools" > "VBAProject Properties" > "Conditional Compilation Arguments"

    La dernière zone de saisie correspond à "Arguments de compilation conditionnelle".

    Définir la constante isNetwork avec la valeur 1 par un copier-coller de :
    2.4 Nouvelle session de mise au point dans le débogueur

    Recommencez la session de mise au point avec le point d'arrêt inchangé en début de procédure.
    Dans la fenêtre d'Exécution immédiate (Ctrl+G) du VBE d'Excel, copier-coller et valider par ENTER :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RemplirTableauWordDepuisDonneesExcel
    Le programme s'arrête sur le point d'arrêt et l'instruction If isCopyDoc Then devient jaune.

    Survolez la constante filenameDoc avec le pointeur de la souris pour lire l'info-bulle.

    Dans la fenêtre d'Exécution immédiate copier-coller et valider par ENTER :
    R:\PREVENTION ET SECURITE\NOUVELLE STRUCTURE\TABLEAUX DE BORD\MODAT Indicateurs\Modat Ind en cours\Année 2011\Docs_pierre\test_vba\Fenouillet_test11.doc

    2.5 Conclusion

    On peut basculer d'un accès local au document de test test11.doc à un accès distant en réseau en définissant la constante de compilation conditionnelle isNetwork=1 (accès réseau) ou 0 (accès local).

    Quand la zone de compilation conditionnelle est vide (aucune constante définie), ce qui était le cas lors de la première session de mise au point dans le débogueur, l'accès local est l'accès par défaut.

    Ce principe de compilation conditionnelle selon la constante définie par le développeur évite d'éditer le code source VBA pour basculer entre l'accès local et l'accès en réseau.

    Quand le programme sera au point, on indiquera isNetwork=1 dans les paramètres de compilation conditionnelle du projet.
    On enlèvera cette constante s'il y a besoin de mettre au point de nouvelles évolutions.
    ___________

    En bas de ce message s'il vous a apporté des éléments de réponse pertinents, pensez également à voter en cliquant sur le bouton vert ci-dessous.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 10/06/2014, 17h05
  2. Réponses: 3
    Dernier message: 06/08/2013, 14h20
  3. [AC-2003] Exporter plusieurs fichiers excel à partir des données d'une requête
    Par Daphnoxbow dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 06/10/2009, 11h41
  4. C#: Ouvrir un fichier Excel, ajouter des donneés, et enregistrer
    Par soufian1364 dans le forum Services Web
    Réponses: 4
    Dernier message: 24/03/2009, 14h12
  5. Réponses: 1
    Dernier message: 08/10/2008, 15h30

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