Excel: ligação bidirecional para células em pastas de trabalho separadas

Excel: ligação bidirecional para células em pastas de trabalho separadas

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 Intersectmé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

informação relacionada