Hola.
Necesito saber como proteger mis datos al cerrar el libro de trabajo, para que no puedan ser modificados, al mismo tiempo al abrirlo las celdas en blanco este disponible para introducir nuevos datos
Gracias
//-->
Hola.
Necesito saber como proteger mis datos al cerrar el libro de trabajo, para que no puedan ser modificados, al mismo tiempo al abrirlo las celdas en blanco este disponible para introducir nuevos datos
Gracias
Hola.
Excel permite proteger la hoja de cálculo. cuando proteges la hoja las celdas que estén bloqueadas no permiten modificar los datos, mientras que las celdas desbloqueadas si pueden ser editadas.
las opciones para bloquear o no una celda están en las propiedades de formato de celdas
Tu solución debería basarse en esto:
-tener desbloqueadas las celdas donde quieres permitir la entrada de datos
-bloquear las celdas con datos existentes, para que no se puedan modificar
-activar la protección de la hoja para que se tengan en cuenta estos bloqueos (en el menú contextual de la etiqueta de la hoja tienes la opción de "Proteger hoja...").
El problema es que la hoja debe desprotegerse para poder añadir o quitar nuevas celdas bloqueadas, además imagino que no convencerás a los usuarios de la hoja para que den estos pasos cada vez que editen la hoja y se protejan frente a sí mismos.
Para automatizar esto podrías crear una macro que desproteja la hoja, bloquee las nuevas celdas con información y vuelva a proteger la hoja, y todo esto por ejemplo antes de guardar el libro.
te doy una pista
Selection.Locked según sea true o false bloquea o desbloquea la selección
ActiveSheet.Protect protege la hoja puedes poner una contraseña y establecer qué quieres bloquear y qué no.
ActiveSheet.Unprotect la desprotege
graba una macro mientras lo haces a mano, para tener una idea de cómo podría ser tu macro.
------
Ya sé Excel, pero necesito más.
Deberías introducir el código de protección bien en:
- el módulo "ThisWorkbook" en una subrutina llamada sub Workbook_Close()
- en un módulo corriente y moliente con una subrutina llamada Auto_Close()
Bueno, pues donde quiera que lo pongas, deberías establecer el siguiente código:
(Lo tengo que dejar aquí, son las 9:00 y me voy al trabajo... queda pendiente que no asigna bien el rango a proteger... pero la idea y el desarrollo está casi completo, con todas las funciones y llamadas expuestas, a falta de solucionar ese problema con el interruptor correcto que protege la hoja)
Sub Auto_Close()
Dim xlLibroTrabajo As Excel.Workbook
Dim xlHoja As Excel.Worksheet
Dim rgRango As Excel.Range
Dim rgRangoDesprotegido As Excel.Range
Dim celda As Excel.Range
Dim lgHoja As Long
Dim lgUltimaFila As Long
Dim lgUltimaColumna As Long
Dim Pass As String
Pass = VBA.InputBox("Introduzca la clave para desproteger la hoja", "Contraseña", "a")
Set xlLibroTrabajo = ActiveWorkbook
For lgHoja = 1 To Worksheets.Count
Set xlHoja = Worksheets(lgHoja) 'También podrías quitar este For...Next y centrarte sólo en Set xlHoja = Worksheets("NOMBREHOJA")
With xlHoja
.Unprotect (Pass)
Call fUltimaPosicion(lgUltimaFila, lgUltimaColumna, xlLibroTrabajo, xlHoja) 'busca la última fila y la última columna con datos (puede ser tedioso)
Set rgRango = .Range(.Cells(1, 1), .Cells(lgUltimaFila, lgUltimaColumna))
For Each celda In rgRango.Cells
'Que recorra todas las celdas... y si están vacías, que las deje sin proteger
If celda.Value = vbNullString Then
If rgRangoDesprotegido Is Nothing Then Set rgRangoDesprotegido = celda
Set rgRangoDesprotegido = Union(rgRangoDesprotegido, celda)
End If
Next celda
rgRangoDesprotegido.Select
.Protection.AllowEditRanges.Add Title:="RangoDesprotegido", Range:=rgRangoDesprotegido
Set rgRango = Nothing
Set rgRangoDesprotegido = Nothing
.Protect Password:=Pass, DrawingObjects:=True, Contents:=True, Scenarios:=True
End With
Next lgHoja
Set xlLibroTrabajo = Nothing
End Sub
Public Function fUltimaPosicion(ByRef lgFilaUltima As Long, ByRef lgColumnaUltima As Long, _
Optional ByVal xlLibro As Excel.Workbook, _
Optional ByVal xlHoja As Excel.Worksheet) As Long
Dim bDesasignaLibro As Boolean, bDesasignaHoja As Boolean
If xlLibro Is Nothing Then Set xlLibro = ActiveWorkbook: bDesasignaLibro = True
If xlHoja Is Nothing Then Set xlHoja = xlLibro.ActiveSheet: bDesasignaHoja = True
Dim lgColorPrevio As Long
With xlHoja
If .UsedRange.Rows.Count <> .Cells.SpecialCells(xlCellTypeLastCell).Row Or _
.UsedRange.Columns.Count <> .Cells.SpecialCells(xlCellTypeLastCell).Column Then
lgColorPrevio = .Cells(1, 1).Interior.ColorIndex
.Cells(1, 1).Interior.ColorIndex = 2 'Para evitar los problemas con USEDRANGE
lgFilaUltima = .UsedRange.Rows.Count
lgColumnaUltima = .UsedRange.Columns.Count
.Cells(1, 1).Interior.ColorIndex = lgColorPrevio
Else
lgFilaUltima = .UsedRange.Rows.Count
lgColumnaUltima = .UsedRange.Columns.Count
End If
End With
If bDesasignaHoja Then Set xlHoja = Nothing
If bDesasignaLibro Then Set xlLibro = Nothing
End Function
-----------------------------------------------------------------
www.TrazEX.com (soluciones sobre Excel)
Gracias, precisamente es lo que quiero evitar, estar protegiendo y desprotegiendo los datos, pues he visto algunas macros que hacen esto protegiendo el dato una vez introducido el dato, sin embargo la inconveniente es que si el dato lo introdujo mal, ya no lo puede corregir por que se bloquea la celda, por eso es que quisiera ver la posibilidad de que una vez cerrado el libro, los datos queden protegidos y no se puedan modificar, al abrirlo nuevamente, pero si este disponibles nuevas celdas para introducir nuevos datos.
Saludes y buen día
Gracias.
Probare la opcion, aver si me resulta, me parece muy interesante esta opcion.
Saludes y te cuento como me va.