Excel: vínculo bidireccional para celdas en libros separados

Excel: vínculo bidireccional para celdas en libros separados

Soy nuevo y no estoy seguro de haber preguntado esto correctamente. Tengo una hoja de cálculo de Excel que quiero compartir con un cliente para que podamos editar y actualizar su información. Sin embargo, solo quiero compartir una sección, o quizás solo una hoja de trabajo porque tengo varias cuentas diferentes allí que no son suyas. No quiero tener que actualizar y editar dos libros de trabajo separados. Lo que espero hacer es crear un vínculo bidireccional entre el libro que comparto con él y el actual, de modo que cuando se realice un cambio en uno, se actualice automáticamente en el otro y viceversa.

Una publicación anterior me ayudó a hacer esto entre hojas de trabajo y me encanta (gracias Christofer Weber, funciona muy bien). Me doy cuenta de que requerirá VBA, pero no puedo entenderlo. ¿Algunas ideas? Solo esperaba modificar el VBA actual que se utiliza para las hojas de trabajo.

El actual

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

Esto es lo que tengo hasta ahora, pero sé que la línea superior no es correcta.

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

Respuesta1

He probado esto y creo que debería ser suficiente para ayudarte. Pero aquí hay algunas cosas que noté.

Lo primero que hay que tener en cuenta es que el Intersectmétodo no funciona si se comparan rangos en diferentes hojas de cálculo poresta pregunta. No estaba haciendo eso explícitamente aquí, pero creo que es aconsejable especificar con qué hojas de trabajo está trabajando en lugar de permitir que VBA decida implícitamente por usted.

Lo segundo es esta línea como ejemplo:

Workbooks("Test excel workbook 1 - macro.xlsm").Sheets(1).Range(Target.Address).Value = Target

Personalmente, creo que es extraño establecer el valor de un rango para que sea otro rango en lugar de configurarlo para que sea elvalordel otro rango, que se vería así:

Workbooks("Test excel workbook 1 - macro.xlsm").Sheets(1).Range(Target.Address).Value = Target.Value

Aquí está el código que se me ocurrió:

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 eso ayude

información relacionada