Macro que se ejecute al guardar el archivo de excel,

Tengo un libro de excel al que varios usuarios acceden mediante la red, para alimentar los datos, quiero que cuando el usuario guarde el archivo todos los datos queden bloqueados para que no se los borre alguien más, pero que si se pueda seguir agregando información en las líneas siguientes. Si se les ocurre una forma que no sea la que a mi se me ocurrió y que por supuesto es funcional, son bienvenidas las ideas.

1 Respuesta

Respuesta
4

Con la siguiente macro se bloquean las celdas utilizadas, se protege una hoja y se guarda el archivo.

El evento se ejecuta cuando se guarda el archivo.

Para que las celdas estén bloqueadas la hoja tiene que estar protegida, en mi ejemplo le puse de password "abc", cambia el password por la palabra que desees.

No mencionaste cuál hoja es la que se tiene que proteger, así que cambia en la macro "Hoja1" por el nombre de tu hoja, si son varias se tendría que hacer un ciclo para todas las hojas.

Tampoco pusiste cuál es tu idea, así que voy a poner mi idea con el riesgo de que pueda ser igual a la tuya.



Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
'Por.Dante Amor
    Set h1 = Sheets("Hoja1")
    h1.Unprotect "abc"
    h1.Cells.Locked = False
    h1.UsedRange.Locked = True
    ActiveSheet.Protect "abc", _
        DrawingObjects:=False, Contents:=True, _
        Scenarios:=False, AllowFormattingCells:=True, _
        AllowFormattingColumns:=True, AllowFormattingRows:=True, _
        AllowInsertingColumns:=True, AllowInsertingRows:=True, _
        AllowInsertingHyperlinks:=True, AllowDeletingColumns:=True, _
        AllowDeletingRows:=True, AllowSorting:=True, AllowFiltering:=True
End Sub

Instrucciones para poner la macro en ThisWorkbook

  1. Abre tu libro de excel
  2. Para abrir Vba-macros y poder pegar la macro, Presiona Alt + F11
  3. Del lado izquierdo dice: VBAProject, abajo dale doble click a ThisWorkbook
  4. Del lado derecho copia la macro

Saludos. Dante Amor

Recuerda valorar la respuesta.

Perdona, faltó un detalle en la macro

Cambia esta línea

ActiveSheet. Protect "abc",

Por esta

H1. Protect "abc",

Hola Dante, me funciona la macros que has elaborado, pero me bloquea toda la línea, ¿cómo puedo hacer para que bloquee exclusivamente las celdas que contengan datos?. De antemano mulla agradecido.

No bloquea toda la línea, lo que hace es bloquear todo un rango de datos, es decir, si en alguna celda de la columna "Z" tienes escrito algo, por ejemplo, si en la celda "Z55" tienes una palabra o un blanco (en lugar de vacío), entonces la macro te bloquea desde A1 hasta Z55. Pero las celdas de la siguiente columna no estarán bloqueadas.

Si quieres que se bloqueen solamente las celdas que contienen datos, entonces utiliza esta macro:

Sub bloca()
'Por.Dante Amor
    Set h1 = Sheets("Hoja1")
    h1.Unprotect "abc"
    h1.Cells.Locked = False
    h1.Cells.SpecialCells(xlCellTypeConstants, 23).Locked = True
    ActiveSheet.Protect "abc", _
        DrawingObjects:=False, Contents:=True, _
        Scenarios:=False, AllowFormattingCells:=True, _
        AllowFormattingColumns:=True, AllowFormattingRows:=True, _
        AllowInsertingColumns:=True, AllowInsertingRows:=True, _
        AllowInsertingHyperlinks:=True, AllowDeletingColumns:=True, _
        AllowDeletingRows:=True, AllowSorting:=True, AllowFiltering:=True
End Sub

Con esta macro si en "B5" tienes un dato, la celda "B5" se bloqueará, pero si la celda "C5" no tiene datos, entonces no se bloqueará aunque esté en la misma fila, y si la celda "B3" no tiene datos, entonces tampoco se bloqueará aunque esté en la misma columna.

Saludos. Dante Amor

Recuerda valorar la respuesta

Otra vez no cambié la línea

h1.Protect "abc", _

Puedes actualizarla en la macro.

¡Gracias! La macro ha quedado así:

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
'Por.Dante Amor
Set h1 = Sheets("Feuil1")
h1.Unprotect "abc"
h1.Cells.Locked = False
h1.Cells.SpecialCells(xlCellTypeConstants, 23).Locked = True
h1.Protect "abc", _
DrawingObjects:=False, Contents:=True, _
Scenarios:=False, AllowFormattingCells:=True, _
AllowFormattingColumns:=True, AllowFormattingRows:=True, _
AllowInsertingColumns:=True, AllowInsertingRows:=True, _
AllowInsertingHyperlinks:=True, AllowDeletingColumns:=True, _
AllowDeletingRows:=True, AllowSorting:=True, AllowFiltering:=True
End Sub

Por si alguien más tiene el mismo caso, la explicación ya la hado Dante arriba. Saludos y éxito en todo. Amigo experto, te has lucido con la ayuda. Que Dios te bendiga.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas