1 votes

Excel : Lien à double sens pour les cellules dans des classeurs distincts

Je suis tout nouveau et je ne suis pas sûr de poser la question correctement. J'ai une feuille de calcul Excel que je souhaite partager avec un client afin que nous puissions tous deux modifier et mettre à jour les informations qu'elle contient. Cependant, je ne veux partager qu'une section, ou peut-être seulement une feuille de calcul parce que j'y ai plusieurs comptes différents qui ne sont pas les siens. Je ne veux pas avoir à mettre à jour et à éditer deux classeurs distincts. Ce que j'espère faire, c'est créer un lien bidirectionnel entre le classeur que je partage avec lui et mon classeur actuel, de sorte que lorsqu'une modification est apportée à l'un, elle est automatiquement mise à jour dans l'autre, et vice versa.

Un article précédent m'a aidé à faire cela entre les feuilles de travail, et j'adore ça (merci Christofer Weber, ça marche très bien). Je sais qu'il faut utiliser VBA, mais je n'y arrive pas. Une idée ? J'espérais simplement pouvoir modifier le VBA actuellement utilisé pour les feuilles de calcul.

Actuel

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Application.Intersect(Range(Target.Address), Range("A2:D5")) Is Nothing Then
    Application.EnableEvents = False
    Sheets(1).Range(Target.Address).Value = Target
    Sheets(2).Range(Target.Address).Value = Target
    Sheets(3).Range(Target.Address).Value = Target
    Application.EnableEvents = True
End If
End Sub

C'est ce que j'ai obtenu jusqu'à présent, mais je sais que la ligne supérieure n'est pas correcte.

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Application.Intersect(Range(Target.Address), Range("A2:D5")) Is Nothing Then
    Application.EnableEvents = False
    Workbooks("Test excel workbook 1 - macro.xlsm").Sheets(1).Range(Target.Address).Value = Target
    Workbooks("Test excel workbook 2 - macro.xlsm").Sheets(1).Range(Target.Address).Value = Target
    Application.EnableEvents = True
End If
End Sub

2voto

jcrizk Points 123

J'ai testé cette méthode et je pense qu'elle devrait suffire à vous aider. Mais voici quelques points que j'ai remarqués.

La première chose à noter est que le Intersect ne fonctionne pas si vous comparez des plages dans différentes feuilles de calcul par cette question . Vous ne l'avez pas fait explicitement ici, mais je pense qu'il est judicieux de préciser avec quelle(s) feuille(s) de calcul vous travaillez au lieu de permettre à VBA de décider implicitement pour vous.

Deuxièmement, cette ligne est un exemple :

Workbooks("Test excel workbook 1 - macro.xlsm").Sheets(1).Range(Target.Address).Value = Target

Je trouve personnellement qu'il est bizarre de définir la valeur d'une plage comme étant une autre plage au lieu de la définir comme étant le valeur de l'autre plage, qui ressemblerait plutôt à ceci :

Workbooks("Test excel workbook 1 - macro.xlsm").Sheets(1).Range(Target.Address).Value = Target.Value

Voici le code que j'ai trouvé :

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
    Const filePath As String = "C:\some\file\path\otherthing.xlsm"
    Dim otherwb As Workbook
    Dim otherws As Worksheet
    Dim thisws As Worksheet
    Dim rangeIntersection As Range

    'this will allow opening the other workbook without
    'displaying the white UI
    Application.ScreenUpdating = False

    'setting a reference to this worksheet
    Set thisws = ThisWorkbook.Worksheets("Sheet1")
    'opens an unopened workbook or it will simply set a reference
    'to this workbook if it's already opened
    Set otherwb = Excel.Workbooks.Open(filePath)
    'just chose a random worksheet
    Set otherws = otherwb.Worksheets(1)
    'doing the intersection
    Set rangeIntersection = _
        Application.Intersect(Range(Target.Address), _
        thisws.Range("A2:D5"))

    If Not rangeIntersection Is Nothing Then
        Application.EnableEvents = False
        otherws.Range(Target.Address).Value = Target.Value
        Application.EnableEvents = True
    End If

    'uncomment this if you do want to close the wb at the end
'    otherwb.Save
'    otherwb.Close
    Application.ScreenUpdating = True
End Sub

J'espère que cela vous aidera

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X