
私は初心者で、この質問が正しいかどうかわかりません。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
それが役に立てば幸い