Liaisons entre classeurs

Bonjour,

Je souhaiterais votre aide pour mettre des liaisons entre plusieurs classeurs par code vba.

Il s'agit d'actualiser des données sans le déclenchement de l'ouverture du classeur source et sans que les utilisateurs n'aient de pop up à valider.

Chaque utilisateur dispose de son classeur nominatif.

L'utilisateur : XDS dispose du classeur "GPC_V3 - XDS"

L'utilisateur : ACR dispose du classeur "GPC_V3 - ACR"

Etc... (Au total : 8 classeurs)

Chaque classeur nominatif devra être relié au classeur source "GPC_V3"

Je souhaite que les données ci-dessous soient mises à jour :

Les onglets "SOURCE" et "REPARTITION"

Je vous remercie de votre aide

Cdlt

Bonjour,

les macros sont verrouillées !

Il s'agit d'actualiser des données sans le déclenchement de l'ouverture du classeur source et sans que les utilisateurs n'aient de pop up à valider.

Si tu veux recopier des données depuis le classeur source, il faudra l'ouvrir, mais cela peut se faire de façon masquée si et seulement il n'est pas ouvert (on peut essayer en lecture seule si déjà ouvert) !

Sinon, on peut mettre des formules de liaisons. Mais attention, c'est le genre de choses difficile à maintenir.

Bonjour,

Effectivement, j'ai oublié de déverrouiller les macros - désolé

mot de passe : test

Je voudrais une solution qui ne demande aucune validation par chaque utilisateur et qui n'ouvre pas le fichier source.

Tu mets cette macro dans un module

Sub formule(plage As Range, feuille As String, chemin As String)
Dim cel As Range
    For Each cel In plage
        cel.FormulaR1C1 = "=IF('" & chemin & "[GPC_V3.xlsm]" & feuille & "'!R" & cel.Row & "C" & cel.Column & "="""","""",'" & chemin & "[GPC_V3.xlsm]" & feuille & "'!R" & cel.Row & "C" & cel.Column & ")"
    Next
    plage.Copy
    plage.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    Application.CutCopyMode = False
End Sub

Et tu fais appel à cette macro à l'ouverture du fichier (mon serveur est en Z, j'ai donc mis Z:\ ou bien \\Box\) pour chaque plage concernée :

Private Sub Workbook_Open()
    '       plage                                  feuille        repertoire
    formule Sheets("Répartition").Range("D7:I11"), "Répartition", "Z:\TEST\"
End Sub

fichier simplifié ...

Si tu ne veux plus de popup il faut aussi supprimer les relations avec l'autre fichier !

6gpc-v3-xds.xlsm (25.20 Ko)

Merci pour ton aide

Je viens de tester, seulement le fichier me demande de mettre à jour chaque valeur

Steelson, je te remercie

ça fonctionne bien

Je vais retoucher le programme pour éviter la difficulté qu'il y a à mettre à jour le lien.

La première fois, il demandera le lieu de stockage.

Les autres fois, il ne demandera plus rien.

In fine, cela ne fonctionne pas aussi bien que prévu.

Ce qu'il faudrait alors, c'est définir une zone pour définir le répertoire où se trouve la source, tester la zone, si elle est vierge stopper la macro et demander la mise à jour de cette zone, demander ensuite de fermer et relancer le fichier...

Sinon, j'ai mis à jour le programme ...

dans workbook

Const dossier = "Z:\TEST\"
Const source = "GPC_V3.xlsm"

Private Sub Workbook_Open()
    actualiser Sheets("Répartition").Range("D7:I11"), dossier, source
    actualiser Sheets("Répartition").Range("L7:P11"), dossier, source
    actualiser Sheets("Répartition").Range("S2"), dossier, source
    actualiser Sheets("SOURCE").Range("A1:L29"), dossier, source
    ' MsgBox "Les données source ont été actualisées !"
End Sub

Dans un module

Option Explicit

Sub actualiser(plage As Range, chemin As String, fichier As String)
Dim cel As Range
    For Each cel In plage
        cel.FormulaR1C1 = "=IF('" & chemin & "[" & fichier & "]" & cel.Parent.Name & "'!R" & cel.Row & "C" & cel.Column & "="""","""",'" & chemin & "[" & fichier & "]" & cel.Parent.Name & "'!R" & cel.Row & "C" & cel.Column & ")"
    Next
    plage.Copy
    plage.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    Application.CutCopyMode = False
End Sub

Je vais essayer de voir si je peux gagner un peu de temps sur le chargement tout en restant très flexible.

Je viens de tester, mais j'ai une erreur de compilation :

dans thisworkbook :

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Application.DisplayFullScreen = False
Application.DisplayAlerts = False

End Sub

Const dossier = "E:\SUIVI DES CONTROLES\Nouveau dossier\"
Const source = "GPC_V3.xlsm"

Private Sub Workbook_Open()
    actualiser Sheets("Répartition").Range("D7:I11"), dossier, source
    actualiser Sheets("Répartition").Range("L7:P11"), dossier, source
    actualiser Sheets("Répartition").Range("S2"), dossier, source
    actualiser Sheets("SOURCE").Range("A1:L29"), dossier, source
    ' MsgBox "Les données source ont été actualisées !"
MsgBox "Bonjour et bienvenue dans votre Guide Points de Contrôle !" & vbCrLf & vbCrLf & "Merci de bien fermer le classeur à la fin de votre saisie" _
& vbCrLf & vbTab, vbOKOnly + vbInformation, "ATTENTION"
End Sub
End Sub

Dans le module :

Option Explicit

Sub actualiser(plage As Range, chemin As String, fichier As String)
Dim cel As Range
    For Each cel In plage
        cel.FormulaR1C1 = "=IF('" & chemin & "[" & fichier & "]" & cel.Parent.Name & "'!R" & cel.Row & "C" & cel.Column & "="""","""",'" & chemin & "[" & fichier & "]" & cel.Parent.Name & "'!R" & cel.Row & "C" & cel.Column & ")"
    Next
    plage.Copy
    plage.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    Application.CutCopyMode = False
End Sub

Pas d'erreur chez moi avec le même code, mais j'ai enlevé de double end sub

Je mets exactement le même code que celui que tu m'as donné -mais j'obtiens une erreur de compilation (nom ambigu détecté : actualiser)

Const dossier = "E:\SUIVI DES CONTROLES\"
Const source = "GPC_V3.xlsm"

Private Sub Workbook_Open()
    actualiser Sheets("Répartition").Range("D7:I11"), dossier, source
    actualiser Sheets("Répartition").Range("L7:P11"), dossier, source
    actualiser Sheets("Répartition").Range("S2"), dossier, source
    actualiser Sheets("SOURCE").Range("A1:L29"), dossier, source
    ' MsgBox "Les données source ont été actualisées !"
End Sub

Est-ce qu'il est déjà utilisé par ailleurs dans les macros ? Dans ce cas change le.

Il semble que ce soit plus rapide aussi de mettre les constantes dans le module !

Private Sub Workbook_Open()
    dupliquer Sheets("Répartition").Range("D7:I11")
    dupliquer Sheets("Répartition").Range("L7:P11")
    dupliquer Sheets("Répartition").Range("S2")
    dupliquer Sheets("SOURCE").Range("A1:L29")
    ' MsgBox "Les données source ont été dupliquées !"
End Sub
Option Explicit
Const chemin = "E:\SUIVI DES CONTROLES\"
Const source = "GPC_V3.xlsm"

Sub dupliquer(plage As Range)
Dim cel As Range
    For Each cel In plage
        cel.FormulaR1C1 = "=IF('" & chemin & "[" & source & "]" & cel.Parent.Name & "'!R" & cel.Row & "C" & cel.Column & "="""","""",'" & chemin & "[" & source & "]" & cel.Parent.Name & "'!R" & cel.Row & "C" & cel.Column & ")"
    Next
    plage.Copy
    plage.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    Application.CutCopyMode = False
End Sub

Bonjour,

La 2 eme proposition de code ne fonctionne pas chez moi, j'ai dû remettre la 1ère

Par contre, à chaque lancement du fichier utilisateur, apparaissent en superposition pendant quelques secondes, les onglets qui se mettent à jour.

Y'aurait-il moyen d'éviter cela?

La 2 eme proposition de code ne fonctionne pas chez moi, j'ai dû remettre la 1ère

Étonnant ! quelle était l'erreur ?

Par contre, à chaque lancement du fichier utilisateur, apparaissent en superposition pendant quelques secondes, les onglets qui se mettent à jour.

Y'aurait-il moyen d'éviter cela?

Chez moi c'est maintenant immédiat alors qu'au début je voyais défiler les cellules !

dans ce cas

Sub dupliquer(plage As Range)
Application.ScreenUpdating = False
' ici le code
Application.ScreenUpdating = True
End Sub

Voici, ce que j'ai mis et qui fonctionne bien :

Private Sub Workbook_Open()
Application.DisplayFullScreen = True

dupliquer Sheets("Répartition").Range("B7:I11")
dupliquer Sheets("Répartition").Range("L7:P11")
dupliquer Sheets("Répartition").Range("S2")
dupliquer Sheets("Répartition").Range("B5")
dupliquer Sheets("SOURCE").Range("A1:M30")
    ' MsgBox "Les données source ont été dupliquées !"
      ' Message d 'ouverture
       MsgBox "Bonjour et bienvenue dans votre Guide Points de Contrôle" & vbCrLf & vbCrLf & "Merci de bien fermer votre classeur à la fin de votre saisie" _
      & vbCrLf & vbTab, vbOKOnly + vbInformation, "GPC -Semaine N° " & Sheets("Répartition").Range("S2") & vbLf

End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Application.DisplayFullScreen = False
Application.DisplayAlerts = False
End Sub

Dans module :

Option Explicit
Const chemin = "Z:\SUIVI DES CONTROLES\"
Const source = "GPC_V3.xlsm"

Sub dupliquer(plage As Range)
Application.ScreenUpdating = False

Dim cel As Range
    For Each cel In plage
        cel.FormulaR1C1 = "=IF('" & chemin & "[" & source & "]" & cel.Parent.Name & "'!R" & cel.Row & "C" & cel.Column & "="""","""",'" & chemin & "[" & source & "]" & cel.Parent.Name & "'!R" & cel.Row & "C" & cel.Column & ")"
    Next
    plage.Copy
    plage.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    Application.CutCopyMode = False
    Application.ScreenUpdating = True
End Sub

En parallèle de cela, et pour récupérer la saisie de chacun des utilisateurs, je souhaiterais que les données sauvegardées dans l'onglet "Sauvegarde" de chaque classeur soient copiées dans l'onglet "Sauvegarde" du classeur source.

Comment faire dans ce cas car les sources sont multiples?

je souhaiterais que les données sauvegardées dans l'onglet "Sauvegarde" de chaque classeur soient copiées dans l'onglet "Sauvegarde" du classeur source.

Comment faire dans ce cas car les sources sont multiples?

A quel moment ? on peut le faire lors de l'ouverture du classeur "source" si on connait en effet tous les classeurs "individuels". Si ces derniers sont rangés au même endroit on peut alors les retrouver en balayant le dossier de stockage, voire même s'ils ont dans des sous-dossiers. Ensuite, s'il y a autre chose que ces fichiers dans lesdits dossiers, il faudrait pouvoir les distinguer ... par une racine commune ? genre "GPC_V3" ?

A toi de préciser ces éléments. Ensuite on pourra ré-employer la même macro avec une légère adaptation.

Si les données sont à occurrences multiples, on ne pourra toutefois pas réutiliser le même principe. Il faudra y réfléchir.

Peux-tu aussi re-poster un fichier contenant cette feuille "sauvegarde" ?

Cette fusion devra être déclenchée par le bouton "FUSIONNER" dans le classeur "SYNTHESE"

Les classeurs des utilisateurs se trouveront dans le même dossier.

Les données se trouvent dans la feuille "Sauvegarde" de chaque classeur d'utilisateur et sont organisées de la même manière.

J'ai trouvé un code sur ce site, proposé par GMB - mais je n'"arrive pas à le faire fonctionner

Rechercher des sujets similaires à "liaisons entre classeurs"