
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 Intersect
mé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