récupérer des données dans plusieurs tableaux et piloter word en conséquence

cgpa

XLDnaute Occasionnel
Voici la problématique:
A partir de plusieurs tableaux dans un seul fichier excel, il s'agit de sélectionner une entrée (ex. coordonnées d'un fournisseur) et utiliser une boite de dialogue pour récupérer des données d'autres tableaux (ex. chantier concerné, coprs de métier ou produit, nom de l'encodeur) afin d'ouvrir automatiquement un document word en relation avec l'une des entrées (ex. fichier "bon de commande" s'il s'agit d'un courrier fournisseur). Sur ce document doivent apparaître via des signets les données récupérées dans excel.

Bonjour Martial,

Pour les fichiers de base, je je joins ceux qui peuvent servir de cible à l'ouverture de word (basés sur la commande fournisseur). Ce sont de simples documents word dont l'en-tête sera identique à celui de la commande fournisseur sur lequel tu as travaillé (même position des signets). Il y a des fichiers différents car le contenu change (contenu que l'on adapte selon les courriers mais qu'on ne recopie pas toujours). Nous pouvons nous baser sur un document vierge: je placerai les signets.
Je joins par contre le fichier sur lequel tu as déjà beaucoup travaillé afin de bien comprendre la problématique si un utilisateur venait à lire ce post.

Je te remercie pour ta collaboration et te suhaite une bonne journée.
 

Pièces jointes

  • LISTE V3.xls
    74.5 KB · Affichages: 82
  • LISTE V3.xls
    74.5 KB · Affichages: 83
  • LISTE V3.xls
    74.5 KB · Affichages: 82
  • commande fournisseur.docx
    27 KB · Affichages: 66
  • commande fournisseur.docx
    27 KB · Affichages: 65
  • courrier divers.docx
    26.9 KB · Affichages: 62
  • commande fournisseur.docx
    27 KB · Affichages: 62
  • commande sous traitant.docx
    26.8 KB · Affichages: 57
Dernière édition:

Yaloo

XLDnaute Barbatruc
Re : récupérer des données dans plusieurs tableaux et piloter word en conséquence

Bonjour à tous,

Le sujet a été commencé ici et j'ai donc suggéré à cgpa de créer son propre post.

Félicitations, car pour un débutant, tu te débrouille très bien. :)

Bon, chez moi ça fonctionne, je te remet "Liste V3.xls" (modifier au niveau du bouton commandbutton1 dans "Liste") (pour finir, il n'y aura pas besoin de créer un second UserForm).

Dans le zip, tu trouveras 2 fichiers word : 1 pour commande fournisseur et 1 pour architecte. Dans le corps du texte, je t'ai juste mis le nom du fichier, les entêtes sont exactement les mêmes (à toi d'adapter). Demande si tu ne sais pas.

Mettre les 3 fichiers dans le même répertoire et lancer la macro en double-cliquant dans la feuille "contacts founisseur" ou en sélectionnant une ligne dans "liste commande" et en cliquant sur le bouton "Envoi vers Word".


A te relire

Martial
 

Pièces jointes

  • cgpa.zip
    50 KB · Affichages: 78
  • cgpa.zip
    50 KB · Affichages: 68
  • cgpa.zip
    50 KB · Affichages: 71

cgpa

XLDnaute Occasionnel
Re : récupérer des données dans plusieurs tableaux et piloter word en conséquence

Bonjour Martial, bonjour à tous,

Je te remercie vivement pour le travail accompli: l'objectif excel est atteint et cela fonctionne parfaitement avec ces trois fichiers. Tu as très bien compris mon objectif. Je vais maintenant tenter d'adapter moi-même le code pour les autres documents de sortie. Je te tiens informé de la suite y apportée. Je vais pouvoir adapter d'autres documents avec ces codes: quel gain de temps! Encore merci et bonne journée.
A bientôt,
Patrick.
 

cgpa

XLDnaute Occasionnel
Re : récupérer des données dans plusieurs tableaux et piloter word en conséquence

Bonjour Martial,
J'adapte le document, mais je cherche à comprendre ce que tu as fait. Peux-tu m'expliquer ceci:
For i = 2 To 12 ' copie les données des cellules 2 à 12 de la feuille contact
.Bookmarks("Signet" & i).Range = Ws3.Cells(DerLWs3, i + 4) ' que signifie i? et pourquoi+4? qu'il insère à partir de la cellule 5?
Next
End With
With Document_Type
For i = 21 To 22 'où va-t-il rechercher 21 to 22? dans la feuille 2?
.Bookmarks("Signet" & i).Range = Ws3.Cells(DerLWs3, i - 19) 'que signifie i-19?
Next i
End With
Document_Type.Bookmarks("Signet30").Range = "Cde " & Year(Now) & " " & Ws3.Cells(DerLWs3, 7) & " " & Ws3.Cells(DerLWs3, 1) & " " & Ws3.Cells(DerLWs3, 17)
' j'aimerais dans ce signet 30 ne garder que les 4 chiffres de la date encodée dans l'userform: est-ce possible? Selon la formule actuelle il envoie l'année en cours vers word. Mais si je veux antidater ou postdater, ce n'est pas possible sauf s'il reprend la date que j'encode dans l'userform.

Je te remercie pour ton éclairage!
Bonne journée.
 

cgpa

XLDnaute Occasionnel
Re : récupérer des données dans plusieurs tableaux et piloter word en conséquence

Bonsoir Martial,
J'ai cherché, fait des essais dans tous les sens, et ai fini par trouver quelques solutions et réponses aux questions que j'avais posées ci-avant.
J'ai compris le système du i+ ou i-: les données ne correspondaient plus et j'avais un problème pour les signets dans word mais cela est maintenant résolu.
Par contre, je désirais avoir dans word des données qui avait été encodées dans l'userfom (ate d'encodage, "concerne") et apparaissaient dans la feuille 3. J'ai adapté le code comme repris ci-dessous en ajoutant les signets 31 et 32 juste après le signet 30 que tu avais encodé: cela fonctionne, mais était-ce la bonne façon de faire?
Document_Type.Bookmarks("Signet31").Range = Ws3.Cells(DerLWs3, 2) 'essai d'ajout d'un signet n°31 pour envoyer la date reprise feuille 3 cellule 2
Document_Type.Bookmarks("Signet32").Range = Ws3.Cells(DerLWs3, 18) 'essai d'ajout d'un signet n°32 pour envoyer le contenu de la cellule 18 de la feuille 3 = "concerne"

Il me reste la question de la date: dans le signet 30 la date est celle de l'année au moment actuel. Je désire pouvoir reprendre les 4 chiffres de l'année de la date qui a été encodée dans l'userform (je peux par ex. en 2013 refaire une commande avec une date de 2012!). Est-ce possible?

Mes essais actuels portent sur le fichier "commande fournisseur". Je m'attaquerai demain aux autres fichiers!

Enfin, dans ma quête du "toujours plus vite en moins de clics", sais-tu s'il est possible une que fois que le fichier word est ouvert que la boite d' "enregistrement sous" s'ouvre automatiquement et colle dans le nom de fichier le contenu du signet 30? Je sais, je vois loin... Mais peut-être chercherai-je du côté des forum word...
Merci pour ta collaboration et passe une excellente soirée.
 

Pièces jointes

  • LISTE V3 - Copie.xls
    63 KB · Affichages: 75

Yaloo

XLDnaute Barbatruc
Re : récupérer des données dans plusieurs tableaux et piloter word en conséquence

Bonsoir Patrick, le forum,

Je vois que tu as avancé.

J'ai compris le système du i+ ou i-: les données ne correspondaient plus et j'avais un problème pour les signets dans word mais cela est maintenant résolu.

Le i correspond au N° de signet, comme la colonne associée est décalée de 4, c'est pour ça que j'écris i + 4.

C'est très bien si tu as compris ça, bravo, ce n'est pas toujours évident quand on commence.


Par contre, je désirais avoir dans word des données qui avait été encodées dans l'userfom (ate d'encodage, "concerne") et apparaissaient dans la feuille 3. J'ai adapté le code comme repris ci-dessous en ajoutant les signets 31 et 32 juste après le signet 30 que tu avais encodé: cela fonctionne, mais était-ce la bonne façon de faire?
Document_Type.Bookmarks("Signet31").Range = Ws3.Cells(DerLWs3, 2) 'essai d'ajout d'un signet n°31 pour envoyer la date reprise feuille 3 cellule 2
Document_Type.Bookmarks("Signet32").Range = Ws3.Cells(DerLWs3, 18) 'essai d'ajout d'un signet n°32 pour envoyer le contenu de la cellule 18 de la feuille 3 = "concerne"

Si tu mets DerLWs3 cela t'envoi les données de la dernière ligne de "liste commande", si tu veux la ligne de la cellule active, il faut écrire Activecell.row


Il me reste la question de la date: dans le signet 30 la date est celle de l'année au moment actuel. Je désire pouvoir reprendre les 4 chiffres de l'année de la date qui a été encodée dans l'userform (je peux par ex. en 2013 refaire une commande avec une date de 2012!). Est-ce possible?

Au lieu de mettre Year(Now) il faut mettre Year(Ws3.Cells(DerLWs3,2)) s'il s'agit de la dernière ligne ou Year(Ws3.Cells(Activecell.row,2)) s'il s'agit de la ligne correspondant à la ligne de la cellule active.

Enfin, dans ma quête du "toujours plus vite en moins de clics", sais-tu s'il est possible une que fois que le fichier word est ouvert que la boite d' "enregistrement sous" s'ouvre automatiquement et colle dans le nom de fichier le contenu du signet 30? Je sais, je vois loin... Mais peut-être chercherai-je du côté des forum word...
Merci pour ta collaboration et passe une excellente soirée.

Oui c'est possible, je regarde et reviens vers toi.

A+

Martial
 

Yaloo

XLDnaute Barbatruc
Re : récupérer des données dans plusieurs tableaux et piloter word en conséquence

Re,

Voici ton fichier avec une modification concernant 3 choses :

1 - Définition de la variable DerLWs3 dans la macro CommandButton1_Click de l'onglet "Liste commande". Cela permet de lancer la macro par le bouton si tu reviens sur ton fichier sans passer par l'UserForm1.

2 - Déclaration de la variable Nom, qui permet de remplir le Signet30 et d'enregistrer le fichier sous Word avec ce Nom.

3 - J'ai mis l'enregistrement dans le même répertoire mis bien sur il est possible de changer de répertoire et sous répertoire.

A te relire

Martial

PS : Si tu remets un fichier Excel, merci de mettre un fichier Word de façon à pouvoir mieux tester, car le fichier Word que j'ai date un peu.
 

Pièces jointes

  • LISTE V3.xls
    82 KB · Affichages: 67
  • LISTE V3.xls
    82 KB · Affichages: 67
  • LISTE V3.xls
    82 KB · Affichages: 63

cgpa

XLDnaute Occasionnel
Re : récupérer des données dans plusieurs tableaux et piloter word en conséquence

Bonjour Martial, bonjour à tous,
Un tout grand merci: tu as fait du très bon travail.
Les essais sont concluants.

J'ai à nouveau adapté certains codes de signets dans VB (par ex; le nom du fichier et le signet 30 pour la référence du document reprenant maintenant les initiales de l'employé encodeur).

Pour l'enregistrement automatique du fichier word, cela va au-delà de ma demande puisque le fichier word est direcement enregistré avec le bon nom dans le même répertoire. Il me reste à glisser ce document dans son répertoire final car dans notre cas, il nous est obligatoire d'enregistrer le document dans le dossier du chantier concerné. Dès lors, nous aurions voulu que la procédure s'arrête avec la boite de dialogue "enregistrer sous" ouverte avec le nom du fichier déjà encodé dans la case réservée à cet effet (ou du moins que l'on ait plus qu'à coller le nom qui aurait été automatiquement copié). Cela est-il possible? Dans le cas contraire, on glissera le fichier, c'est déjà très bien.
Juste pour information (et possibilité d'adapater d'autres documents): peux-tu me dire le code que tu utiliserais si tu voulais enregistrer automatiquement dans un répertoire précis?

Dans l'userform, on peut sélectionner la date dans le calendrier: c'est tb. Mais la date qui s'affiche par défaut est celle du 19/11/12: est-il possible de modifier pour que la date du jour s'affiche par défaut, mais toujours pouvoir utiliser le calendrier?

Pour le reste: rien à redire. Je joins le fichier de base excel et 2 modèles Word. Pour les autres fichiers modèles, cela ira pour les créer (je copie colle, renomme, puis modifie). J'ai ajouté des notes en vert dans le code pour celui ou celle qui, comme moi, est vraiment débutant et essaie de comprendre pour adapter selon ses besoins. Remarque: dans la version que tu m'as envoyée hier, le fichier modèle a une extension *.docx et sur mon pc mes fichiers modèles ont une extension *.doc: j'ai modifié le code car il buguait! Pour les deux fichiers word en pj, l'extension est en docx car ils ne passent pas en doc.

J'ai vraiement envie d'aller plus loin dans mes fichiers excel!
Je te remercie pour ta collaboration et te souhaite une bonne journée.
 

Pièces jointes

  • LISTE V3.xls
    92.5 KB · Affichages: 65
  • LISTE V3.xls
    92.5 KB · Affichages: 71
  • LISTE V3.xls
    92.5 KB · Affichages: 74
  • Architecte.docx
    26.7 KB · Affichages: 74
  • commande fournisseur.docx
    27.1 KB · Affichages: 71
  • commande fournisseur.docx
    27.1 KB · Affichages: 70
  • commande fournisseur.docx
    27.1 KB · Affichages: 66

ChTi160

XLDnaute Barbatruc
Re : récupérer des données dans plusieurs tableaux et piloter word en conséquence

Bonjour cgpa ,
bonjour le Fil
Bonjour le Forum

si je peux me permettre
pour ce qui est de changer la date (DTPicker1) à l'ouverture du Userform1
voila ce que j'ai ajouter dans la procédure Initialize du userform1
[highlight=VBa]Private Sub UserForm_Initialize()
With UserForm1
.DTPicker1 = Now
End With
End Sub[/code]
Bonne Journée
Amicalement
Jean marie
 

Yaloo

XLDnaute Barbatruc
Re : récupérer des données dans plusieurs tableaux et piloter word en conséquence

Bonjour Patrick, Jean-Marie, le forum,

Pour la date,

Private Sub UserForm_Initialize()
DTPicker1 = Now
End Sub

Cela devrait suffire.

Pour l'enregistrement, si les répertoires sont identiques sont aux noms de chantiers, on va créé directement le répertoire et copier le fichier dedans. Cela sera encore plus simple.

J'essaie de te faire ça entre 12 et 14h.

A+

Martial
 

cgpa

XLDnaute Occasionnel
Re : récupérer des données dans plusieurs tableaux et piloter word en conséquence

Bonjour à tous,
Martial, attention, dans notre cas le répertoire existe déjà et il ne faut pas en créer un nouveau! Est-il possible d'obliger word à ouvrir la boite "enregistrer sous", lui coller le nom du document, et s'arrêter là? De cette façon, on choisit manuellement le répertoire de destination. Je ne voudrais pas que tu perdes du temps à mettre au point quelque chose qui ne servirait pas: tu m'as déjà consacré pas mal de temps.
Merci pour l'info pour la date.
Bonne journée!
 

Yaloo

XLDnaute Barbatruc
Re : récupérer des données dans plusieurs tableaux et piloter word en conséquence

Re,

Alors le temps est déjà passé (mais pas très long) puisque j'allais poster le fichier, je te le mets quand même.
Je t'ai mis des explications pour chaque ligne, c'est à la fin du code.

Sinon, il est possible d'ouvrir la boite de dialogue "Enregistrer sous"* à l'ouverture ou à l'activation du fichier Word, cela veut dire par contre que ton fichier n'aura plus l'extension .docx mais .docm (acceptant les macros).

* Le nom du fichier ne sera pas inscrit dans la boite de dialogue. (à moins que je ne trouve la solution entre temps)

Cela existe peut être d'ouvrir la boite de dialogue directement d'Excel mais je n'ai pas encore trouvé.

A+

Martial
 

Pièces jointes

  • LISTE V3.xls
    84.5 KB · Affichages: 65
  • LISTE V3.xls
    84.5 KB · Affichages: 73
  • LISTE V3.xls
    84.5 KB · Affichages: 70

cgpa

XLDnaute Occasionnel
Re : récupérer des données dans plusieurs tableaux et piloter word en conséquence

Merci Martial: c'est très clair et fonctionne bien. C'est un code pour lequel l'usage est intéressant et servira à un collègue.
Je cherche également de mon côté pour voir si quelqu'un a déjà résolu ce problème d'ouverture de dialogue directement depuis excel, sinon je me contenterai de glisser le fichier d'un dossier à l'autre. J'ai déjà pas mal de boulot maintenant pour adapter le fichier type excel à mes propres fichiers, et préparer les documents word! Je reviendrai probablement avec l'une ou l'autre question de "traduction" du code, car il me tient à coeur de comprendre chaque ligne.
Bonne journée à toi, et encore merci
 

Yaloo

XLDnaute Barbatruc
Re : récupérer des données dans plusieurs tableaux et piloter word en conséquence

Re,

Une petite question, les noms de tes répertoires ne sont pas exactement les mêmes que les noms en colonne C de l'onglet "Liste commande" ?

Je suis au boulot, donc pas le temps de chercher.

Mais il serait possible dans un combobox dans l'UserForm1 de sélectionner le sous-répertoire dans lequel tu veux mettre ton fichier. Ensuite récupérer cette donnée pour enregistrer le fichier.

A+
 

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
312 206
Messages
2 086 219
Membres
103 158
dernier inscrit
laufin