Tranfert de donnée word => word

Résolu
amv8 Messages postés 4 Date d'inscription samedi 6 janvier 2007 Statut Membre Dernière intervention 28 février 2007 - 27 févr. 2007 à 13:19
amv8 Messages postés 4 Date d'inscription samedi 6 janvier 2007 Statut Membre Dernière intervention 28 février 2007 - 28 févr. 2007 à 17:21
Salut à tous,

Je viens demander votre aide pour un problème qui me bloque depuis 2 jours déjà.

Je vous fais une rapide descritpion de la situation :

Je travaille actuellement sur un projet ou des gens doivent créer des cartes de lubrification pour des machines. Il existe un document word standard sur lequel on vient créer sa carte. Mon role est de simplifier la démarche, en attribuant automatiquement un numéro à la carte, en la classant dans le bon dossier (un dossier par machine), et surtout en ajoutant la description de la carte (numéro de la carte, équipement, angle de vue...) en en tête. J'ai donc créé un document word avec un formulaire dans lequel on vient remplir la description de la carte. Le problème est sur le transfert de ces infos dans le document standard. Actuellement je crée une copie du document standard à laquelle j'attribue le bon nom et que je range dans le bon dossier, le problème est ensuite de transferrer les donnée du formulaire dans l'entête de la carte modifiée. Je crée un fichier .ini dans lequel je stocke les données du formulaire mais je n'arrive pas ensuite à demander le transfert de ces données vers la carte ( j'ai créé des textbox sur cette carte aux emplacements censés recevoir les infos).

Si quelqu'un peut m'aider ça serait vraiment sympa. N'ésitez pas a me demander plus d'infos si ce n'est pas clair.

Je vous joinds mon code de ma sub:

Private Sub UsfValider_Click()


Dim WordApp As Word.Application
Dim WordDoc As Word.Document



'On test le repertoire du module
   
    If Dir$("C:\Cartes" & UsfListBoxModule.Value, vbDirectory) = vbNullString Then
   
    'le répertoire n'existe pas, on le crée
           
            MkDir "C:\Cartes" & UsfListBoxModule.Value
   
    Else
   
    'le répertoire existe
   
    End If
   
'On teste le repertoire de la ligne


    If Dir$("C:\Cartes" & UsfListBoxModule.Value & "" & UsfTxtNumLign.Value, vbDirectory) = vbNullString Then
   
            MkDir "C:\Cartes" & UsfListBoxModule.Value & "" & UsfTxtNumLign.Value
   
    Else


    End If



'On teste si le nom de la carte n'existe pas déjà


    If Not Dir$("C:\Cartes" & UsfListBoxModule.Value & "" & UsfTxtNumLign.Value & "" & UsfTxtEquip.Value & ".doc") = vbNullString Then


            MsgBox ("Nom de l'équipement déjà utilisé pour cette ligne")


    Else


    End If



'On fait une copie du standard pour pouvoir dessiner sa carte


FileCopy "C:\Cartes\Cartes_standard_modif.doc", "C:\Cartes" & UsfListBoxModule.Value & "" & UsfTxtNumLign.Value & "\Carte - " & UsfTxtEquip.Value & ".doc"




Set WordApp = CreateObject("Word.Application")
WordApp.Visible = True
Set WordDoc = WordApp.Documents.Open("C:\Cartes" & UsfListBoxModule.Value & "" & UsfTxtNumLign.Value & "\Carte - " & UsfTxtEquip.Value & ".doc", ReadOnly:=False)



'Je crée un fichier ini ou je viens stocker les donnée du formulaire


Open "C:\Cartes\tranfert.ini" For Output As #2
    Print #2, num
    Print #2, UserForm1.UsfTxtNumLign.Value
    Print #2, UserForm1.UsfTxtEquip.Value
    Print #2, UserForm1.UsfTxtVue.Value
Close #2



'Emplacements sur la carte ou je viens afficher les infos


ThisDocument.TxtNumLign.Value = num
ThisDocument.TxtEquip.Value = UserForm1.UsfTxtEquip.Value
ThisDocument.TxtVue.Value = UserForm1.UsfTxtVue.Value
ThisDocument.TxtNumLign.Value = UserForm1.UsfTxtNumLign.Value


Carte_standard_modif.ThisDocument.TxtNumCarte.AutoSize = True
Carte_standard_modif.ThisDocument.TxtNumLign.AutoSize = True
Carte_standard_modif.ThisDocument.TxtEquip.AutoSize = True
Carte_standard_modif.ThisDocument.TxtVue.AutoSize = True




End Sub

7 réponses

cs_loulou69 Messages postés 672 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 2 juin 2016 1
28 févr. 2007 à 12:11
Accès à une zone marqué d'un signet que le code remplace

Selection.GoTo What:=wdGoToBookmark, Name:="Signet" 
ou A
ctiveDocument.Bookmarks("Signet").Range.Select

' ajout d'un paragraphe
Selection.TypeParagraph

' deplacement du curseur d'insertion
Selection.MoveUp Unit:=wdLine, Count:=1


Insérer un texte
Selection.TypeText Text:="Carte N°" & ...
3
cs_loulou69 Messages postés 672 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 2 juin 2016 1
27 févr. 2007 à 16:15
Bonjour


Je sui désolé, je ne réponds pas à ta question pourquoi cela ne fonctionne pas mais je te propose d'essayer une autre solution : ma solution : jete proposer de stocker les informations dans le document lui-même (signet ou champs de personnalisation), le fichier Ini j'aime pas trop, j'ai déjà fait un tel projet et j'ai préfèré faire une macro qui récupère toutes les infos dans tous les fichiers -> Ces infos peuvent être alors stockées sous forme de fichier Ini de table dans une base de données, ....

 Solution 1:  charger les informations dans des champs de personnalisation


'Création manuelle du champ personnalisé : Fichier/ Propriété/ Personnalisation / Nom : saisir "NumLigne" type "Texte", la valeur et cliquer sur "Ajouter"
dans le document Word  à l'emplacement prévu Insertion/ Champ/ DocProperty : sélectionner : Numligne


comme la valeur "num" provient d'un fichier .INI, voici l'automatisation :


'Création automatique en VBA de la même propriété personnalisée:   
ActiveDocument.CustomDocumentProperties.Add Name:="Numligne", LinkToContent:=False, Type:=msoPropertyTypeString, Value:=num


'Insertion automatique du champ qui affiche la valeur du champ personnalisé
Positionne le pointeur sur le lieu d'insertion
    Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, Text:= _
        "DOCPROPERTY  Numligne ", PreserveFormatting:=True


Solution 2: charger les informations dans des signets (Bookmarks) ActiveDocuments.Bookmarks.add .....


Je ne te répondrais pas ce jour mais demain si tu as d'autres questions
0
amv8 Messages postés 4 Date d'inscription samedi 6 janvier 2007 Statut Membre Dernière intervention 28 février 2007
28 févr. 2007 à 10:05
Salut,

Tout d'abord merci pour ton aide car mon message n'était pas forcément clair. Comme tu le suggères, passer par un fichier ini n'est peut etre pas nécessaire et ta solution ( la solution 1 ) me semble convenir. Néanmoins j'ai une erreur d'automation lors de la création du champs, et je n'arrive pas à voir d'où vient cette erreur. Ce qui me semble étrange c'est que lorsque je tape le code habituellement à chaque "." vba me propose une liste de commandes et la ça s'arrète après ActiveDocument.CustomDocumentProperties , le Add n'est pas proposé et du coup je ne connais pas non plus les propriétés à remplir. Cela est-il normal ( je débute en vba et je m'appuie donc beaucoup sur les aides fournies par le logiciel).
Si il est possible de résoudre  ce problème,après, comment postioner le champs  dans la feuille à l'aide du code?

Merci de ton aide !
0
cs_loulou69 Messages postés 672 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 2 juin 2016 1
28 févr. 2007 à 10:32
Bonjour

Je suis là au rendez-vous

Pour l'utilisation de l'aide dès que l'on frappe sur "." VBA ne fournit pas les propriétés disponibles (je viens de vérifier le cas de CustomDocumentProperties).

Effectivement pour positionner le curseur pour l'insertion c'est un peu acrobatique
Mais si le champ est prédéfini dans un modèle .dot et déjà positionné la création avec Add n'est pas utile puisqu'elle a été faite manuellement et le document mais à jour le champ dès lors que le champ est mis à jour par ActiveDocument.DocumentProperties("num") .value= valeur requise et que avant l'enregisterment du document est appelé le code suivant : ActiveDocument.Fields.Update
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
amv8 Messages postés 4 Date d'inscription samedi 6 janvier 2007 Statut Membre Dernière intervention 28 février 2007
28 févr. 2007 à 10:44
Merci de ta réponse aussi rapide,

J'ai essayé ce que tu m'as indiqué et cela marchait. Le problème est que les champs à modifier doivent être situés dans l'entête du document, et je n'arrive pas à inserrer un champs dans l'entête. Donc je pense faire plus simple en inserrant directement mon texte dans l'entête avec un code du type :

WordApp.Selection.HeaderFooter ??? "Carte n°" & num & " L " & NumLigne &

Le problème est comme tu peux le voir je ne trouve pas la bonne commande pour inserer le texte dans l'entête du document.

Je crois que si tu peux m'aider la dessus, le problème sera résolu !
Je sollicite donc encore tes services.... merci !
0
cs_loulou69 Messages postés 672 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 2 juin 2016 1
28 févr. 2007 à 11:52
Activer la zone d'entete:

ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageHeader

Activer le corps du document (si besoin)

     If ActiveWindow.ActivePane.View.Type = wdNormalView _
     Or ActiveWindow.ActivePane.View.Type = wdOutlineView _
     Or ActiveWindow.ActivePane.View.Type = wdMasterView Then
        ActiveWindow.ActivePane.View.Type = wdPageView
     End If

Mettre à jour les zones d'entete et de pied de page (utile avec les champs personnalisé avant enregistrement

    ActiveDocument.PrintPreview
    ActiveDocument.ClosePrintPreview
0
amv8 Messages postés 4 Date d'inscription samedi 6 janvier 2007 Statut Membre Dernière intervention 28 février 2007
28 févr. 2007 à 17:21
C'est bon j'ai enfin terminé,
Finalement je n'ai pas utilisé les entêtes (je n'avais pas encore vu ta réponse), j'ai donc fais un simple texte avec encadrement et alignement centré. Le résultat est plutot convaincant puisque cela m'a permis d'utiliser une police différente pour chacune des informations affichées.
En tout cas je te remercie puisque finalement je n'utilise pas de fichier intermédiaire et tes conseils m'ont été bien utiles pour comprendre l'automation d'office.

J'affiche mon code qui est plutot lourd mais ça donnera peut etre des idées pour les optimisateurs !

Merci encore pour ton aide loulou69

Mon code :

'transfert et écritures des infos dans la carte


WordApp.Selection.Borders.Enable = True
WordApp.Selection.Borders.OutsideLineWidth = wdLineWidth050pt
WordApp.Selection.Paragraphs.Alignment = wdAlignParagraphCenter
WordApp.Selection.Font.Size = 24
WordApp.Selection.Font.Bold = True
WordApp.Selection.Font.Name = "Arial"
WordApp.Selection.TypeText "Carte No." & num&
WordApp.Selection.Font.Bold = False
WordApp.Selection.TypeText "  L "
WordApp.Selection.TypeText UserForm1.UsfTxtNumLign.Value
WordApp.Selection.Font.Bold = True
WordApp.Selection.TypeText " - "
WordApp.Selection.TypeText UserForm1.UsfTxtEquip.Value
WordApp.Selection.TypeText " - "
WordApp.Selection.Font.Bold = False
WordApp.Selection.Font.Italic = True
WordApp.Selection.TypeText UserForm1.UsfTxtVue.Value
0
Rejoignez-nous