Exclusivo y compartir en macro

Hola Gustavo, llevo varios días con un tema que no soy capaz de solventar. Te explico: tengo un libro compartido al que le quiero poner una macro auto_open para que cada vez que se abra ponga el libro en exclusivo y así poder desproteger una hoja y realizar una seria de acciones al termino de las cuales volver a proteger la hoja y volver a compartir el libro. Primero te adjunto la macro que estoy utilizando y debajo te explico los problemas que tengo.
Sub Auto_Open()
If ActiveWorkbook.MultiUserEditing Then
Status = 1
nbrelibro = ActiveWorkbook.Name
Application.DisplayAlerts = False
ActiveWorkbook.ExclusiveAccess
End If
'aqui pongo mis instruciiones de desproteger
Sheets("Hoja4").Select
ActiveSheet.Unprotect "contraseña"
' aqui pondría las tareas a realizar una vez esta la hoja desprotejido
' finalmenet bloqueo todas las celdas excepto la columna F y protejo
Cells.Select ' selcciona todas las celdas de la hoja
Selection.Locked = True ' las marca como bloqueadas
Selection.FormulaHidden = False
Range("F:F").Select ' selecciona el rango de celdas que desees dejar DESbloqueadas
Selection.Locked = False ' DESbloquea las celdas seleccionadas
Selection.FormulaHidden = False
ActiveSheet.Protect Password:="contraseña", DrawingObjects:=True, Contents:=True, Scenarios:=True _
, AllowFiltering:=True
ActiveSheet.EnableSelection = xlUnlockedCells ' selecciona celdas desbloqueadas
' me coloco en hoja1
Sheets("Hoja1").Select
'si el libro estuvo compartido se lo vuelve a ese estado y sino se guarda
If Status = 1 Then
With ActiveWorkbook
.KeepChangeHistory = True
.ChangeHistoryDuration = 3 'dias que se guarda el historial
End With
' con las 2 lineas de abajo es como se indica que se comparte el libro
ActiveWorkbook.SaveAs Filename:= _
nbrelibro, accessMode:=xlShared
End If
'activamos alertas
Application.DisplayAlerts = True
End Sub
El problemón es el siguiente:
1.- El primer usuario que abre el libro se ejecuta auto_open correctamente y se vuelve a dejar el libro compartido
2.- El segundo usuario que abre el libro, se ejecuta auto open, pero el libro ya no lo deja compartido. No obstante permite añadir cambios y grabar el libro (si el usuario 1 escribe en la misma celda que suario 2, la próxima vez que abirmos libro se verán los últimos datos gravados sin ningún aviso)
3.- El tercer usuario que abre el libro, se abre como solo lectura y avisa de que esta abierto por usuario 2 para modificar
4.- Si los tres usuarios cierran el libro, la próxima vez que se abre, lo hace en modo exclusivo
Como ves ando bastante perdido y francamente no se que más probar, se me han acabado las ideas. Puedes ayudarme una vez más... Mil Gracias.

1 Respuesta

Respuesta
1
En el punto 2, ¿lo abre mientras el usuario 1 también lo tiene abierto? O luego que u1 lo cerró, porque si es esto último no se me ocurre que está mal, en cambio si lo abre mientras u1 lo tiene abierto tal vez debas preguntar primero si el archivo está en uso...
La verdad que es poco pero es lo único que se me ocurre...
Te dejo un par de funciones que revisan si el archivo está en uso (no se que tal se comportan con archivos compartidos)
'Función es para saber si un archivo está en uso
Public Function IsFileLocked(strFileName As String) As Boolean
On Error Resume Next
Dim FF As Integer
FF = FreeFile
'An error occurs if the document is currently open.
Open strFileName For Binary Access Read Lock Read As #FF
Close #FF
'Check for Error
If Err.Number Then
Err.Clear
IsFileLocked = True
End If
End Function
'Devuelve el último usuario que abrió el libro (o quien lo tiene abierto)
Function LastUser(strFileName As String) As String
Dim strWholeFile As String
Dim strFlag1 As String, strFlag2 As String
Dim intNameLength As Integer
Dim i As Integer, j As Integer
strFlag1 = Chr(0) & Chr(0)
strFlag2 = Chr(32) & Chr(32)
Open strFileName For Binary As #1
strWholeFile = Space(LOF(1))
Get 1, , strWholeFile
Close #1
j = InStr(1, strWholeFile, strFlag2)
i = InStrRev(strWholeFile, strFlag1, j) + Len(strFlag1)
intNameLength = Asc(Mid(strWholeFile, i - 3, 1))
LastUser = Mid(strWholeFile, i, intNameLength)
End Function
No, no cuando el usuario 2 lo abre, el u1 también lo tiene abierto. Tu respuesta me podría servir si solo necesitara hacer la macro de auto open, pero no es así. Tengo otras macros que no se ejecutan al abrir el libro sino una vez ya esta abierto y estas macros tienen que poner el libro en exclusivo, para desproteger, ejecutar las acciones, volver a proteger y volver a compartir.
Gracias igualmente por tu posible solución pero me temo que no me resuelve el problema. Sigo con ello, si te se ocurre algo, agradezco me avises. Dejare la pregunta abierta por si la consigo resolver y así poderte dar la solución. Gracias.
Es que si el u1 ya lo tiene abierto, está bien el código (y por supuesto que no es lo que quieres) pues
Sub Auto_Open()
If ActiveWorkbook.MultiUserEditing Then
Status = 1
nbrelibro = ActiveWorkbook.Name
Application.DisplayAlerts = False
ActiveWorkbook. ExclusiveAccess 'ACA u2 no lo puede tener exclusivo porque está abierto por u1
End If
...
La verdad que si es así no le encuentro la vuelta pues para que haga eso lo tiene que tener solo...
Hola Gustavo, la verdad es que todo este lio de exclusivo para desproteger, volver a proteger y volver a compartir lo he montado porque hay 2 columnas en la hoja 4 (A y B) que no se protegen bien. Si pudiera solucionar esto no me haría falta poner el libro como exclusivo. Te explico.
Las columnas A y B están ocultas y bloqueadas y la hoja esta protegida para que no se puedan seleccionar las celdas Bloqueadas. El problemón esta cuando cierro el libro, ya que al volverlo a abrir te permite seleccionar las celdas Bloqueadas y por lo tanto puedes seleccionar toda la hoja y pegarla en un libro nuevo y desde aquí se puede ver las "supuestamente " columnas ocultas A y B. Por esto pensé en hacer la macro auto_open para volver a proteger una vez abierto, si te se ocurre algo para que al volver a abrir me respete el NO seleccionar celdas bloqueadas... yo le he inetando de mil maneras y siempre sucede lo mismo. Gracias.
No entiendo por que no te funcionan; lo que se me ocurre es que hagas la protección/bloqueo con la grabadora de macros, y el código generado lo agregas al evento BeforeClose (o al Open)
Tengo una duda, ¿esto qué me dices lo puedo hacer también con un libro compartido? Y donde debo crear el evento: en la página 4 que es la que quiero proteger o en el libro entero... La verdad que no se muy bien como crear este evento y si afecta que el libro este compartido
El BeforeClose va en el objeto ThisWorkbook (donde ponés el auto_open)
Y lo que deberías asegurarte es que seleccione la hoja 4 antes de proteger
respecto a libros compartidos no estoy seguro pero calculo que si (claro que si está el archivo usado por otra persona en ese momento y "tocando" justo esas celdas, se puede empezar a complicar )
Hola Gustavo, no he solucionado el problema pero he avanzado, te explico:
He solucionado el problema que tenia que cuando se volvía a abrir el libro se podían seleccionar las celdas bloqueadas en la hoja 4 la cual estaba protegida. Esto pasaba por un error de excel 2007. He gravado el libro en excel 2003 y funciona bien. Me he instalado el service pack office2007 y se ha solucionado el problema, ahora al abrir el libro en excel 2007 ya no se pueden seleccionar las celdas bloqueadas. Hasta aquí perfecto, tengo la mitad del problema resuelto
El problema que se me plantea es que mediante una macro pego filas de la hoja 3 a la hoja 4 y en este proceso necesito poder pegar datos en columnas bloqueadas. Pero no se como hacer esto porque el libro esta compartido y no puedo ponerlo en exclusivo para desproteger y volver a proteger y compartir, ya que afecto al resto de usuarios que están trabajando.
Gracias por tu ayuda
Hola Gustavo, perdona el bombardeo de emails pero he resuelto casi todo el problema permitiendo a usuarios modificar rangos y solo me queda un pequeño detalle para poder dar por finalizado este asunto, te explico: Necesito proteger la hoja y permitiendo aplicar formatos a todas las columnas excepto la B, C, DE y no se como poner la instrucción, la grabadora me da este código
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _
, AllowFormattingColumns:=True, AllowFiltering:=True
Pero no ser como indicar que el formato de columnas B:C no se puede modificar. Puedes ayudarme y así finalizo esta dichosa consulta que no te imaginas la guerra que me ha dado... pero con tu ayuda seguro que puedo decir que esta batalla esta ganada. Mil gracias.
No entiendo, ¿querés qué en B y C pueda modificar la celda pero NO el formato? Porque no estoy seguro que se pueda (me parece que es "a todo o nada")...
Dentro del menú Herramientas > Proteger, hay una opción que dice "Permitir que los usuarios modifiquen rangos" pero la verdad que no tuve tiempo de investigarlo...
Perdona tal vez exprese mal la pregunta, cuando proteges la hoja hay una opción que es permitir dar formato a las columnas. Pues bien, yo quiero permitir dar formato a todas las columnas excepto a la B, C y DE, ¿se puede indicar esto de en el código?
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _
, AllowFormattingColumns:=True, AllowFiltering:=True
Gracias por tu ayuda
Muchas gracias por todo, ya he podido solucionar el problema, he tenido que olvidarme de mis perspectivas iniciales, pero se puede decir que el problema lo he solucionado. Si me surge algún otro espero poder contar con tu ayuda. Estoy haciendo un libro excel bastante grande y llevo semanas con el, no me extrañaría que me quedará parado en otro paso. Repito, gracias por todo y por tu tiempo

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas