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 :

Projet Word-Excel / Publipostage-VBA


Sujet :

VBA Word

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Février 2017
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : Février 2017
    Messages : 15
    Points : 7
    Points
    7
    Par défaut Projet Word-Excel / Publipostage-VBA
    Bonjour à tous,

    Tout d'abord je vous remercie d'avance pour votre temps et votre aide.

    Je vais vous décrire au mieux mon objectif et les différents problèmes rencontrés, j'espère que vous pourrez m'aider.

    J'insiste sur le fait que je me suis résigné à poster ici et à vous demander de l'aide après de très nombreuses tentatives en solo et après avoir parcouru très attentivement plusieurs tutoriels notamment ceux de Heureux-oli que je remercie pour les progrès qu'il m'a permit de faire en solo.

    Objectif :

    Je suis en charge dans le cadre de mon emploi de la facturation à des pensionnaires d'un centre de soins ainsi qu'en relation avec plusieurs organismes de mutuelles.
    Je dois leurs établir mensuellement un grand nombre de documents différents.
    Pour se faire j'ai créé une base de donnée sous excel subdivisée en deux feuilles (l'une patient et l'autre mutuelle).
    Je possède pour l'instant 9 modèles de lettres type sous word que j'utilise régulièrement via un publipostage "classique/simple" pour établir et envoyer des courriers personnalisés.

    Problèmes/difficultés :

    1) Tout d'abord j'ai un problème de logique dans la constitution de ma base de donnée sous excel. Pour bien faire je devrais rajouter une feuille (ou plusieurs champs) pour prendre en compte des dates de fréquentation des patients, le problème c'est que cela représente une très grosse quantités de données (plusieurs patients qui viennent plusieurs fois par semaine tout au long de l'année...) avez-vous une suggestion simple pour incorporer ces données ? sachant que de très nombreux courriers nécessitent que je liste l'ensemble des dates par patient pour un mois ou un trimestre...

    2) D'un point de vue pratique, je possède un modèle qui est par exemple un récapitulatif trimestriel envoyé aux mutuelles de leurs affiliés, j'ai réussi en utilisant le champ DATABASE et en adaptant la requête SQL de récupérer les patients en fonction du numéro de leur mutuelle, mais impossible ensuite de mettre correctement en forme le tableau renvoyé (les commutateurs ne donnent pas ce que je souhaite, à titre d'exemple je n'arrive même pas à faire en sorte que le tableau renvoyé s'ajuste à toute la largeur de ma page...).

    3) Concernant le VBA (que je ne connais pas et dont mes premiers essais suite à des tutoriaux n'ont pas été concluant), il faut savoir que je suis dans une grosse structure dans laquelle je n'ai pas le contrôle sur l'infrastructure, serveurs et autres... Je n'ai pas vraiment la possibilité de rajouter des bibliothèques ou des accès particuliers, ceci a pour effet de me renvoyer des erreurs que je n'arrive pas à identifier et à résoudre.
    - Par exemple impossible d'utiliser des "bookmarks" alors que j'arrive pourtant à me connecter à ma base de donnée sous excel via le VBA et inscrire un champ précis sur ma feuille...

    4) Un problème récurrent que je rencontre est d'utiliser une sorte de boucle pour ramener plusieurs enregistrements de ma base de donnée suivant un paramètre (ou plusieurs) afin de les exploiter dans mon document. Si par miracle je trouve une code VBA qui ne me renvoi pas une erreur, je n'ai toujours pas compris comment exploiter les données de ma boucle dans un document avec un modèle et une structure fixe.

    5) comme précisé plus haut, ma base de donnée comporte 2 feuilles, je dois souvent faire appel aux informations de ces deux feuilles, mais je ne sais pas comment exploiter (tant en publipostage qu'en VBA) des données se trouvant sur 2 feuilles différentes... en règle générale je dois toujours choisir l'une ou l'autre au moment de la connexion...


    Conclusion :

    Plutôt que d'écrire un roman qui ne sera peut-être pas lu/compris, je m'arrête la pour l'instant mais je vais suivre ce sujet de près et je me tien à votre disposition pour tout renseignements et/ou tests.

    Messieurs les experts, à vous de jouer !

    Merci

  2. #2
    Futur Membre du Club
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Février 2017
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : Février 2017
    Messages : 15
    Points : 7
    Points
    7
    Par défaut
    Bonjour à tous,

    Petite mise à jour de mon poste car j'ai fait des progrès conséquents sur l'un de mes fichiers.

    - Tout d'abord j'ai créé un fichier Word.docm dans lequel j'ai appliqué ma mise en page avec les signet de type : {MERGEFIELD Nom } ensuite, grâce à la combinaison "ALT+F11" j'ai accédé au VBA.

    - J'ai ensuite rajouté la bibliothèque : "Microsoft Excel 14.0 Object Library" qui me manquait et qui générait des erreurs sur les bouts de code que je récupère sur le net.

    - J'ai copier/coller le code du tutoriel : http://heureuxoli.developpez.com/off...ostage/#LVII-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
    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
     
    Sub donneeAvecExcel()
    On Error GoTo GestErr
    'Déclaration des variables
    Dim xlApp As Excel.Application
    Dim xlWb As Excel.Workbook
    Dim xlSh As Excel.Worksheet
    Dim iR As Integer
    Dim i As Integer, j As Integer
    Dim oDoc As Document
    Dim NoFact As Integer
    Dim oTbl As Table
    Dim stDocName As String
     
     
     
     
    'Affectation des données aux variables
    Set xlApp = New Excel.Application
    Set xlWb = xlApp.Workbooks.Open("C:\Documents and Settings\Olivier\Mes documents\Mes sources de données\adresses.xlsx")
    Set xlSh = xlWb.Worksheets(2)
    'Récupération du nombre de lignes et de colonnes
    iR = xlSh.UsedRange.Rows.Count
    NoFact = 0
     
     
    ' Récupération des données de la feuille pour les injecter dans le document.
    For i = 2 To iR
        If NoFact <> xlSh.Cells(i, 2) Then
            stDocName = "c:\temp\" & xlSh.Cells(i, 2) & "-" & Format(Date, "yy-mm-dd") & ".docm"
            oDoc.Close
            Set oDoc = Documents.Add("C:\Documents and Settings\Olivier\Application Data\Microsoft\Templates\pub1.dotm")
            oDoc.Bookmarks(1).Range.Text = xlSh.Cells(i, 1)
            oDoc.Bookmarks(2).Range.Text = xlSh.Cells(i, 2)
            oDoc.Bookmarks(3).Range.Text = xlSh.Cells(i, 3)
            Set oTbl = oDoc.Tables(1)
            oTbl.Rows.Add
            oTbl.Rows.Last.Cells(1).Range.Text = xlSh.Cells(i, 4)
            oTbl.Rows.Last.Cells(2).Range.Text = xlSh.Cells(i, 5)
            Set oTbl = Nothing
            oDoc.SaveAs stDocName
            'Affectation du nouveau numéro de facture pour la comparaison
            NoFact = xlSh.Cells(i, 2)
        Else
            Set oTbl = oDoc.Tables(1)
            oTbl.Rows.Add
            oTbl.Rows.Last.Cells(1).Range.Text = xlSh.Cells(i, 4)
            oTbl.Rows.Last.Cells(2).Range.Text = xlSh.Cells(i, 5)
            Set oTbl = Nothing
            oDoc.Save
        End If
    Next i
     
    oDoc.Close
     
    Set oDoc = Nothing
    GestErr:
    'Si pas de document ouvert on fait un resume next
    If Err.Number = 91 Then Resume Next
    Debug.Print "Erreur : " & Err.Number & Err.Description
    xlWb.Close
    xlApp.Quit
    Set xlSh = Nothing
    Set xlWb = Nothing
    Set xlApp = Nothing
     
     
    End Sub
    (que j'ai adapté en modifiant les chemins d'accès (celui de ma base de donnée Excel, celui de mon "Template" qui est en fait mon fichier word.docm et j'ai aussi modifier le chemin qui à la base allait me générer un document dans c:/Temp/ pour l'envoyer ailleur.)

    Mon soucis c'est que maintenant le VBA me génère un code d'erreur : Erreur : 5941Le membre de la collection requis n'existe pas..
    Pour moi cette erreur provient du fait que le code d'exemple que j'ai copier/coller est adapté dans le cas d'un exemple avec 3 colonnes Excel, Or j'en utilise bien plus...

    Peut-être que sur ce point je me trompe totalement, vous avez des idées/suggestions ?

  3. #3
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Je dirais que la première chose à faire est de mettre cette ligne en commentaire:

    Tu relances la macro. Quand tu vas voir l'injure box du message d'erreur, tu cliques (impérativement) sur "Débogage"

    La ligne qui génère l'erreur va être en surbrillance, et tu vas pouvoir nous donner son numéro.

    Sinon, tout le reste va demeurer de la spéculation.
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Février 2017
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : Février 2017
    Messages : 15
    Points : 7
    Points
    7
    Par défaut
    Bonjour,

    Merci pour votre réponse.

    En mettant uniquement la ligne "On Error Goto GestErr" en commentaire, lorsque j'exécute j'obtiens une boîte de dialogue qui s'ouvre avec la seule possibilité de cliquer sur "ok" ou "aide" et il est écrit :

    "Erreur d'exécution '91': Variable objet ou variable de bloc With non définie"

    Si j'exécute le débogage "pas à pas" pratiquement chaque ligne s'illumine en jaune...

    De plus si je place l'ensemble du code qui me semble être relatif aux erreurs en commentaires à savoir :

    'On Error GoTo GestErr
    'GestErr:
    'Si pas de document ouvert on fait un resume next
    'If Err.Number = 91 Then Resume Next
    'Debug.Print "Erreur : " & Err.Number & Err.Description

    Le script me renvoi la même erreur :
    "Erreur d'exécution '91': Variable objet ou variable de bloc With non définie"

    Je ne l'ai peut-être pas correctement précisé mais lorsque je lance mon script de base bien que dans la fenêtre "execution" une erreur s'affiche à savoir : "Erreur : 5941Le membre de la collection requis n'existe pas.".

    Je profite tout de même de l'ouverture d'un nouveau document word avec 1 donnée (correspondant à mon 1er champ de ma 1ère feuille, à savoir un "Id")... Mais toute ma structure présente dans mon fichier word.docm a disparue.

    Il peut éventuellement être utile que je vous explique la structure de ma base de donnée excel :

    2 feuilles :
    1ere "Patient" avec 1ere colonne "IdMutuelle" et 2eme "IdPatient" suivie de 32 autres colonnes avec des informations relatives aux patients.
    2eme "Mutuelle" avec 1ere colonne "IdMutuelle" suivie (pour le moment de 5 colonnes relatives à des informations sur les mutuelles.

    Le fameux chiffre qui me reviens dans un nouveau document word après exécution de mon script en VBA correspond à une "IdMutuelle"...

    Voila j'espère que cela pourra vous aider un peu à y voir plus clair.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Février 2017
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : Février 2017
    Messages : 15
    Points : 7
    Points
    7
    Par défaut
    Bonjour à tous,

    Je reviens vers vous concernant mon problème afin d'essayer de faire évoluer les choses qui stagnes un peu.

    J'ai cogité sur l'un de mes problèmes en particulier, à savoir la structure de ma base de donnée sous Excel pour la gestion des dates.

    Je m'explique, l'objectif est d'incorporer dans ma base de donnée la gestion des jours de présences pour les pensionnaires et ce mensuellement, mais étant donné qu'il s'agit d'informations récurrentes, je souhaiterais les exploiter sur une année entière que j'actualiserai une fois par an.

    Voici mes pistes de réflexions actuelles :

    1) Je rajouterai une 3eme feuille à mon fichier Excel qui contiendrait 366 colonnes, 1 avec l'ID des patients et 365 autres qui correspondrait à chaque fois à un jour de l'année. je pourrais ensuite éventuellement placer des "x" dans les cases qui correspondent à la présence de tel pensionnaires à tel date.

    J'ignore comment exploiter ces données par contre, je m'interroge sur le fait de savoir si en VBA il sera possible par la suite d'exploiter ces "x" pour en ressortir au final des dates...

    De plus je crains que dans ce système, la base de donnée ne deviennent particulièrement "lourde".

    2) Afin d'éviter le problème de gérer une troisième feuilles Excel dans ma base de donnée, je pourrais ajouter dans ma table patient 12 colonnes avec les mois.

    Pour chaque mois j'encoderai donc simplement les jours avec un séparateur de type "-" ou ";", il me faudrait ensuite exploiter les cellules le nombre de fois nécessaire à chaque fois que je rencontre un séparateur pour indiquer une date supplémentaire dans mon document.

    L'avantage c'est que sur cette méthode je n'alourdi pas trop ma base de donnée, par contre j'ignore s'il est possible d'exploiter comme ce serait nécessaire une cellule en fonction des séparateurs qui se trouvent à l'intérieur...

    Mon problème récurrent est mon manque de connaissances en VBA pour ce sujet car j'ignore ce qui est possible ou non...

    3) Ma dernière pistes serait de travailler par mois, je rajouterais 12 feuilles à mon fichier Excel, chaque feuille représentant un mois de l'année, dans chaque feuille je n'aurais donc que le nombre de jours du mois et une colonne supplémentaire pour l'ID du pensionnaire...

    Si le nombre de feuilles dans le fichier Excel n'est pas un problème pour le VBA et/ou s'il est possible de sélectionner uniquement une feuille en particulier chaque mois, cette solution me semble la plus adaptée pour réduire la surcharge de donnée par feuille.

    Par contre une nouvelle fois, j'ignore ce qui est exploitable via le VBA par la suite.

    Autre question, qu'est ce qui serait le mieux, encoder dans chaque cellule la date entière de présence pour l'exploiter tel quel ou passer par un signe de type "x" (voir le nombre qui correspondrait au jour calendrier) afin de créer une programmation derrière qui au final me retournerait une date "standard" ?


    Bref vous l'aurez compris, je réfléchis beaucoup mais je progresse très peu, j'aimerais inverser cette tendance et pour ce faire j'ai besoin de vos précieux conseils !

    Merci d'avance !

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Février 2017
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : Février 2017
    Messages : 15
    Points : 7
    Points
    7
    Par défaut
    Un petit up du sujet !

    Un expert dans le coin pour m'aider dans mon problème/projet ?

Discussions similaires

  1. [XL-2007] Vba excel publipostage supprimer une ligne dans word
    Par scoubi77 dans le forum Excel
    Réponses: 2
    Dernier message: 19/08/2015, 22h16
  2. [XL-2010] un gros projet en Excel 2010 VBA
    Par PingouinJaune dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 15/10/2014, 13h17
  3. Transfert données word=>excel en vba
    Par niko67 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 04/05/2010, 23h06
  4. faisabilité lecture Word->Excel par VBA
    Par shedly dans le forum Général VBA
    Réponses: 1
    Dernier message: 08/08/2008, 07h50
  5. [VBA-E-W]Publipostage Word Excel
    Par Yolak dans le forum VBA Word
    Réponses: 5
    Dernier message: 28/05/2007, 09h29

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