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 Access Discussion :

Export requête vers Word tronque memo à 255 [AC-2003]


Sujet :

VBA Access

  1. #1
    Candidat au Club
    Homme Profil pro
    Gestionnaire de parc micro-informatique
    Inscrit en
    Octobre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Gestionnaire de parc micro-informatique
    Secteur : Services de proximité

    Informations forums :
    Inscription : Octobre 2011
    Messages : 6
    Points : 4
    Points
    4
    Par défaut Export requête vers Word tronque memo à 255
    Bonjour tout le monde,
    tout d'abord désolé si ma question est banale, a déjà été vue 1000 fois, etc ... mais j'ai beau lire beaucoup d'articles, de tuto et de forum, je ne trouve pas de solution à mon probléme ....
    tout d'abord bis : je ne suis pas programmeur, ne sait pas coder, je bidouille avec le code existant d'une base crée il y a 10ans par un partenaire. Je tente de maintenir la bdd et de l'améliorer au fur et à mesure (nous sommes une association).

    voilà le probléme :
    une base de données d'usagers, avec données administratives, date de rdv et mémo du contenu du rdv. Un autre formulaire "volant" me permet de choisir un type de courrier et en cliquant sur le bouton, me génére un courrier pour l'usager en cours, appelle un doct Word modéle (type publipostage avec les champs genre {{nom}} etc ..) ; tout se passe bien sauf que le commentaire est tronqué à 255 carac.

    voici le code appelé par le clic-bouton

    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
    Private Sub Commande0_Click()
    On Error GoTo Err_Commande0_Click
     
        Dim NOMLET As String
        Dim NOMREQ As String
        Dim PARAM As String
     
        NOMLET = Libellé.Column(1)
        NOMREQ = Libellé.Column(2)
        PARAM = Eval(Libellé.Column(5))
     
    'Function OuvreLettreType(LaRequete As String, LeDOC As String, Parametre As String) As Boolean
    'les paramètres sont du type "NOM_PARAM1=VALEUR_PARAM1;NOM_PARAM2=VALEUR_PARAM2;..."
     
       Call OuvreLettreType(NOMREQ, NOMLET, "PARAMETRE=" & PARAM)
     
    Exit_Commande0_Click:
        Exit Sub
     
    Err_Commande0_Click:
        MsgBox Err.Description
        Resume Exit_Commande0_Click
     
    End Sub
    puis la fonction ouvrelettretype qui suit (un module) :

    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
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    Public Function OuvreLettreType(LaRequete As String, LeDOC As String, Parametre As String) As Boolean
     
    'les paramètres sont du type "NOM_PARAM1=VALEUR_PARAM1;NOM_PARAM2=VALEUR_PARAM2;..."
     
    Dim PathDot As String
     
    Dim Rst As DAO.Recordset
    Dim MyReq As DAO.QueryDef
    Dim objWord As Object
    Dim objDoc As Object
    Dim LeChamps As DAO.Field
    Dim LesParams() As String
    Dim Couple() As String
    Dim i As Integer
    Dim TempValeur As Variant
     
     
        OuvreLettreType = False
     
        PathDot = DLookup("Chemin", "tblLink", "Base='PathDot'")
        If Dir(PathDot & LeDOC) = "" Then
            MsgBox "Le model de ce courrier '" & LeDOC & "' est introuvable." & vbCrLf & _
            "Vérifiez s'il n'a pas été supprimé, déplacé ou renommé.", vbCritical, "Erreur"
            Exit Function
        End If
     
        DoCmd.Echo True, "Génération de la lettre en cours..."
    ' faire du pointeur de la souris un sablier (ou autre) avec Hourglass
        DoCmd.Hourglass True
     
        On Error GoTo err_req
        'ouverture de la requête qui va servir à la création du document
        Set MyReq = CurrentDb.QueryDefs(LaRequete)
     
        'affectation des paramètres
        LesParams = Split(Parametre, ";")
        For i = 0 To UBound(LesParams)
            Couple = Split(LesParams(i), "=")
            MyReq.Parameters(Couple(0)) = Couple(1)
        Next i
     
        'création d'un recordset sur la requête
        Set Rst = MyReq.OpenRecordset
        On Error GoTo 0
     
        'création d'un objet word
        Set objWord = CreateObject("Word.Application")
        'ajout d'un nouveau document basé sur le model passé en paramètre
        Set objDoc = objWord.Documents.Add(Template:=PathDot & LeDOC, _
        NewTemplate:=False)    'NewTemplate:=False, DocumentType:=0)
     
     
        'parcours de tous les champs de la requête
        For Each LeChamps In Rst.Fields
            'replacement de toutes les occurences "{{CHAMPS}}" du document par le contenu du même champs de la requête
            objWord.Selection.Find.ClearFormatting
            objWord.Selection.Find.Replacement.ClearFormatting
            With objWord.Selection.Find
                .Text = "{{" & LeChamps.Name & "}}"
                TempValeur = Rst(LeChamps.Name)
                'formatage de la date (s'il s'agit d'une date)
                If IsDate(TempValeur) Then TempValeur = CStr(Format(TempValeur, "dd/mm/yy"))
                .Replacement.Text = IIf(IsNull(TempValeur), "", TempValeur)
                .Forward = True
                .Wrap = wdFindContinue
                .Format = False
                .MatchCase = False
                .MatchWholeWord = False
                .MatchWildcards = False
                .MatchSoundsLike = False
                .MatchAllWordForms = False
            End With
            objWord.Selection.Find.Execute Replace:=wdReplaceAll
        Next LeChamps
     
        '{{AUJOURDHUI}}
        objWord.Selection.Find.ClearFormatting
        objWord.Selection.Find.Replacement.ClearFormatting
        With objWord.Selection.Find
            .Text = "{{AUJOURDHUI}}"
            .Replacement.Text = CStr(Format(DATE, "dddd dd mmmm yyyy"))
            .Forward = True
            .Wrap = wdFindContinue
            .Format = False
            .MatchCase = False
            .MatchWholeWord = False
            .MatchWildcards = False
            .MatchSoundsLike = False
            .MatchAllWordForms = False
        End With
        objWord.Selection.Find.Execute Replace:=wdReplaceAll
     
        'repassage des bouton de défilement en mode page (il était en mode rechercher à cause de la manip' précédante)
        objWord.Application.Browser.Target = wdBrowsePage
     
        'apparition de Word
        objWord.Visible = True
     
        'libération de tous les objects
        Set Rst = Nothing
        Set MyReq = Nothing
        Set objWord = Nothing
        Set objDoc = Nothing
        Set LeChamps = Nothing
     
        DoCmd.Hourglass False
     
        OuvreLettreType = True
     
        Exit Function
     
    err_req:
        DoCmd.Hourglass False
        'libération de tous les objects
        Set Rst = Nothing
        Set MyReq = Nothing
        Set objWord = Nothing
        Set objDoc = Nothing
        Set LeChamps = Nothing
        MsgBox "Une erreur s'est produite lors de l'ouverture des données nécessaires à la génération de la lettre." & vbCrLf & _
            "L'erreur est la suivante : " & Err.Description, vbCritical, "Erreur"
     
    End Function
    J'ai tenté de faire ma requête dans le vba directement (à priori, un sujet evoquait la possibilité de régler le pb) or, j'ai bisouillé sans succés, et c'est impratiquable dans l'absolu (car plusieurs modéles de courriers ... et plusieurs requêtes permettant de générer les données )
    On évoque la concaténation, mais je n'ai pas compris la procédure pour cela (code pour choper les 255 premiers dans le champ, puis les 255 suivants dans un autre ... et comment les placer dans word ? ...)
    J'ai tenté de disséquer les rst, variant et compagnie mais n'ai franchement pas le niveau ..
    Il n'y a pas de traitement dans la requete (pas de groupement) mais cette derniere est elle-même basée (en partie) sur une autre requete qui, ELLE, subie un traitement : certain champ sont en "groupement", d'autre en "compte", "dernier", et mon MEMO est quant à lui en "Premier" .... MAIS ..... ma requéte me sort bien la totalité des caractéres lorsque je la génére, et pour info, j'arrive bien à sortir un etat avec un champ contenant bien la totalité de mon commentaire (plus de 255 caractéres), c'est lors de l'export vers word que ça bloque (mon courrier se génére mais le commentaire est tronqué).

    voiiiilà, je galéééére comme un âne !

    Voilà j'en appelle à votre serviabilisme voir même votre serviabilitude que je constate grands sur ce forum !
    Bien à vous. christophe

  2. #2
    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,

    C'est comme cela pour une raison technique que j'ai oubliée. Je pense, mais je ne peux pas le jurer, que c'est lié au protocole OLEDB ou à OLE. C'est pareil entre Access et Excel. Quant à savoir s'il y a une solution de contournement, je ne connais pas assez Access pour le dire.
    À 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.

  3. #3
    Expert éminent
    Homme Profil pro
    Webplanneur
    Inscrit en
    Octobre 2007
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Réunion

    Informations professionnelles :
    Activité : Webplanneur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 262
    Points : 6 561
    Points
    6 561
    Par défaut
    Salut
    Sur msdn beaucoup de commentaires indiquent que c'est probablement un problème de canal de communication entre les applis mso.
    Et pour contourner le problème, il renvoie systématiquement sur ce site.

    Tu dois être en OLEDB ou OLE. As-tu essayé avec DDE ? Sait-on jamais.
    Sinon, l'idée d'éclater le champ Memo avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Memo1=Mid([MonChampMemo],1,250)
    Memo2=Mid([MonChampMemo],251,250)
    ...
    est une alternative. Suffit de supprimer la champ de fusion Memo et le remplacer par la mise bout à bout des memo1, Memo2, etc.
    "Le savoir est la seule matière qui s'accroit quand on la partage" (Socrate)
    UR - ESIROI - GPME/CG/DCG8
    QTH :21°19'18"S - 055°25'32"E
    Inutile de me contacter par MP
    Merci de cliquer sur si la réponse vous a permis de résoudre votre problème et n'oubliez pas de clôturer le fil en cliquant sur

  4. #4
    Candidat au Club
    Homme Profil pro
    Gestionnaire de parc micro-informatique
    Inscrit en
    Octobre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Gestionnaire de parc micro-informatique
    Secteur : Services de proximité

    Informations forums :
    Inscription : Octobre 2011
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    salut clementmarcotte et hyperion,

    Pour précision, juste avant le transfert sur word, une message box sur la valeur de mon memo me donne bien plus de 255 caractéres ; par contre in-fine, le document word n'est pas généré et access m'affiche une boite de dialogue : "parametre de la chaine trop long"
    je souhaite scinder mon champ pour l'exporter en plusieurs troncons de 255 comme hyperion le suggére, mais là c'est chaud car le nom des champs sont recupérés et remplacés dans word par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      For Each LeChamps In Rst.Fields
            'replacement de toutes les occurences "{{CHAMPS}}" du document par le contenu du même champs de la requête
            objWord.Selection.Find.ClearFormatting
            objWord.Selection.Find.Replacement.ClearFormatting
            With objWord.Selection.Find
                .Text = "{{" & LeChamps.Name & "}}"
                TempValeur = Rst(LeChamps.Name)
                .Replacement.Text = IIf(IsNull(TempValeur), "", TempValeur)
    Eventuellement, je peux tester le nom d'un champ, s'il s'agit d'un memo, je pourrais l'intercepter et l'eclater en plusieurs champ memo, du genre 'IIf(LeChamps.Name="nomduchampmemo" Alors, eclater TempValeur en plusieurs blocs de 255 et leur affecter un nom, puis les affecter à la suite dans word dans le champ LeChamp.name ...
    Ou alors mieux, ne pas tester les noms de champ et eclater tous les champs en "sous champ" de 255, et affecter les dits "sous champs" aux champs de word .... (rholala .... si vous me conmprenez vous êtes magiques ...)
    mais alors .. de primo, je ne sais pas si c'est possible ...... de secundo-tierso, je n'ai aucune idée du code necessaire pour cela .....

    ps : existe t-il un animal qui en chie plus qu'un âne .... parce que j'y suis là ...

  5. #5
    Candidat au Club
    Homme Profil pro
    Gestionnaire de parc micro-informatique
    Inscrit en
    Octobre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Gestionnaire de parc micro-informatique
    Secteur : Services de proximité

    Informations forums :
    Inscription : Octobre 2011
    Messages : 6
    Points : 4
    Points
    4
    Par défaut Solutions OK
    bon alors .. je ne pouvais pas passer par la porte, et j'ai vu de la lumière dans la cheminée ...
    j'ai résolu le probléme sur le principe de l'éclatement préconisé par HYPERION QUE JE REMERCIE !!!

    donc voilà ce que j'ai fais :
    1. je n'ai pas touché à mon VBA ...
    2. j'ai tout simplement été dans ma requête source, et ai découpé les champ mémo en bloc de 250 (oui c'est un chiffre rond .. ... préfére plutot que 255 ....)


    Pour les newbies comme moi :
    1. je remplace le nom de mon champ (ici NOMMEMO) par une expression : NOMMEMO devient donc memo1: ExtracChaîne([NOMMEMO];1;250) puis crée une nouvelle colonne dans ma requete,et insére memo2: ExtracChaîne([NOMMEMO];251;250) etc si on veut aller au delà de 500 caractéres (....501;250)....etc ...
      où le premier chiffre est l'endroit du texte où je veux commencer à récupérer, et le 2ieme est la longueur du texte que je veux récuperer (je fais des blocs de 250 ici)
    2. Dans mon document word, je remplace mon champ {{NOMMEMO}} par {{memo1}}{{memo2}} ....


    Voilà

    Merci pour votre serviabilisme et notamment HYPERION qui m'a mis sur la voie avec le MID (mid et extracchaine sont la meme chose de ce que je crois comprendre) (

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

Discussions similaires

  1. [Access] Export enregistrements vers Word
    Par PhRey dans le forum Access
    Réponses: 17
    Dernier message: 21/12/2006, 07h43
  2. Réponses: 3
    Dernier message: 12/09/2006, 05h54
  3. Exporter DataReport vers Word
    Par badrel dans le forum VBA Word
    Réponses: 2
    Dernier message: 23/12/2005, 08h33
  4. Réponses: 1
    Dernier message: 01/11/2005, 12h04
  5. [Access 2003] - Problème date dans requête
    Par Leesox dans le forum Access
    Réponses: 11
    Dernier message: 14/10/2005, 08h51

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