Liaisons entre classeurs

J'ai ceci dans mes cartons ...

adapte cette ligne chemin = ThisWorkbook.Path & "\compil_new\"

Option Explicit

    Dim wbk1 As Workbook, wbk2 As Workbook
    Dim ws1 As Worksheet, ws2 As Worksheet
    Dim rng1 As Range, rng2 As Range

    Dim chemin$, monFichier$, onglet$

Sub collecter()

    ' à modifier ...
    chemin = ThisWorkbook.Path & "\compil_new\"
    onglet = "Sauvegarde"

    Set wbk1 = ThisWorkbook
    Set ws1 = wbk1.Sheets(onglet)
    ws1.Cells(1).CurrentRegion.Offset(1, 0).ClearContents
    monFichier = Dir(chemin & "*.xlsm")

    Do While monFichier <> ""

            Set wbk2 = Workbooks.Open(chemin & monFichier)
            Set ws2 = wbk2.Sheets(onglet)
            Set rng2 = ws2.Cells(1).CurrentRegion
            rng2.Offset(1).Resize(rng2.Rows.Count - 1, rng2.Columns.Count).Copy
            Set rng1 = ws1.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)
            rng1.PasteSpecial Paste:=xlPasteValuesAndNumberFormats
            Application.CutCopyMode = False
            wbk2.Close False

        monFichier = Dir
    Loop

    ws1.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Select

End Sub

Bonjour Steelson,

Je viens de tester, mais j'ai une erreur à

 monFichier = Dir(chemin & "*.xlsm")

"Nom ou numéro de fichier incorrect"

Option Explicit

    Dim wbk1 As Workbook, wbk2 As Workbook
    Dim ws1 As Worksheet, ws2 As Worksheet
    Dim rng1 As Range, rng2 As Range

    Dim chemin$, monFichier$, onglet$

Sub collecter()

    ' à modifier ...
    chemin = ThisWorkbook.Path & "\E:\TEST-ARCHIVAGE\"
    onglet = "Sauvegarde"

    Set wbk1 = ThisWorkbook
    Set ws1 = wbk1.Sheets(onglet)
    ws1.Cells(1).CurrentRegion.Offset(1, 0).ClearContents
    monFichier = Dir(chemin & "*.xlsm")

    Do While monFichier <> ""
        If Not monFichier Like "*.xlsm" Then
            Set wbk2 = Workbooks.Open(chemin & monFichier)
            Set ws2 = wbk2.Sheets(onglet)
            Set rng2 = ws2.Cells(1).CurrentRegion
            rng2.Offset(1).Resize(rng2.Rows.Count - 1, rng2.Columns.Count).Copy
            Set rng1 = ws1.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)
            rng1.PasteSpecial Paste:=xlPasteValuesAndNumberFormats
            Application.CutCopyMode = False
            wbk2.Close False
        End If
        monFichier = Dir
    Loop

    ws1.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Select

End Sub

J'ai compris mon erreur et l'ai corrigée, pourtant rien ne se passe à l'exécution :

Option Explicit

    Dim wbk1 As Workbook, wbk2 As Workbook
    Dim ws1 As Worksheet, ws2 As Worksheet
    Dim rng1 As Range, rng2 As Range

    Dim chemin$, monFichier$, onglet$

Sub collecter()

    ' à modifier ...
    chemin = ThisWorkbook.Path & "\TEST-ARCHIVAGE\"
    onglet = "Sauvegarde"

    Set wbk1 = ThisWorkbook
    Set ws1 = wbk1.Sheets(onglet)
    ws1.Cells(1).CurrentRegion.Offset(1, 0).ClearContents
    monFichier = Dir(chemin & "*.xlsm")

    Do While monFichier <> ""
        If Not monFichier Like "*.xlsm" Then
            Set wbk2 = Workbooks.Open(chemin & monFichier)
            Set ws2 = wbk2.Sheets(onglet)
            Set rng2 = ws2.Cells(1).CurrentRegion
            rng2.Offset(1).Resize(rng2.Rows.Count - 1, rng2.Columns.Count).Copy
            Set rng1 = ws1.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)
            rng1.PasteSpecial Paste:=xlPasteValuesAndNumberFormats
            Application.CutCopyMode = False
            wbk2.Close False
        End If
        monFichier = Dir
    Loop

    ws1.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Select

End Sub

change

If Not monFichier Like "*.xlsm" Then

en

If monFichier Like "*.xlsm" Then

j'avais enlevé ce test, mais avant que tu ne lises le post sans doute ! désolé

Il ne se passe toujours rien à l'exécution, même avec

If monFichier Like "*.xlsm" Then

Il faut faire un peu de debogage ...

Le mieux est d'utiliser la fenêtre d'exécution dans l'éditeur de macro : Affichage > Fenêtre d'exécution ou Ctrl+G

Ensuite mettre dans le code quelques informations à éditer :

    chemin = ThisWorkbook.Path & "\TEST-ARCHIVAGE\"
debug.print chemin
            Set wbk2 = Workbooks.Open(chemin & monFichier)
debug.print wbk2.name

J'ai suivi tes consignes, mais toujours rien

Qu'a donné le debug.print dans la fenêtre d'exécution ?

Dans ce que tu donnes, les fichiers sont sous le même répertoire.

Et regarde le résultat du debug.print STP.

Donc :

Option Explicit

    Dim wbk1 As Workbook, wbk2 As Workbook
    Dim ws1 As Worksheet, ws2 As Worksheet
    Dim rng1 As Range, rng2 As Range

    Dim Chemin$, monFichier$, onglet$, actuel$

Sub collecter()

    ' à modifier ...
    Chemin = ThisWorkbook.Path & "\"
    Debug.Print Chemin
    onglet = "Sauvegarde"

    Set wbk1 = ThisWorkbook
    Set ws1 = wbk1.Sheets(onglet)
    'ws1.Cells(1).CurrentRegion.Offset(1, 0).ClearContents
    monFichier = Dir(Chemin & "*.xlsm")

    Do While monFichier <> ""
        If monFichier <> wbk1.Name Then
            Set wbk2 = Workbooks.Open(Chemin & monFichier)
            Debug.Print wbk2.Name
            Set ws2 = wbk2.Sheets(onglet)
            Set rng2 = ws2.Cells(1).CurrentRegion
            rng2.Offset(1).Resize(rng2.Rows.Count - 1, rng2.Columns.Count).Copy
            Set rng1 = ws1.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)
            rng1.PasteSpecial Paste:=xlPasteValuesAndNumberFormats
            Application.CutCopyMode = False
            wbk2.Close False
        End If
        monFichier = Dir
    Loop

    ws1.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Select

End Sub

J'avais déjà testé :

Chemin = ThisWorkbook.Path & "\"

mais j'obtiens une erreur d'exécution 1004à :

 rng2.Offset(1).Resize(rng2.Rows.Count - 1, rng2.Columns.Count).Copy

Steelson, çà fonctionne ouffffffffff !

Mais , par contre çà n'actualise pas les données : à chaque lancement de la macro, les données sont de nouveau recopiées à la suite- ce qui génère des doublons.

Yaurait-il moyen que la copie actualise les données?

J'ai trouvé la solution :

J'avais désactivé la ligne

   ws1.Cells(1).CurrentRegion.Offset(1, 0).ClearContents

pensant que cette instruction effaçait les données des fichiers de chaque utilisateur - alors qu'en fait, elle efface les données de l'onglet "Sauvegarde" dans le classeur "synthèse" avant d'en accueillir de nouvelles.

Je vais transposer ce code dans mon fichier de production - et voir, si tout fonctionne bien !

Je tiens vraiment à te remercier pour ton aide précieuse

ok

Steelson,

Je reviens vers toi pour une autre problématique inverse- Si tu veux bien m'aider

Sur la même base du dernier code que tu m'as fourni, pourrait-on le modifier pour obtenir ceci :

Je souhaiterais par une macro, quand je le souhaite, que des données se trouvant dans 2 onglets ("Répartition" "Actes") du classeur "SYNTHESE" soient copiées dans les mêmes onglets se trouvant dans le classeur de chacun des utilisateurs.

Plutôt que les liaisons que nous avons mises en place entre classeurs, se mettant à jour à chaque lancement, je préférerais moi-même déclencher la mise à jour des données de manière ponctuelle (ex: déclenchement hebdomadaire ou mensuelle ...) sans avoir à ouvrir les classeurs des utilisateurs et sans

Ces classeurs seraient dans le même répertoire avec les mêmes extensions et les mêmes onglets

Plutôt que les liaisons que nous avons mises en place entre classeurs, se mettant à jour à chaque lancement, je préférerais moi-même déclencher la mise à jour des données de manière ponctuelle (ex: déclenchement hebdomadaire ou mensuelle ...) sans avoir à ouvrir les classeurs des utilisateurs

Alors cette fois-ci ce n'est vraiment pas possible ! Excel n'est pas un système de type database, MySQL ... qui permettrait d'intervenir directement dans le fichier sauvegardé sans l'ouvrir.

Ta première demande sur laquelle j'étais au départ sceptique est en fait très intelligente ! Quel est le soucis ? le temps de mise à jour à l'ouverture du fichier ?

  • Effectivement le temps de mise à jour ralentit l'accès au fichier
  • la mise à jour à chaque lancement du fichier utilisateur (ce qui n'est pas nécessaire étant donné que les données changent ponctuellement et quand je le souhaite -en fonction d'autres paramètres..)
  • Si je suis amené à déplacer le dossier ou se trouvent tous les fichiers, je devrai reparamétrer le fichier de chaque utilisateur (il y en aura une cinquantaine!)
  • le paramétrage de chaque poste utilisateur (affichage des mises à jour des liaisons)

Comme c'est moi qui déclencherait la mise à jour des données, si chaque fichier doit s'ouvrir c'est tout de même gérable non?

Le code utilisé pour aller récupérer les données de chaque classeur ouvre bien chaque fichier en arrière-plan, sans que ce soit embêtant pour moi- donc on pourrait faire la même chose, non?

-Effectivement le temps de mise à jour ralentit l'accès au fichier

On aurait pu mettre un indicateur dans une cellule qui indique par exemple la date de mise à jour de la source.

Ce faisant, le chargement pourrait se faire uniquement si la date est plus récente que celle rapatriée la dernière fois.

Par contre, OUI, si déplacement du fichier, c'est alors une vraie galère !!


Comme c'est moi qui déclencherait la mise à jour des données, si chaque fichier doit s'ouvrir c'est tout de même gérable non?

Si tu acceptes l'ouverture des fichiers, c'est possible (si et seulement si les fichiers à mettre à jour ne sont pas déjà ouverts).


La question que je me pose est : pourquoi ne pas mettre ces informations sur un seul fichier partagé en lecture seule ? voire sur un intranet ? est-ce que ces informations inter-agissent avec le fichier excel lui-même ?

Si tu acceptes l'ouverture des fichiers, c'est possible (si et seulement si les fichiers à mettre à jour ne sont pas déjà ouverts).

Cà ne me pose pas de problème, je peux prévoir la mise à jour tôt le matin ou alors l'automatiser durant la nuit


La question que je me pose est : pourquoi ne pas mettre ces informations sur un seul fichier partagé en lecture seule ? voire sur un intranet ? est-ce que ces informations inter-agissent avec le fichier excel lui-même ?

Effectivement, ces informations inter-agissent dans le fichier excel lui-même.

Les actes à traiter sont attribuées aléatoirement et s'affichent selon le type de traitement à effectuer

Si tu acceptes l'ouverture des fichiers, c'est possible (si et seulement si les fichiers à mettre à jour ne sont pas déjà ouverts).

Cà ne me pose pas de problème, je peux prévoir la mise à jour tôt le matin ou alors l'automatiser durant la nuit

je cogite, réponse demain matin (ou mieux selon mon activité ...)

il faut juste que je teste quand même si le fichier est ouvert, si l'onglet existe pour éviter un plantage, et faire a minima un rapport de mise à jour

Rechercher des sujets similaires à "liaisons entre classeurs"