XL 2016 Liaison des données issues de plusieurs fichiers

oscarette

XLDnaute Nouveau
Bonsoir à tous,
Par avance pardon si je n'utilise pas les bons termes, je n'ai pas l'habitude.
J'ai 2 fichiers excel dans lesquels j'extrais les données de l'un (activité 1) pour les intégrer dans l'autre (fiche 2).
Les données extraites sont le nom et prénom, l'âge, ainsi que d'autres infos de c e type.
Pas de difficultés de ce coté mais je dois apporter d'autres renseignements supplémentaires liés à chaque individu dans le fichier (fiche2). Or dès que je fais un tri sur les données du fichier (activité 1) par conséquent cela le fait aussi sur "fiche 2" sans pour autant trier les nouvelles informations que j'ai saisie sur ce tableau.
Comment lier les données extraites du tableau "activité 1" au données saisie dans le tableau "fiche"2.
Je vous joint les 2 tableaux pour plus d'explications. Les données extraites des tableau 1 sont en gris dans le tableaux2.
En vous remerciant pour votre aide
Oscarette
 
Dernière modification par un modérateur:
Solution
Re Oscarette,
Le fichier a grossi ! ;)

J'ai détecté deux erreurs :
1- Vous rapatriez une colonne de plus ( 19,11). Donc la première colonne de mise à jour passe de 12 à 13 (DebutZone = 13)
2- Vous passez d'un max colonne de CJ à HU. Evidemment la synchro doit suivre, donc de 88 (CJ) à 229 (HU). (FinZone = 229 )

J'espère que la modif "macro_protegee" a fonctionné.

Dernier point. Comme le fichier devient complexe et que le nombre d'intervenants est multiple. Le nombre d'erreur augmente significativement ( erreur de saisie, effacement intempestif de cellule, erreur de manip ... ).
Il serait bon que vous méttiez en place, si ce n'est déjà fait, une sauvegarde soit journalière, soit hebdomadaire. Je pense que cela vous sauvera...

oscarette

XLDnaute Nouveau
Bonjour,
Il n’est pas toujours évident de se comprendre sachant que je n’utilise certainement pas les bons termes mais je pense qu’on est sur la bonne voie !!!

1- L'invariant est le N° de saisie. Il ne peut qu'y en avoir qu'un et ne bougera jamais par rapport aux infos de sa ligne. --> OK
2- C'est Activité qui est modifié voire trié. Aucune modification de la partie grisée n'est effectuée dans Fiche2. --> OK
3- Après mise à jour, Fiche2 est la recopie de Activité 1, auquel on ajoute les infos qui étaient présentes dans l'ancien Fiche2. --> OK

Voici mes interrogations :
4 – Pourquoi le n° de saisie n° 5 n’apparait plus ?
5 – Dans la colonne « Formation insertion professionnelle » il est inscrit la référence 1 et non celle correspondant au N° de saisie, pourquoi ?
6 -Un tri pourra éventuellement être fait dans Fiche 2, par exemple par type de scolarité mais apparemment cela ne pose pas de problème après avoir essayé
7 – est t’on obligé d’ouvrir Activité 1 pour mettre à jour et travailler sur Fiche 2 ? Si oui, cela pose un souci car les 2 fichiers sont à destination de personnes différentes et ceux ayant accès à Fiche 2 n’ont pas les droits pour avoir accès à Activité 1.
8 – Afin d’alléger Fiche 2, j’avais supprimé les menus déroulants (Données / Validation de données / Liste) qui permettent de remplir les données des colonnes en blancs Jà Q. J’espère que cela ne change rien et ne complique pas les choses.

Merci beaucoup pour l’aide que vous m’apportez.
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour,
Non seulement on n'a pas la même culture mais en plus, je travaille "en aveugle" sans bien compredre la finesse de la finalité. Mais bon.

4 – Pourquoi le n° de saisie n° 5 n’apparait plus ? --> OK. Bug résiduel. Bien vu ! voir nouvelle version.
5 – Dans la colonne « Formation insertion professionnelle » il est inscrit la référence 1 et non celle correspondant au N° de saisie, pourquoi ? --> Je ne comprends pas. J'ai fait un essai avec Formation 1 ... dans la colonne Formation et ça marche. Donnez plus de détails.
6 -Un tri pourra éventuellement être fait dans Fiche 2, par exemple par type de scolarité mais apparemment cela ne pose pas de problème après avoir essayé --> Non aucun problème.
7 – est t’on obligé d’ouvrir Activité 1 pour mettre à jour et travailler sur Fiche 2 ? Si oui, cela pose un souci car les 2 fichiers sont à destination de personnes différentes et ceux ayant accès à Fiche 2 n’ont pas les droits pour avoir accès à Activité 1. --> Nous y voilà !

Je dis ça parce que c'est un os ! ( dans l'état actuel Activité doit être ouvert )

Si c'est moi qui remplit Activité et vous Fiche2, si je vous interdit l'accès à Activité, aucun langage quel qu'il soit ne pourra exploité Activité pour mettre à jour Fiche2.
Comprenez bien, si vous n'avez pas les droits pour avoir accès à Activité 1, comment pouvez vous avoir accès à Activité1 ?
D'ailleurs le problème est sous jacent depuis le début. C'était vrai aussi avec vos tris initiaux. Ca ne marchait que parce que quand vous écriviez dans une cellule de Fiche2: =Activité1!C2 ... c'est que vous aviez accés à Activité1.

D'où ma question : Comment faisiez vous avant, ou est ce un nouvel outil ?
 

Pièces jointes

  • Copie de Fiche 2 ( V5 ).xlsm
    46 KB · Affichages: 7

sylvanu

XLDnaute Barbatruc
Supporter XLD
J'ai un peu réfléchi "en aveugle".
Activité est rempli par le service A avec plein de colonnes confidentielles que n'a pas à connaitre l'utilisateur de Fiche2.
Et vice versa.
D'ou votre problème. Une solution :
On met du code dans Activité. Par appui sur un bouton on extrait les colonnes "autorisées" et on en cree un fichier. Donc ce fichier est à l'image de l'actuel Activité ( colonne A à L)
Ce fichier est transmis à l'utilisateur de Fiche2 qui peut alors faire la synchro.
Est ce stupide ?
 

oscarette

XLDnaute Nouveau
C'est un nouvel outil, qui vient d'être crée.

On met du code dans Activité. Par appui sur un bouton on extrait les colonnes "autorisées" et on en cree un fichier. Donc ce fichier est à l'image de l'actuel Activité ( colonne A à L) --> N'est pas déjà le cas dans votre exemple ?
Ce fichier est transmis à l'utilisateur de Fiche2 qui peut alors faire la synchro. --> je n'arrive pas à voir le différence avec ce qui est actuellement en place. Mes connaissances dans Excel ne sont pas assez developpées.
 

oscarette

XLDnaute Nouveau
5 – Dans la colonne « Formation insertion professionnelle » il est inscrit la référence 1 et non celle correspondant au N° de saisie, pourquoi ? --> Je ne comprends pas. J'ai fait un essai avec Formation 1 ... dans la colonne Formation et ça marche. Donnez plus de détails. --> problème résolu dans Fiche 2 (V5)

A l'exception de l'ouverture d'activité 1, votre fichier "Fiche 2 (V5)" me convient très bien, c'est tout a fait ce qu'il me fallait.
Reste maintenant à pouvoir refaire ce que vous avez fait pour l'intégrer dans mon tableau original.
Est il possible de faire une ouverture automatique d'activité 1 (via une macro ou autre) lorsque l'on ouvre Fiche 2? Et faire de même pour la fermeture ?
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
C'est rigolo pour le point 5. J'ai rien fait ! Bah, les mystères de l'informatique.

Actuellement l'utilisateur de Fiche2 a connaissance de toutes les info de Activité. Si ça vous va, alors pourquoi avez vous dit : "ceux ayant accès à Fiche 2 n’ont pas les droits pour avoir accès à Activité 1. " ?

Pour les ouvertures automatiques, XL sait faire beaucoup de choses. Par contre il faut qu'il ait connaissance de l'endroit où il est rangé le fichier.
Si les deux fichiers sont dans le même dossier, et que les noms ne bougent pas alors c'est faisable.
On peut ouvrir automatiquement Activité, faire le boulot puis le refermer.
 

oscarette

XLDnaute Nouveau
Dans l'idéal, j'aurais souhaité que les utilisateurs de Fiche 2 n'aient pas accès à Activité 1 mais par défaut on fera avec ! Ce n'était pas trop un problème de confidentialité mais plus de compétence d'Excel et de peur de mauvaises manipulations du fichiers. Mais je vais protéger les cellules. Les utilisateurs de Fiches 2 ne sont pas de grands utilisateurs d'Excel d'où mes craintes.
Les 2 fichiers seront bien dans le même dossier et les noms ne changeront jamais.
A plus tard
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Mieux compris. Et comme j'ai décidé d'être ch.... vous aurez un autre problème. ( j'ai beaucoup d'expérience dans le déploiement d'outils :) )
Très vite l'utilisateur De Fiche2 va avoir plein de fichiers Activité1 et fatalement un jour ou l'autre il se plantera.
D'où ma proposition :
1- J'ouvre en automatique Activité1 dont le nom ne changera pas et qui sera au même niveau que Fiche2.
2- J'importe les données.
3- J'efface toutes les données de Activité1
4- Je renomme le Fichier Activité1 en Activité1_Obsolète_Date
De cette façon ça limite les risques.
Si vous décidez de protéger certaines feuilles avec des mots de passe, il me faudra déprotéger ces feuilles pour y écrire, dans ce cas il me faudra le mot de passe.
 

oscarette

XLDnaute Nouveau
Bonsoir Sylvanu
J'ai pris un peu de temps pour avancer sur mes tableaux afin qu'ils soient plus finalisés qu'ils ne l'étaient.
Si m'aider à trouver les meilleurs solutions pour mes fichiers est être "ch....", je passe dessus ce trait de votre personnalité ;)
Pour reprendre votre discussion précédente, je n'ai pas dû tout comprendre, pourquoi il y aurait t'il plusieurs fichiers "activité 1" ?
Qu'entendez vous par "activité 1 sera au même niveau que fiche 2" ? Voulez vous dire qu'il sera dans le même dossier ?
3- J'efface toutes les données de Activité1
4- Je renomme le Fichier Activité 1 en Activité1_Obsolète_Date ---> Il y aura donc plusieurs fichiers et lequel faudra t'il reprendre pour les prochaines modifications sur Activité 1 ?
Je joins mes fichiers à jour sur lesquels j'ai travaillé. Seul l'onglet "Totalité" (dans "RP - Suivi Activité 2019") est rempli car le fichier est trop lourd pour le joindre. Les autres onglets sont des extractions de "totalité" en fonction de critères définis selon les onglets.
Par contre ils ne contiennent pas les macros ou autres procédés que vous avez précédemment fait.
Merci
 

Pièces jointes

  • RP - Suivi Activité 2019.xlsm
    971.7 KB · Affichages: 7
  • Fiche navette - RP 2019.xlsm
    520.7 KB · Affichages: 9

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonsoir Oscarette,
Peut être vous ai je noyée dans des considérations qui n'ont pas lieu d'être car tout dépend de votre organisation et votre architecture informatique.
Je ne sais pas comment Acitivité récupère Fiche2, j'ai supposé qu'il y avait un transfert de fichier. Si ce n'est pas le cas et si Activité et Fiche 2 sont toujours dans le même dossier alors il n'y a aucun problème. Le problème ne se situe que si pour faire la synchro Activité doit récupérer Fiche2 autre part que sur son dossier. Dans ce cas on pourrait avoir plusieurs versions de Fiche2 d'où mon souci. Donc vous seul(e) pouvez me répondre.

En tout cas vos fichier ont une bien belle "gueule". Vous avez renoncer à votre filtrage sur page indépendante ?
Au fait pourquoi avez vous vérouillez les filtrages, c'est dommage de se passer de cet outil ?
C'est volontaire ou bloquer par le mot de passe ? ( si c'est ça lors de la protection il faut cocher "Utiliser le filtre automatique", de la sorte il reste actif même après avoir protéger la feuille )
 

oscarette

XLDnaute Nouveau
Bien au contraire vos propositions m'ont permis de voir d'autres possibilités. Mais les 2 fichiers seront bien dans le même dossier et il nous faut bien qu'un seul fichier "Activité" à compléter au fur et à mesure tout comme "Fiche 2".

J'ai exclu les filtres automatiques pour 2 raisons :
- les utilisateurs principaux de ces tableaux ne maitrisent peu voire pas du tout l'outil informatique et encore moins Excel (rien qu'à l'idée de devoir remplir ces tableaux leurs procurent des angoisses )
- J'ai par l'intermédiaire des macros et des "boutons à cliquer" définit tous les tris dont ils pouvaient avoir besoin.
Pour autant, c'est une possibilité que je n'avais pas encore totalement exclue. Je crains juste que les certains utilisateurs soient perdus lorsqu'ils exploitent les fichiers après quelqu'un qui utilise les filtres automatiques. Les potentiels problèmes augmentent avec le nombre d'utilisateurs ! Je vais peut-être autoriser les filtres automatiques et faire une macro et un bouton pour annuler les filtres en cas de non maitrise de cet outil.

Afin que je maitrise un peu ce que vous avez fait précédemment, pourriez-vous m'expliquer dans les grandes lignes les étapes. Et surtout les noms à remplacer avec mes versions définitives dans les macros. Sachant que mes fichiers définitifs se nomment "RP - Suivi Activité 2019" et "Fiche navette - RP 2019".
Donc j'imagine que :

- "Activité 1" devient "RP - Suivi Activité 2019"
- "Fiche 2" devient "Fiche navette - RP 2019"
Donc pas de souci pour modifier les noms dans les macros mais que devient "Activité1" et "Fiche2" (sans espace) sachant que les noms de mes fichiers sont plus longs ?

De plus, il y a aussi les « fonctions ? » suivantes qui ont été crées en plus des macros, dois-je les utiliser aussi ? Là je reconnais que c'est du vrai chinois pour moi même si je comprend vaguement leur rôle. Pour infos, j’ai sept autres tableaux quasi identiques à faire de même.

Function Ctrl_Fichier_Ouvert()
' Renvoie 1 si le fichier Activité1.xlsm est ouvert, sinon renvoie 0
Dim Wb As Workbook, FichierOK
FichierOK = 0
For Each Wb In Workbooks
If Wb.Name = "Activité 1.xlsm" Then
FichierOK = 1
Exit For
End If
Next Wb
If Wb Is Nothing Then
FichierOK = 0
End If
Ctrl_Fichier_Ouvert = FichierOK
End Function

----------------------------------------------------------------------------------

Function PresentOuPas(Taille, NDossier)
' Renvoie 1 si présent sinon renvoie 0
Present = 0
For i = 4 To Taille
If Range("D:D").Cells(i, 1) = NDossier Then
Present = 1
Exit For
End If
Next i
PresentOuPas = Present
End Function

----------------------------------------------------------------------------------

Sub AjouterLigne(LigneSource, LigneDestination)
' Ajoute la ligne manquante.
' Module "tordu" car les N° colonne source et destination ne sont pas les mêmes
' L'array Indice contient N°colonneSource à copier dans N°ColonneDestination
' donc 2,4 veut dire copier colonne2 de source dans colonne4 de destination
Dim Indice()
Indice = Array(1, 1, 2, 4, 3, 2, 4, 3, 5, 5, 6, 6, 7, 7, 10, 8, 11, 9)
For k = 0 To 17 Step 2
DonneeSource = Workbooks("Activité 1.xlsm").Sheets("Totalité").Cells(LigneSource, Indice(k))
ThisWorkbook.Sheets("Fiche 2").Cells(LigneDestination, Indice(k + 1)) = DonneeSource
Next k
End Sub


Merci pour "la belle gueule" de mes tableaux, je ne pensais pas arriver à ceci il y a quelques mois. Internet et la lecture des forums qui m'ont permis d'utiliser les macros et autres formules. Je n’avais encore jamais fait appel à un internaute mais votre aide est précieuse et me permet de me sortir de questionnements auxquels je n’arrivais pas à trouver de réponses. Un grand merci.
Cela me vaut encore quelques nuits très courtes voire blanches après plusieurs mois de travail mais vivement la fin !

Désolée pour ce message bien long avec pas mal de questions où je fais encore appel à vous.
Bonne journée
 
Dernière édition:

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Oscarette, bien belle prose. On sent une certaine appropriation de l'outil, c'est sympa. Alors dans l'ordre.

1- Mettre absolument un mot de passe VBA avant déploiement ( outils/Propriétés/Protection )
Ca évireta de rendre accessible : Sheets("XXX Céline").Protect Password:="Compt@xx" :)

2- Supprimer tous les modules inutiles. Ce sera plus lisible.

3- Les fonctions. En fait ce sont comme des modules mais qui renvoie une valeur. Elles s'utilisent comme une fonction XL. Par ex je cree la fonction Addtion :
VB:
Function Addition(a,b)
    Addition=a+b
End Function
Dans ce cas, si je fait Result=Addition(7;2) le systeme me repondra 9. Ces fonctions sont utilisables en VBA mais aussi directement dans XL.
( Si dans XL vous avez un jour une equation très complexe, passez par une fonction est souvent bien plus simple )
Si ça vous intéresse : https://www.excel-downloads.com/resources/fonctions-personnelles-utilite-simplicite-et-methode.1135/

Evidemment que vous devez les utiliser. Par exemple la fonction Ctrl_Fichier_Ouvert me permet de savoir si le fichier Fiche 2 est ouvert ou non. Quand je fais "If Ctrl_Fichier_Ouvert = 0 Then " la fonction me répond 1 si fichier ouvert et 0 si fichier fermé. Donc vous ne pouvez pas les supprimer.
La particularité des fonctions, c'est que le retour d'informations se fait par le nom de la fonction elle même.
Voici mes commentaires de code :

Code:
Function Ctrl_Fichier_Ouvert()
' Cette fonction controle si le Activité 1.xlsm est ouvert avant de travailler.
' Renvoie 1 si le fichier Activité1.xlsm est ouvert, sinon renvoie 0
Dim Wb As Workbook, FichierOK
  FichierOK = 0                         ' Init du flag, vaudra 0 si fichier fermé sinon 1.
  For Each Wb In Workbooks              ' Pour tous les fichiers ouverts
    If Wb.Name = "Activité 1.xlsm" Then ' Est ce que le nom est Activité 1.xlsm
        FichierOK = 1                   ' Si oui, Flag=1 car fichier ouvert
        Exit For                        ' Et on sort puisqu'on l'a trouvé
    End If
  Next Wb
  If Wb Is Nothing Then                 ' Si aucun fichier auvert
        FichierOK = 0                   ' Le flag est confirmé à 0
  End If
  Ctrl_Fichier_Ouvert = FichierOK       ' On renvoie l'information calculée dans le nom de la fonction.
End Function
Function PresentOuPas(Taille, NDossier)
' NE SERT PLUS.
' Dans les versions précédentes, elle vérifiait si une ligne existait ou non.
' Comme maintenant on duplique la feuille et on l'efface pour tout reconstruire,
' cette fonction n'a pu lieu d'être.
' Renvoie 1 si présent sinon renvoie 0
    Present = 0
    For i = 4 To Taille
        If Range("D:D").Cells(i, 1) = NDossier Then
            Present = 1
            Exit For
        End If
    Next i
    PresentOuPas = Present
End Function
Sub AjouterLigne(LigneSource, LigneDestination)
' Cette macro est nécessaire car l'ordre des colonnes des deux fichiers est différents.
' Module "tordu" car les N° colonne source et destination ne sont pas les mêmes
' L'array Indice contient N°colonneSource à copier dans N°ColonneDestination
' donc 2,4 veut dire copier colonne2 de source dans colonne4 de destination
Dim Indice()
' Indice donne la correspondance entre les colonnes, se lit deux éléments par deux :
' 2,4 signifie que la colonne 4 de Fiche2 est à mettre en colonne 2 du fichier en cours.
    Indice = Array(1, 1, 2, 4, 3, 2, 4, 3, 5, 5, 6, 6, 7, 7, 10, 8, 11, 9)
' Et ensuite on lit Fiche 2 indice n
' et on écrit Feuille courante indice n+1
    For k = 0 To 17 Step 2
        DonneeSource = Workbooks("Activité 1.xlsm").Sheets("Totalité").Cells(LigneSource, Indice(k))
        ThisWorkbook.Sheets("Fiche 2").Cells(LigneDestination, Indice(k + 1)) = DonneeSource
    Next k
End Sub
Sub DupliquerFeuille()
' Duplique la feuille en cours pour sauvegarde des infos de droite.
    Sheets("Fiche 2").Select
    Sheets("Fiche 2").Copy After:=Sheets(1)
    Sheets("Fiche 2 (2)").Select
' On nomme cette feuille SauveFiche2
    Sheets("Fiche 2 (2)").Name = "SauveFiche2"
    Range("D14").Select
' On revient sur la page courante
    Sheets("Fiche 2").Select
    Range("A1:A3").Select
End Sub

4- Sauf erreur de ma part, dans la V5, je n'ai pas de Fiche2 seul, pour le fichier j'utilise Fiche 2. J'ai crée des noms comme SauveFiche2 ou PlageSauve2 mais en interne. Vous pouvez renommer en SauveRP - Suivi Activité 2019 et PlageRP - Suivi Activité 2019 , ça n'a aucune importance. Vous pouvez aussi les laisser comme ça. mais pensez à remplacer les Fiche 2 bien évidemment, toujours entre guillemets. Le nom n'a aucune importance, sa longueur non plus.

Par contre pour être honnête et avoir pas mal d'expérience sur le déploiement d'outils, attendez vous à de nombreux retours d'utilisateurs ( quelquefois bien risible, mais bon :mad:. ) Donc je vous conseillerais trois choses :
1- Ajouter une feuille Explications ou Help ou Mode d'emploi avec la procédure. ( pensez aussi à y ajouter le numéro de version car il est possible que vous soyez amener à déployer plusieurs versions suite à des bugs, des évolutions )
2- Dans les cellules vous pouvez rajouter des commentaires. Profitez en. Quand une personne ne sait pas quoi faire, une simple phrase dans le commentaire peut éviter ... qu'elle vous dérange.
3- Vous pouvez écrire un module de sécurité à la fermeture du fichier pour vérifier avant de sortir que telle et telle cellule est bien remplie ou d'autre choses qu'on peut vérifier avant d'enregistrer, comme écire par ex dans une page l'historique d'utilisation. ( à mettre dans la feuille ThisWorkBook )

Voilà, moi aussi, enclin à une longue prose.
Bonne journée.
 

Discussions similaires

Statistiques des forums

Discussions
312 115
Messages
2 085 447
Membres
102 889
dernier inscrit
monsef JABBOUR