
Sou novo e não tenho certeza se estou perguntando isso corretamente. Tenho uma planilha Excel que desejo compartilhar com um cliente para que possamos editar e atualizar suas informações. No entanto, quero compartilhar apenas uma seção, ou talvez apenas uma planilha, porque tenho várias contas diferentes que não são dele. Não quero atualizar e editar duas pastas de trabalho separadas. O que espero fazer é criar um link bidirecional entre a pasta de trabalho que compartilho com ele e a atual, para que, quando uma alteração for feita em uma, ela seja atualizada automaticamente na outra e vice-versa.
Um post anterior me ajudou a fazer isso entre planilhas, e eu adorei (obrigado, Christofer Weber, funciona muito bem). Sei que isso exigirá VBA, mas não consigo descobrir. Alguma ideia? Eu só esperava modificar o VBA atual usado para as planilhas.
Atual
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
Isso é o que tenho até agora, mas sei que a linha superior não está correta.
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
Responder1
Eu testei isso e acho que deve ser o suficiente para ajudá-lo. Mas aqui estão algumas coisas que notei.
A primeira coisa a observar é que o Intersect
método não funciona se você estiver comparando intervalos em planilhas diferentes poressa questão. Você não estava fazendo isso explicitamente aqui, mas acho que é aconselhável especificar com quais planilhas você está trabalhando, em vez de permitir que o VBA decida implicitamente por você.
A segunda coisa é esta linha como exemplo:
Workbooks("Test excel workbook 1 - macro.xlsm").Sheets(1).Range(Target.Address).Value = Target
Pessoalmente, acho estranho definir o valor de um intervalo como outro intervalo, em vez de defini-lo como ovalordo outro intervalo, que ficaria assim:
Workbooks("Test excel workbook 1 - macro.xlsm").Sheets(1).Range(Target.Address).Value = Target.Value
Aqui está o código que eu criei:
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
Espero que ajude