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: 62
  • courrier divers.docx
    26.9 KB · Affichages: 62
  • commande fournisseur.docx
    27 KB · Affichages: 65
  • commande fournisseur.docx
    27 KB · Affichages: 66
  • commande sous traitant.docx
    26.8 KB · Affichages: 57
Dernière édition:

cgpa

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

Martial,

Je profite d'un moment de relâche pour essayer d'avancer sur ce fichier. Je te remercie pour ton aide et sois sûr qu'il n'y a pas d'urgence ici pour avancer. Toute avancée n'est plus que pur boni!

Réponse à ta quetsion: les documents de sortie word sont placés dans des répertoires au nom du chantier. Mais dans le fichier excel que l'on utilise, sera indiqué dans la cellule du chantier : le nom du chantier avec son adresse et autres renseignements (une petite ligne de texte). Tropp our en faire un nom de répertoire.
D'autant plus que sur notre serveur, les noms donnés aux repertoires sont bien plus légers. En plus, il y a des sous-répertoires par chantier selon le type de document. S'il est possible de créer un combobox pour choisir le chemin de destination, je suis preneur, mais là cela devient de la science-fiction pour moi! :)))

Suite à la modification du code pour la date dans l'userform (pour qu'il prenne par défaut le jour actuel), j'ai remarqué que l'heure et les minutes apparaissent maintenant sur le document de sortie (ainsi que sur la feuille 3).
Pour résoudre ce problème, j'ai adapté le code du signet 31 comme suit et cela fonctionne. Il y avait peut-être moyen de faire plus simple directement dans l'userfom, mais le résultat compte, le cosmétique viendra après:
Document_Type.Bookmarks("Signet31").Range = Day(Ws3.Cells(DerLWs3, 2)) & "/" & Month(Ws3.Cells(DerLWs3, 2)) & "/" & Year(Ws3.Cells(DerLWs3, 2))
Soit pour avoir par exemple "23/11/2012" au lieu de "23/11/2012 15:25"
Bonne journée!
 

Yaloo

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

Bonsoir à tous,

Sur l'excellent site developpez.com j'avais récupéré un fichier expliquant les listview et il y avait notamment un exemple de choix de répertoire, je ne récupère que cette partie là pour ton fichier, mais si tu as l'occasion vas voir ce site, il y a bon nombre d'exemple.

Tu peux même créer un sous-répertoire s'il n'était pas encore fait.

J'espère avoir répondu à tes attentes.

A te relire

Martial
 

Pièces jointes

  • LISTE V3.xls
    78.5 KB · Affichages: 40
  • LISTE V3.xls
    78.5 KB · Affichages: 42
  • LISTE V3.xls
    78.5 KB · Affichages: 41

Yaloo

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

Re,

Bon cette fois, j'ai exactement ce que tu voulais, il me semblait que je l'avais déjà fait mais....j'avais du mal à le retrouver, maintenant c'est fait.

Ci-dessous ton fichier avec envoi des données dans Word, Ouverture de la boite de dialogue "Enregistrer sous" avec le nom prédéfinit plus haut. Il n'y a plus qu'à sélectionner le bon sous-répertoire.

A te relire

Martial
 

Pièces jointes

  • LISTE V4.xls
    82.5 KB · Affichages: 44
  • LISTE V4.xls
    82.5 KB · Affichages: 45
  • LISTE V4.xls
    82.5 KB · Affichages: 51

cgpa

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

Bonjour Martial, bonjour à tous,

C'est excellent! Exactement ce que je souhaitais. En plus, la différence entre les fichiers V3 et V4 est identifiable dans le code.
On peut dès maintenant récupérer des données de plusieurs tableaux, tout envoyer dans word et renommer automatiquement dans le bon répertoire en quelques clics à peine. Quel gain de temps!
Je te remercie vivement pour le travail que tu as accompli et toute l'aide que tu m'as apportée, Martial. Voici un fichier qui fonctionne avec 2 documents de sortie word: à moi d'adapter le reste. Pour le lecteur de passage, les documents de sortie dans le code sont "commande fournisseur" et "Architecte".
Je suis certain que plusieurs lecteurs vont pouvoir adapter cette technique à leur document.
Je me réserve le petit abus de te revenir juste pour des explications de code... :eek:
Merci et bonne journée!
 

cgpa

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

bonsoir,
Ce fichier est vraiment super.
J'ai ajouté une info dans la colonne à côté des initiales de l'employé, en feuille 4 "param" (soit ajout en feuille 4, colonne 4).
J'ai essayé de lier cette nouvelle info au choix de l'employé dans l'userform: tout comme le choix du chantier dans l'userform lie le nom du conducteur et du chef (source feuille 2) dans la feuille 3 (liste commande), j'ai essayé d'utiliser la même formule pour lier le choix de l'employé à la colonne de son info, mais ça ne marche pas: le résultat, quel que soit les initiales choisies, est toujours le même dans la feuille 3 (j'ai bien un résultat de la bonne colonne 4 feuille 4, mais pas celui qui correspond à l'employé choisi). Apparemment, ce serait parce que c'est un Combobox pour le choix de l'employé, et non un RefEdit. J'aurais voulu qu'après avoir choisi l'employé dans le Combobox 3, sans toucher à l'userform, les données liées dans la colonne 4 de la feuille "param" s'insèrent dans la feuille 3, colonne "T" (ou colonne 21). Peux-tu me dire si c'est réalisable sans trop de modif?
Bonne soirée et à bientôt,
Patrick.
 

Yaloo

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

Bonsoir Patrick,

Désolé, je n'avais pas vu ton message, je pense que c'est possible.

Alors si j'ai bien tout compris, le fichier ci-dessous devrait faire l'affaire.

A te relire

Martial
 

Pièces jointes

  • LISTE V4.xls
    76.5 KB · Affichages: 32
  • LISTE V4.xls
    76.5 KB · Affichages: 31
  • LISTE V4.xls
    76.5 KB · Affichages: 32

cgpa

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

Bonjour Martial,

Ce fichier fait l'affaire et convient parfaitement.

Comme je cherche à comprendre, pour pouvoir toujours améliorer par après, j'ai comparé cette version à la précédente pour voir comment tu as fait.
J'ai vu que tu as modifié dans la ComboBox à l'endroit "columnCount" en indiquant 2 au lieu de 1, que tu as modifié également "RowSource" en indiquant "employé" au lieu de "type_document", enfin que tu as ajouté dans le module de l'userform une ligne Ws3.Cells(DerLWs3, 21) = ComboBox3.Column(1) 'choix employé
Jusque là, je crois que ça va.
Pour voir si j'avais bien compris, j'ai tenté de reproduire l'exercice en ajoutant une colonne de plus dans la feuille paramètre (ex autre info sur l'employé), et j'ai modifié le code du module en ajoutant la ligne Ws3.Cells(DerLWs3, 22) = ComboBox3.Column(2). Là, ça coince, malgré des essais en modifiant "columnCount" en indiquant 3 au lieu de 2. Donc, c'est que je ne donne pas la bonne information de la colonne à reproduire, et donc que je n'ai pas compris comment cela marchait!
Peux-tu me dire où j'ai fauté et à quel endroit lui indiquer de reprendre l'information de la nouvelle colonne? Je pense que c'est dans ma formule ComboBox3.Column(2), mais je ne suis pas sûr. Ca m'énerve de ne pas comprendre.

J'ai une autre question de compréhension: dans le module 1, il y a 2 codes de renvoi de signet: For i = 2 To 12 (pour les signets de la feuille 1, colonnes 2 à 12) et For i = 21 To 23 (probablement pour les colonnes 1 à 3 de la feuille 2). Doit-on comprendre que les numéros donnés le sont par rapport à la feuille. Par exemple, si je désire renvoyer les informations des colonnes 5 à 20 de la feuille 8, le code serait for i : 85 to 820?

J'ai maintenant un très bon fichier qui fonctionne et je pourrais très bien me contenter de l'utiliser tel qu'il est. Mais comme tu vois, je désire comprendre son fonctionnement afin de pouvoir reproduire des parties de codes pour d'autres fichiers, voir pour l'améliorer par après.

Je te souhaite une bonne journée,
Patrick.
 

Yaloo

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

Bonjour Patrick, le forum,

J'ai changé la plage Type_document par employé, et j'ai modifié cette plage.

Pour voir la modification, tu vas dans l'onglet FORMULES puis GESTIONNAIRE DE NOMS, tu sélectionnes la plage "employé".

En bas tu as "Fait référence à:" si tu cliques dans la partie de droite, tu vas voir la plage de cellule correspondant, celle-ci est entourée de pointillés clignotant.

Comme il y a 2 colonnes, si tu ne mets rien la première colonne est prise en compte, si tu mets le .column(1). cela prendra la seconde.

Si dans ta plage tu avais 3 colonnes, elle serait désignée par .column(2) etc...

Pour ta question (2) il faudrait que tu me dises à quelle macro tu te réfères.

A te relire

Martial
 

cgpa

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

Merci Martial pour cette explication très claire.
Je viens d'essayer en ajoutant des colonnes, ça fonctionne. Un acquis.
Pour la 2ème question, il s'agit du module 1, dont extrait ci-dessous:

Select Case Document
Case "commande fournisseur" 'Attention il faut que le texte et la casse soient exactement la même que dans le combobox
Nom = "Cde " & Year(Ws3.Cells(DerLWs3, 2)) & " " & Ws3.Cells(DerLWs3, 1) & " " & Ws3.Cells(DerLWs3, 7) & " " & Ws3.Cells(DerLWs3, 18) 'envoi automatique du nom du document dans word
With Document_Type
For i = 2 To 12 ' reprend ici les données des cellules 2 à 12 de la feuille contact
.Bookmarks("Signet" & i).Range = Ws3.Cells(DerLWs3, i + 5) ' indique que le contenu cellules 2 à 12 de la feuille contact sont reportées sur la feuille 3 (liste commande)à parir de la colonne 7 (soit i+5 ici i=2 donc 2+5=7
Next
End With
With Document_Type
For i = 21 To 23 'reprend ici les valeurs des cellules 21 à 23 de la feuille 2
.Bookmarks("Signet" & i).Range = Ws3.Cells(DerLWs3, i - 18) 'indique que le contenur de 21 à 23 de la feuille 2 est reporté sur la feuille 3 en i-19 (soit ici i=21, donc i-18 = 3, soit la valeur de la cellule 21 est placée en cellule 3
Next i
End With

Et donc la question suivante: si je désire par exemple renvoyer le contenu des colonnes 6 à 10 de la feuille 8, le code serait-il For i = 86 to 810. Ou bien cela n'a rien à voir? Dans ce cas alors, comment puis-je savoir que "For i = 21 to 23" fait référence aux cellules de la feuille 2?

Bonne journée!
 

Yaloo

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

Re,

Pour le For i = 2 to 12, le i va correspondre au i (nb) du signet (donc signet1, signet2 etc...) et au i correspondant aux colonnes décalées de 5 colonnes.

Par exemple dans .Bookmarks("Signet" & i).Range = Ws3.Cells(DerLWs3, i + 5) si l'on remplace le i par 3 :
Cela deviendrait :

.Bookmarks("Signet" & 3).Range = Ws3.Cells(DerLWs3, 3 + 5) c'est à dire que le Signet3 est égale à la dernière ligne de la colonne 8 (3 + 5 ou i + 5)

Dans le cas de For i = 21 to 23 et .Bookmarks("Signet" & i).Range = Ws3.Cells(DerLWs3, i - 18)
Tes signets sont de 21 à 23 mais tes colonnes de i - 18 soit de 3 à 5

Une macro en exemple, tu la copie dans un fichier vide :

VB:
Sub essai()
For i = 1 To 10
  Cells(1, i) = i + 5
Next
End Sub

Avec cette macro cela te rentre la valeur i +5 dans la cellule dont la ligne est 1 et les colonnes i, lance la macro en pas à pas (avec F8 lorsque tu es sur la macro)

Les macros dans le module1 sont présentes pour envoyer vers Word et non pour remplir ta feuille "liste commande"

Pour ta feuille 8, que veux-tu faire ?
Si c'est envoyer vers Word, alors il faut écrire
.Bookmarks("Signet" & i).Range = NOM_DE_TA_FEUILLE.Cells(DerLWs3, i + 5)

Adapter le + 5 en fonction de la colonne à copier. Il faudra aussi, je pense, modifier le DerLWs3 qui correspond à la dernière ligne de ton tableau de la feuille 3.

En espérant avoir répondu à tes questions.

A+

Martial
 

cgpa

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

Bonjour Martial, bonjour à tous,

J'ai bien progressé dans l'adaptation de ce fichier et je remercie Martial pour tout le travail accompli.
Dans la version de travail, on partait d'un double clic sur la première feuille de contact (Ws1) pour lancer l'userform 1.
La commande est la suivante:

Option Explicit
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim isect
Set isect = Application.Intersect(Target, Range("A2:M" & Cells(Rows.Count, 1).End(xlUp).Row))
If Not isect Is Nothing Then
Cancel = True
Ligne = Target.Row
DerLWs3 = Ws3.Cells(Rows.Count, 1).End(3)(2).Row 'Définit la dernière ligne sans valeurs de la feuille "Liste commandes"
Ws2.Activate
UserForm1.Show
End If
End Sub

Je désire créer une deuxième feuille de contacts (par exemple "sous-traitants) dans le même fichier, et lancer la même procédure (même suite). Pour ce faire, j'ai dupliqué la feuille de contacts (ws1) et le double clic fontionne, la procédure suit son cours. Mais le résultat qui apparait dans la Ws3 n'est pas celui de la nouvelle feuille créée (soit Ws5 - sous-traitant) mais celui de la feuille initiale, soit la feuille Ws1 contacts.

Comment puis-je adapater le code?

Merci beaucoup et bonne soirée!
 

Discussions similaires

Statistiques des forums

Discussions
312 330
Messages
2 087 336
Membres
103 524
dernier inscrit
Smile1813