Excel: 別々のワークブック内のセルの双方向リンク

Excel: 別々のワークブック内のセルの双方向リンク

私は初心者で、この質問が正しいかどうかわかりません。Excel スプレッドシートがあり、それをクライアントと共有して、その情報を編集および更新したいと考えています。ただし、共有したいのはセクションのみ、またはワークシート 1 つだけです。クライアントのものではない複数のアカウントがあるためです。2 つの別々のワークブックを更新および編集する必要はありません。私がやりたいのは、クライアントと共有しているワークブックと現在のワークブックの間に双方向リンクを作成し、片方に変更を加えるともう片方が自動的に更新され、その逆も同様になるようにすることです。

以前の投稿は、ワークシート間でこれを行うのに役立ち、とても気に入っています (Christofer Weber に感謝します。うまく機能します)。VBA が必要になることはわかっていますが、理解できません。何かアイデアはありますか? ワークシートで現在使用されている VBA を変更したいと思っていました。

現在のもの

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

今のところはこんな感じですが、一番上の行が正しくないことはわかっています。

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

答え1

私はこれをテストしましたが、これで十分役立つと思います。しかし、私が気づいた点がいくつかあります。

まず注意すべきことは、Intersect異なるワークシートの範囲を比較する場合にはこの方法は機能しないということです。この質問ここでは明示的にそうしていませんでしたが、VBA に暗黙的に決定させるのではなく、どのワークシートで作業しているかを指定するのが賢明だと思います。

2 番目は、例としてこの行です。

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

個人的には、ある範囲の値を別の範囲に設定するのではなく、価値もう一方の範囲は、次のようになります。

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

私が考えたコードは次のとおりです。

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

それが役に立てば幸い

関連情報