Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Microsoft 365 Import de données et liaisons entre classeurs

TCHIS

XLDnaute Occasionnel
Bonjour à tous.

Svp j'ai besoin d'aide car je ne trouve pas un point de départ pour mettre en place une macro sur Excel.
Mon souci est que je souhaite établir une macro qui aura pour but d'importer les données d'une plage de mon classeur1 pour les mettre dans un autre classeur2 (d'ailleurs ces données importées devront dans plage qui se créerait aussi par cette macro) et aussi que les deux classeurs soient liées afin que toute modification apportées dans le classeur1 doit être reportée automatiquement dans le classeur2

Information Importante ce classeur2 lui-même est crée par VBA avec lors deux sa création des feuilles par défauts déjà renommer plus précisément sans entrer dans les détails quand je configure un profil d'utilisateurs et donc la macro en elle même en plus d'importer les données et lier les classeurs doit aussi filtrer les données à importées.

Ce filtre se base sur différents critères Site et métier.(Certains m'ont énormément aider pour que j'arrive jusqu'à un tel niveau et donc ne seront pas étranger à ces termes d'ailleurs j'espère qu'ils répondront présent le cas de @Dranreb @patricktoulon @TooFatBoy @xUpsilon @p56 ou encore @vgendron ) bien sur tous ici dans le Forum vous etes les bienvenu pour m'aider

S'il y en à qui une telle problématique leur parle aider moi svp je mettrai un fichier joint si nécessaire.
Merci d'avance A+
 

TooFatBoy

XLDnaute Barbatruc
C'est nouveau, la "sélection"?
C'est juste la citation de la liste des gens qui ont essayé de l'aider jusqu'ici.

La citation complète est celle-ci :
 

patricktoulon

XLDnaute Barbatruc
Bonsoir
un fichier serait le bien venu

perso d’après ton explication
je vois simplement l’écriture dynamique par vba de formule de liaison vers des cellules d'un autre fichier en choisissant telle ou telle feuille en fonction d'un utilisateur

somme toute ça casse pas des briques tu a moult exemple sur le forum
@job75 est très fort en la matière me semble t il

en cette fin de semaine ensoleillée je pense que l'on devrait pardonner la maladresse de notre ami
pour monter au créneau attendons lundi

 

Staple1600

XLDnaute Barbatruc
Bonjour le fil,

@patricktoulon
Ce n'est pas une maladresse, juste un début d'habitude
bonjour
Voilà pourquoi je me tourne de nouveaux vers vous et que j'espère que mes bienfaiteurs réagissent @TooFatBoy ,@patricktoulon, @p56, @ChTi160 et les autres je vous prie
Il est encore temps de ne point la développer

PS: A la décharge de TCHIS, ce point n'est pas indiqué dans la charte du forum.
Seuls les vieux XLDnautes, surtout ceux qui ont la fibre répondeuse, savent qu'il est préférable ne pas citer de pseudos quand on demande de l'aide.
 

TCHIS

XLDnaute Occasionnel
Déjà merci pour vos réactions aussi rapide

Le fichier je l'ai mis en PJ comme ça une meilleure vision de la situation.

Petite mise au point en lançant le formulaire (UserForm1) sur l'interface Users lorsqu'on crée un profil d'utilisateur il se crée son classeur et le but est de faire à ce que les feuilles en plus de se charger en données celles-ci se charge uniquement les données en rapport avec le profil créer.

En conclusion ces classeurs d'utilisateurs créé servent de miroir je veux dire par là qu'il comporte des feuilles similaires à celle qu'on trouve dans le fichier joint.
Les données de la Feuille1 de ce fichier test (BD_NATIFS) seront importé sur la feulle1(BD_NATIFS_Users) des classeurs d'utilisateur crées même logique avec les feuilles2.
Est ce ma demande est plus claire svp
 

Pièces jointes

  • Test.xlsm
    221.3 KB · Affichages: 3
Dernière édition:

TCHIS

XLDnaute Occasionnel
Bonjour à tous et bon début de semaine.

Par rapport à ma demande j'ai joint un fichier Excel question de mieux appréhender ma problématique qui est :

<<Importer les données d'une plage se trouvant dans la Feuille1 nommé "BD_NATIFS" de mon classeurA1 vers une feuille précise, la feuille1 nommée "BD_NATIFS_USERS" de mon classeurA2 tout en filtrant ces données au préalable selon les critères choisis pour les sites et les Métiers auxquels le profil d'utilisateur configurer appartient.>>

Dans un premier temps est ce que cette problématique est claire ou encore est ce qu'il y aurait des zones d'ombres ?

Dans un deuxième temps de mon coté je me bats à réaliser la macro jusqu'ici pour mon grand malheur il n'y a aucune progression pour être honnête il n'y a même pas l'ombre d'une solution vraiment aidez moi s'il vous plait.
 

xUpsilon

XLDnaute Accro
Bonjour,

Quelle plage copier/coller ? Toutes les colonnes ?
Comment sait-on quel profil d'utilisateur est utilisé ? Et comment sait-on quel est son site et son métier ?

Voici une idée :
- Tablo = ClasseurA1.RangeQuiNousIntéresse
- For Ligne = LBound(Tablo) to UBound(Tablo)
- If Conditions de Site+Metier OK
- Alors Coller ligne sur ClasseurA2.LigneActive +1

Bonne journée,
 

TCHIS

XLDnaute Occasionnel
Déjà merci @xUpsilon

dans le classeur principal il 'y a deux feuilles qui nous intéresse pour la macro à élaborer,
  • la feuille1 nommé BD_NATIFS et la plage des données concernés et qui est déjà définit est aussi nommé BD_NATIFS
  • la feuille2 nommé BD_MAJ et la plage des données concernés et qui est déjà définit est aussi nommé BD_MAJ
Et donc quand je crée un profil d'utilisateur (Voir Image jointe) je peux attribuer un ou plusieurs sites comme un ou plusieurs métiers à ce profil crée.

Et une fois que je valide la création d'un profil en cliquant sur le bouton "Créer un profil" il se crée un classeur automatiquement (Chaque utilisateur son propre classeur) dans lequel il y'a des feuilles déjà défini et pour cette macro deux feuilles sont concernés dans le classeur de l'utilisateur
  • la feuille1 nommé BD_NATIFS_Users
  • la feuille2 nommé BD_MAJ_Users
(Voir le codes affecté au bouton créer un profil).

VB:
'Le but de Code en ci-dessous sert à créer un nouveau classeur Excel
'Et ce classeur porte la meme nomination que l'IGG de L'utilisateur créer


Dim MonNom, Nom As String
MonNom = TxB_IGG.Text

Workbooks.Add
ChDir "\\main.glb.corp.local\ep-cg$\Home\BIN\9\L1090289\Desktop" 'Voici le chemin du fichier d'origine(MASTER-CLASSEUR) à partir duquel se crée les fichiers des Utilisateurs
'    ActiveWorkbook.SaveAs Filename:= _
'        "\\main.glb.corp.local\ep-cg$\Home\BIN\9\L1090289\Desktop\Nouveau dossier\Users\" & Name & ".xlsm", FileFormat _
'        :=xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False 'Voici le chemin où part s'enregistrer le fichier User créer
        
    ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & "\Users\" & MonNom & ".xlsm", FileFormat _
        :=xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False 'Voici le chemin où part s'enregistrer le fichier User créer
 Nom = MonNom & ".xlsm"
 
'*******************************************************************************************
'*************La première Feuille avec pour nomination BD_NATIFS_UTILISATEUR****************
'*******************************************************************************************

                    'On lance les lignes de codes qui s'occuperont de la création de la feuille et de sa mise en Forme et
Workbooks(Nom).Activate
Workbooks(Nom).Sheets("Feuil1").Select
ActiveSheet.NAME = "BD_NATIFS_USERS"
Application.Run "Test.xlsm!MEF_BD_NATIFS_Users" 'Ici on lance la macro qui fait le remplissage des en-Tetes et leur mise en forme pour la feuille1

                    'Puis Ici on établie les conditions pour appliquer les macro de remplissage des cellules
If Fct1 Or Fct2 Or Fct4 Or Fct9.Value = True Then
Application.Run "Test.xlsm!Remplir_BD_NATIFS_USERS_Type1" 'Ici c'est pour dire que sur la feuille en cours(BD_NATIFS_USERS) lance la macro (Remplir_BD_NATIFS_USERS_Type1) élaboré depuis le classeur d'origine(Classeur père).
End If
                    '*************La deuxième Feuille avec pour nomination BD_MAJ_UTILISATEUR****************
                                'Meme logique qu'avec la feuille BD_NATIFS_UTILISATEUR donc on lance une macro
Workbooks(Nom).Sheets.Add After:=ActiveSheet
Workbooks(Nom).Sheets("Feuil2").Select
ActiveSheet.NAME = "BD_MAJ_USERS"
Application.Run "Test.xlsm!MEF_BD_MAJ_Users" 'Ici on lance la macro qui fait le remplissage des en-Tetes et leur mise en forme pour la feuille2

            '*************La troisième Feuille avec pour nomination BD_TRAITEMENT_UTILISATEUR**********************************
                    'On lance les lignes de code qui s'occuperont de la création puis la macro qui est chargé
                    'du remplisage des cellules de la troisième feuille en fonction bien évidemment de l'utisateur
                    'autrement dit son/ses sites et son/ses métiers
            '******************************************************************************************************************
Workbooks(Nom).Sheets.Add After:=ActiveSheet
Workbooks(Nom).Sheets("Feuil3").Select
ActiveSheet.NAME = "BD_TRAITEMENT-DASHBOARD_USERS"

ActiveWorkbook.Save  'Pour enregistrer le classeur avec les actions lancer par les macros
Quelle plage copier/coller ? Toutes les colonnes
Les plages à copier/coller sont celles se trouvant dans les feuilles 1&2 du classeur principal(Fichier Excel Test).
Elles doivent être coller dans les feuilles appropriés c'est-à-dire les données de la plage BD_NATIFS de la feuille1 doivent être importer dans la feuille1 du classeur d'utilisateur créer idem pour les données de la plage BD_MAJ de la feuille2. Et Oui ce sont toutes "les colonnes"
Comment sait-on quel profil d'utilisateur est utilisé ? Et comment sait-on quel est son site et son métier ?
Pour savoir quelle sites ou quels métiers sont concernés par l'utilisateurs c'est justement par un filtre des données à importer en fonction des Checkbox cochés lors de la configuration du profil(Voir image jointe).
En conclusion il faut filtrer après avoir importer les données dans les feuilles du classeur tout en liant les classeurs créer au classeur principal afin que toute modification apportées dans ce classeur principale se reporte dans les classeurs des utilisateurs.
Donc trois points ressortent
  1. Le filtre des données qui se baserait sur les checkbox sites et métier coché lors de la configuration des profil
  2. L'import de ces données filtrées
  3. Et la liaison avec le classeur principal
 

Pièces jointes

  • 1687171818676.png
    66.2 KB · Affichages: 14

TCHIS

XLDnaute Occasionnel
J'espère avoir pu écarter les zones d'ombre et petites précision par données à importés je veux parler des lignes se trouvant dans les plages de données des feuilles du classeur principale
merci à tous.
 

xUpsilon

XLDnaute Accro
Re,

Voici ce que j'aurais à proposer (basé sur les infos que j'ai et ce que j'arrive à y comprendre) :
VB:
Const sFeuil_From = "BD_NATIFS"
Const sFeuil_FromMaj = "BD_MAJ"

Const nColSite= 2
Const nColJob = 4
Const nColSiteMaj= 6
Const nColJobMaj = 7

'Le but de Code en ci-dessous sert à créer un nouveau classeur Excel
'Et ce classeur porte la meme nomination que l'IGG de L'utilisateur créer

Dim tablo(), tabloMaj()
tablo = oWs_From.Range(sFeuil_From)
tabloMaj = oWs_FromMaj.Range(sFeuil_FromMaj)

Dim oWs_From As Excel.Worksheet
Set oWs_From = ThisWorkbook.Worksheets(sFeuil_From)
Dim oWs_FromMaj As Excel.Worksheet
Set oWs_FromMaj = ThisWorkbook.Worksheets(sFeuil_FromMaj)

Dim MonNom, Nom As String
MonNom = TxB_IGG.Text

Workbooks.Add
ChDir "\\main.glb.corp.local\ep-cg$\Home\BIN\9\L1090289\Desktop" 'Voici le chemin du fichier d'origine(MASTER-CLASSEUR) à partir duquel se crée les fichiers des Utilisateurs
'    ActiveWorkbook.SaveAs Filename:= _
'        "\\main.glb.corp.local\ep-cg$\Home\BIN\9\L1090289\Desktop\Nouveau dossier\Users\" & Name & ".xlsm", FileFormat _
'        :=xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False 'Voici le chemin où part s'enregistrer le fichier User créer
      
    ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & "\Users\" & MonNom & ".xlsm", FileFormat _
        :=xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False 'Voici le chemin où part s'enregistrer le fichier User créer
 Nom = MonNom & ".xlsm"
 
'*******************************************************************************************
'*************La première Feuille avec pour nomination BD_NATIFS_UTILISATEUR****************
'*******************************************************************************************

                    'On lance les lignes de codes qui s'occuperont de la création de la feuille et de sa mise en Forme et
Workbooks(Nom).Activate
Workbooks(Nom).Sheets("Feuil1").Select
ActiveSheet.NAME = "BD_NATIFS_USERS"
Application.Run "Test.xlsm!MEF_BD_NATIFS_Users" 'Ici on lance la macro qui fait le remplissage des en-Tetes et leur mise en forme pour la feuille1
For n = 1 to 5
    If Me.Controls("Site" & n)=True Then MySite = Me.Controls("Site" & n).Caption
Next n
For n 1 to 3
    If Me.Controls("Métier" & n)=True Then MyJob = Me.Controls("Métier" & n).Caption
Next n
For nLig = LBound(tablo) to UBound(tablo)
    If tablo(nLig, nColSite)= MySite and tablo(nLig,nColJob) = MyJob Then
        nLigInc = nLigInc + 1
        For nCol = LBound(tablo,2) to UBound(tablo,2)
            ActiveSheet.Cells(nLigInc,nCol) = tablo(nLig,nCol)
        Next nCol
    End if
Next nLig
                    'Puis Ici on établie les conditions pour appliquer les macro de remplissage des cellules
If Fct1 Or Fct2 Or Fct4 Or Fct9.Value = True Then
Application.Run "Test.xlsm!Remplir_BD_NATIFS_USERS_Type1" 'Ici c'est pour dire que sur la feuille en cours(BD_NATIFS_USERS) lance la macro (Remplir_BD_NATIFS_USERS_Type1) élaboré depuis le classeur d'origine(Classeur père).
End If
                    '*************La deuxième Feuille avec pour nomination BD_MAJ_UTILISATEUR****************
                                'Meme logique qu'avec la feuille BD_NATIFS_UTILISATEUR donc on lance une macro
Workbooks(Nom).Sheets.Add After:=ActiveSheet
Workbooks(Nom).Sheets("Feuil2").Select
ActiveSheet.NAME = "BD_MAJ_USERS"
For nLig = LBound(tabloMaj) to UBound(tabloMaj)
    If tabloMaj(nLig, nColSiteMaj)= MySite and tabloMaj(nLig,nColJobMaj) = MyJob Then
        nLigIncMaj = nLigIncMaj + 1
        For nCol = LBound(tabloMaj,2) to UBound(tabloMaj,2)
            ActiveSheet.Cells(nLigIncMaj,nCol) = tabloMaj(nLig,nCol)
        Next nCol
    End if
Next nLig

Application.Run "Test.xlsm!MEF_BD_MAJ_Users" 'Ici on lance la macro qui fait le remplissage des en-Tetes et leur mise en forme pour la feuille2

            '*************La troisième Feuille avec pour nomination BD_TRAITEMENT_UTILISATEUR**********************************
                    'On lance les lignes de code qui s'occuperont de la création puis la macro qui est chargé
                    'du remplisage des cellules de la troisième feuille en fonction bien évidemment de l'utisateur
                    'autrement dit son/ses sites et son/ses métiers
            '******************************************************************************************************************
Workbooks(Nom).Sheets.Add After:=ActiveSheet
Workbooks(Nom).Sheets("Feuil3").Select
ActiveSheet.NAME = "BD_TRAITEMENT-DASHBOARD_USERS"

ActiveWorkbook.Save  'Pour enregistrer le classeur avec les actions lancer par les macros

Il est plus que possible que tu tombes sur des erreurs, mais en gros je profite de lorsque tu crées ton classeur pour insérer les valeurs intéressantes dedans.
Les données seront collées à partir de la première ligne de chaque feuille, si il faut commencer à la deuxième (par exemple pour mettre les en-têtes en ligne 1), alors il faudra mettre au début de la macro nLigInc = 1 et nLigIncMaj = 1.

Attention aussi que j'ai l'habitude d'utiliser des Constantes (instruction Const), qui sont à intégrer tout en haut d'un module, avant l'instruction Sub().

Bonne soirée,
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…