我是新手,不确定我问的是否正确。我有一个 Excel 电子表格,我想与客户共享,以便我们都可以编辑和更新其信息。但是,我只想共享一个部分,或者可能只有一个工作表,因为我上面有多个不同的帐户,这些帐户不是他的。我不想更新和编辑两个单独的工作簿。我希望做的是在我与他共享的工作簿和我当前的工作簿之间创建一个双向链接,这样当对一个工作簿进行更改时,它会自动更新另一个工作簿,反之亦然。
之前有一篇文章帮助我在工作表之间完成了这项工作,我很喜欢它(感谢 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 隐式地为您决定是明智的。
第二件事以此行为例:
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
希望能帮助到你