Macro que al cerrar o guardar no se puedan editar los datos ya ingresados pero si nuevos datos

Tengo un archivo al que muchas personas tienen acceso, donde cargan datos, necesito que al cerrar o al guardar se bloquee para que no puedan editar los datos ya ingresados pero si nuevos. Tengo varias hojas ya que se hace una por día y todos los días se cargan datos nuevos.

2 Respuestas

Respuesta
1

Para que las celdas se protejan la hoja debe estar protegida. Cambia en la macro "abc" por el password que desees.

Ante de ejecutar la macro, te debes asegurar que todas las celdas de todas las hojas, estén desbloqueadas (Menú: Formato, Formato de celda, Proteger, Desactiva casilla de Bloqueada)

Pon la siguiente macro en los eventos de Thisworkbook, cuando cierres o guardes el archivo se bloquearán las celdas.

Private Sub Workbook_BeforeClose(Cancel As Boolean)
'Por.Dante Amor
    For Each h In Sheets
        h.Unprotect "abc"
        h.Cells.SpecialCells(xlCellTypeConstants, 23).Locked = True
        h.Protect "abc", False, True, False, True, True, _
            True, True, True, True, True, True, True, True, True
        h.EnableSelection = xlNoRestrictions
    Next
    ActiveWorkbook.Save
End Sub
'
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
'Por.Dante Amor
    For Each h In Sheets
        h.Unprotect "abc"
        h.Cells.SpecialCells(xlCellTypeConstants, 23).Locked = True
        h.Protect "abc", False, True, False, True, True, _
            True, True, True, True, True, True, True, True, True
        h.EnableSelection = xlNoRestrictions
    Next
    ActiveWorkbook.Save
End Sub

Instrucciones para poner la macro en los eventos 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

¡Gracias! sos un capo! me re sirvió!!!

¿Y para que me haga exactamente eso que me pusiste pero además me oculte la hoja que tiene datos? Si es que la llego a necesitar para anexar datos le doy mostrar nomas.

La macro funciona con la hoja oculta.

Para ocultar la hoja agrega esto en las macros, después del "next"

h.Visible = False

Para mostrar la hoja, como dices solamente le das mostrar.

Me tira error

¿

Así tiene que quedar?

Private Sub Workbook_BeforeClose(Cancel As Boolean)
'Por.Dante Amor
For Each h In Sheets
h.Unprotect "abc"
h.Cells.SpecialCells(xlCellTypeConstants, 23).Locked = True
h.Protect "abc", False, True, False, True, True, _
True, True, True, True, True, True, True, True, True
h.EnableSelection = xlNoRestrictions
Next
h.Visible = False
ActiveWorkbook.Save
End Sub
'
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
'Por.Dante Amor
For Each h In Sheets
h.Unprotect "abc"
h.Cells.SpecialCells(xlCellTypeConstants, 23).Locked = True
h.Protect "abc", False, True, False, True, True, _
True, True, True, True, True, True, True, True, True
h.EnableSelection = xlNoRestrictions
Next
h.Visible = False
ActiveWorkbook.Save
End Sub

Disculpa, cambia esta línea

h.Visible = False

Por esta

Sheets("Hoja2").Visible = False

Cambia "Hoja2" por el nombre de la hoja que quieras ocultar, debes dejar una hoja visible, no puedes ocultar todas.

Si son varias hojas pon varias líneas con el nombre de la hoja:

Sheets("Hoja2").Visible = False

Sheets("Hoja3").Visible = False

¡Gracias! Buenísimo! Cualquier cosa te escribo ja ja

Pero a medida que voy haciendo la de los días y voy agregando hojas, ¿la macro se va actualizando?

No se si se entiende lo que digo.

Osea, si pongo que se oculte hasta la hoja 3 (después de escrita) y agrego más hojas, ¿la macro se actualiza y me sigue ocultando la cantidad de hojas que vaya agregando?

Además el tema es que yo creo hojas nuevas para que todos los días puedan cargar los datos y el nombre esta por defecto.

Cuando ellos cargan le cambian el nombre y ahí yo no sabría el nombre de la hoja hasta que cada uno agarre para cargar

Así quedarían las macros, elimina todas las anterior y pon estas, en la última macro dice: "Hojax" cambia este nombre por el nombre de la hoja que quieres que permanezca visible, todas las demás hojas del libro se ocultarán.

Private Sub Workbook_BeforeClose(Cancel As Boolean)
'Por.Dante Amor
    ProtegerOcultar
    ActiveWorkbook.Save
End Sub
'
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
'Por.Dante Amor
    ProtegerOcultar
End Sub
'
Sub ProtegerOcultar()
'Por.Dante Amor
    Set h1 = Sheets("Hojax")
    For Each h In Sheets
        If h.Name <> h1.Name Then
            h.Unprotect "abc"
            h.Cells.SpecialCells(xlCellTypeConstants, 23).Locked = True
            h.Protect "abc", False, True, False, True, True, _
            True, True, True, True, True, True, True, True, True
            h.EnableSelection = xlNoRestrictions
            h.Visible = False
        End If
    Next
End Sub

Por favor, podrías crear una pregunta nueva para tratar el tema de ocultar las hojas, ya que el tema era proteger celdas, pero ahora se extendió a ocultar hojas, al final de la descripción de la pegunta escribe que va dirigida a Dante Amor.

Si te funciona la macro, entonces en la pregunta publicaré la última macro, si tienes dudas, continuamos en la nueva pregunta.

vos sabes que me sirvió mucho la macro pero me quedan como bloqueadas las hojas y quedan como pesado el archivo y se cuelga.

Pongo la primer macro que me diste y cuando la abren de nuevo no les deja escribir en ninguna celda. Están todas bloqueadas no solamente las que tienen datos.

Quiero aclarar que las celdas tienen bordes, ¿afecta en algo? Por ahí lo toma como dato en la celda

Antes de ejecutar las macros, desprotege las hojas, selecciona todas las celdas y cambia el formato, en Formato, Formato de celdas, Proteger y desactiva la casilla

Ahora sí, las hojas están listas, empieza a escribir datos en tus celdas y cuando guardes la macro se activará, bloqueará las celdas y protegerá la hoja.

Cada vez que crees una hoja nueva, deberás hacer lo mismo.

Respuesta
1

Para bloquear los datos, podrías poner un evento al abrir el libro (que en principio sería equivalente que ponerlo al cerrar)

Private Sub Workbook_Open()
Dim s As Worksheet
For Each s In ThisWorkbook.Worksheets
   With s
      .Unprotect "tuPassword"
      .Cells.Locked = False                                          'desbloqueo todo
      .Cells.SpecialCells(xlCellTypeConstants, 23).Locked = True     'bloqueo constantes
      .Cells.SpecialCells(xlCellTypeFormulas, 23).Locked = True      'bloqueo fórmulas
      .Protect "tuPassword"
Next
End Sub

El único inconveniente que veo con esto es que en realidad no te lo está haciendo por día, sino por cada vez que abras y cierres el archivo (para hacer esto diario habría que complicar un poco el procedimiento ya que debería ir validando la fecha contra alguna variable para verificar si cambió de día, etc)

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas