
Я новичок и не уверен, правильно ли я спрашиваю. У меня есть таблица Excel, которой я хочу поделиться с клиентом, чтобы мы оба могли редактировать и обновлять ее информацию. Однако я хочу поделиться только разделом или, возможно, только одним рабочим листом, потому что у меня там несколько разных учетных записей, которые не принадлежат ему. Я не хочу обновлять и редактировать две отдельные рабочие книги. Я надеюсь создать двустороннюю связь между рабочей книгой, которой я делюсь с ним, и моей текущей, чтобы при внесении изменений в одну она автоматически обновлялась в другой, и наоборот.
Предыдущий пост помог мне сделать это между рабочими листами, и мне это нравится (спасибо Кристоферу Веберу, это работает отлично). Я понимаю, что это потребует 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
Надеюсь, поможет