Bloquear celdas una vez introducido un valor
Estoy creando una hoja de excel, que lleva macros, bloqueos, condicionales, etc etc pero me falla una cosa!.
Hay unas celdas que la gente debe introducir un numero. Quieo que una vez hayan introducido el número esta celda se bloquee y ya no puedan escribir.
Las celdas que quiero bloquear son de la E13 a la J13.
Igualmente luego tengo una macro hecha para que inserten filas y se vaya copiando formato. Por lqoue supongo que si se lo introduzco a esta fila ya me la copiara.
Muchissmmmaassss gracias! Me ayudariais ya que estoy estancanda con ello!
2 Respuestas
Instrucciones:
Las celdas E13 y J13 tienen que estar desbloqueadas (dentro de su formato), después partimos de una situación con la hoja protegida, es decir, podemos escribir en las celdas E13 y J13 con la hoja protegida. Posteriormente con esta macro en el evento change de la hoja, cuando usemos cualquiera de las dos celdas desprotegerá la hoja, las bloqueará y dejará otra vez la hoja protegida. (En mi caso la contraseña es un intro)
(Recuerda finalizar y puntuar mi labor)
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$E$13" Or Target.Address = "$J$13" Then
ActiveSheet.Unprotect
ActiveCell.Locked = True
ActiveSheet.Protect
End If
End Sub
Hola Luis,
Lo primero de todo muchas gracias por responder!. Pero dos aclaraciones:
- Lo que quiero es que las celdas que van desde la E13: J13 se bloqueen una vez haya escrito en ellas. Es decir, escribo en la E13 un valor, se bloquea y no puedo volver a escribir. A part debería ser una macro que se ejecutara automáticamente. Que no se tuviera que ir expresamente a ejecutar la Macro.
- Por último me pones . "??Posteriormente con esta macro en el evento change de la hoja..". No se que quieres decir exactamente.
Muchissismmaaassssss gracias!!!! a ver si lo consigo hacer!
La macro que te he enviado no hace falta ejecutarla, es un evento y se dispara cuando se produce un cambio en la hoja, en este ejemplo, cuando introduzcas datos. Para que funcione en todo el rango E13:J13 utiliza esta:
(Repito, esta macro no hay que ejecutarla, es un evento y se autoejecuta cuando se produce un cambio en la hoja a la que esta vinculada)
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("e13:j13")) Is Nothing Then
ActiveSheet.Unprotect
Target.Locked = True
ActiveSheet.Protect
End If
End Sub
Si ha quedado claro finaliza la pregunta
Esta macro no se pone en módulo sino dentro de la hoja que queremos que trabaje, es decir, tienes que entrar en el editor de visual basic pulsando ALT F11 y verás a la izquierda una estructura de tu archivo excel con todas las hojas. Tienes que dar doble click a la hoja afectada y en la parte blanca de la derecha de la pantalla tienes que pegar mi última macro.
Hola!
Perfecto me ha funcionado!!!!! pero me he encontrado con un problema. Pensaba que iba a ser mas sencillo. Como comenté tengo una hoja con una macro. Es una tabla con datos de la A a la J. Pero de la E a la I es donde la gente rellena con valores y se bloquea después de escribir ( lo que me has enviado.) La Macro que he creado es un botón para que la gente vaya insertando lineas ( donde copia el formato y las formulas que tengo.) Y ellos rellenan de la E a la I.
La hoja tiene las celdas bloqueadas, para que no borren las formulas. Y es aquí donde viene mi problema. Por que al insertar tu Macro cuando doy a mi Macro "insertar fila", las formulas ya no las copia..... y luego no para de salir avisos de "protección hoja"
Igualmente muchas gracias por lo ayudarme!!!!
Adjunto macro por si ayuda.
INSERTARFILA Macro
'
'Dim n, m As Integer
n = ActiveCell.Row
m = ActiveCell.Column
Rows(n).Select
ActiveSheet.Unprotect "PRUEBA"
Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
Rows(n - 1).Select
Selection.Copy
Rows(n).Select
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
Range("B" & n).Select
ActiveCell.FormulaR1C1 = "P"
Range("J" & n - 1).Select
Selection.Copy
Range("J" & n).Select
Selection.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Range("L" & n).Select
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = "=+RC[-11]"
Range("M" & n).Select
ActiveCell.FormulaR1C1 = "R"
Range("N" & n).Select
ActiveCell.FormulaR1C1 = "=+RC[-11]"
Range("O" & n).Select
ActiveCell.FormulaR1C1 = "=+RC[-11]"
Range("U" & n - 1).Select
Selection.Copy
Range("U" & n).Select
Selection.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Range("V" & n - 1).Select
Application.CutCopyMode = False
Selection.Copy
Range("V" & n).Select
Selection.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
ActiveSheet.Protect "PRUEBA"
End Sub
Pon esto en la primera linea de TU MACRO (evidentemente después de la linea de nombre de la macro)
Application.EnableEvents = False
y en la última fila antes del end sub pon esto:
Application.EnableEvents = true
Ahora tu macro debería funcionar.
Muchísimas Gracias, lo que me vas diciendo funciona a la perfección! Pero....me he encontrado el último eslabón.
En Su "macro" he puesto : If Not Intersect(Target, Range("e:i")) Is Nothing Then.
Entonces ellos me rellenan, p. ej, la E13,F13,G13. Y se bloquean. Todo Ok. Pero entonces insertan una fila y van a rellenar la E14,F14 y no les deja porque dice que esta bloqueada. Claro, yo he puesto la orden de bloquear de la E a la I pero debería bloquearse en la misma fila, para cuando inserten otra fila puedan rellenar en la fila ( de abajo) de la E a la I.
Muchísimas Gracias!!!
En ese caso sería conveniente poner esa línea de esta manera:
If Not Intersect(Target, Range("e13:i2000")) Is Nothing Then
Si estás conforme finaliza
Buenos días,
No me funciona, SI escribo en la E13, luego en la linea insertada de abajo, E14 no puedo escribir. Y si no escribo en la F13, si que em deja en la F14.
Un momento. Es necesario antes de ejecutar la macro hacer lo siguiente:
1- Desprotege la hoja
2-Selecciona el rango E13:I2000 ----- botón derecho ---- formato de celdas----- proteger---- y deja las dos casillas sin pinchar.
3- Protege la hoja
4- Ejecuta la macro
He probado mi macro y funciona perfectamente, intenta hacerlo otra vez todo el proceso y sin usar tu macro. Yo lo he hecho un funciona. Habría que revisar la tuya. Cuando tenga un minuto lo haré, tengo muchas peticiones.
De nuevo, Muchas gracias por tu ayuda.
Sin mi macro funciona Ok, pero al introducir macro ja no me deja escribir. debe haber algo con las contranseñas...
Te Pongo los pasos que estoy haciendo y las macro como quedan. No hay forma...hay algo que se me escapa de las contrasenyas...Por que en el libro tengo todas las celdas desbloqueadas.
1 - HOJA DESPROTEGIDA
2 - TODAS LAS CELDAS DESPROTEGIDAS
5 - A MI MACRO QUITO LA CONTRASEÑA Y FUNCIONA OK .
3 - PROTEJO HOJA CON CLAVE "POR"
4 - PONGO FORMULA "ALT + F11" CON CONTRASEÑA "POR"
5 - Y FUNCIONA BIEN!! PUEDO ESCRIBIR EN CUALQUIER FILA DE LA E A LA I. Y DESPUÉS LO BLOQUEA CORRECTAMENTE
6 - HAGO MI MACRO Y NO ME DEJA
7 - LE PONGO A LA MACRO LA CONTRANSEÑA "POR"
8 - ME SIGUE DANDO PROBLEMAS LA MACRO
9 - LE PONGO A LA MACRO LA ORDEN DE QUE TENGA EN CUENTA LO QUE HE PUESTO EN "ALT+F11"
10 - ME HACE BIEN LA MACRO (CON FORMULAS)PERO NO ME DEJA INSERTAR VALORES EN LAS FILAS DE LA E - I QUE HAYA PUESTO ALGO EN LAS FILAS DE ARRIBA
MI MACRO:
Sub INSERTARFILA()
'
' INSERTARFILA Macro
'
Application.EnableEvents = False
'Dim n, m As Integer
n = ActiveCell.Row
m = ActiveCell.Column
Rows(n).Select
ActiveSheet.Unprotect "POR"
Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
Rows(n - 1).Select
Selection.Copy
Rows(n).Select
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
Range("B" & n).Select
ActiveCell.FormulaR1C1 = "P"
Range("J" & n - 1).Select
Selection.Copy
Range("J" & n).Select
Selection.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Range("L" & n).Select
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = "=+RC[-11]"
Range("M" & n).Select
ActiveCell.FormulaR1C1 = "R"
Range("N" & n).Select
ActiveCell.FormulaR1C1 = "=+RC[-11]"
Range("O" & n).Select
ActiveCell.FormulaR1C1 = "=+RC[-11]"
Range("U" & n - 1).Select
Selection.Copy
Range("U" & n).Select
Selection.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Range("V" & n - 1).Select
Application.CutCopyMode = False
Selection.Copy
Range("V" & n).Select
Selection.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
Application.EnableEvents = True
ActiveSheet.Protect "POR"
End Sub
TU MACRO:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("e13:I2000")) Is Nothing Then
ActiveSheet.Unprotect "POR"
Target.Locked = True
ActiveSheet.Protect "POR"
End If
End Sub
Ya he visto un error a simple vista:
La linea:
ActiveSheet. Unprotect "POR"
Se escribe así:
activesheet.unprotect password:="POR"
Y la linea
ActiveSheet. Unprotect "POR"
Se escribe así:
ActiveSheet.Unprotect password:= "POR"
Dime una cosa: Descríbeme al detalle que hace tu macro para hacerlo yo a mi manera y cuando tenga el resultado te lo comento. ¿Ok?
Hola.
Las macros son las que le he adjuntado.
Mi hoja consiste en:
Dos tablas ( la Primera tabla va de la A a la J. Y la segunda tabla va de la L a la V)
Hay una fila de la A a la J. De la A a la D hay datos que la gente debe rellenar, com nombre y descripción. De la E a la I la gente debe poner valor numéricos(queue se deben bloquear una vez escritas.). Y en la casilla J es una formula que multiplica los valores de la E a la I por un importe.
Acto seguido hay otra fila que va de la L a la V. (es la misma tabla que copia datos de la anterior para hacer comparativas,) De la L a la O, copia lo mismo que se pone en la fila de la A a la D. De la P a la T deben poner valores numéricos también ( pero estas celdas no deben bloquearse) y en la U y la V hay formulas para comparar con la otra "tabla" ( filas de la A a la J).
Así que mi macro consiste en "insertar fila". Cuando han rellanado una fila, dan mi Macro y así se copia formato y formulas.
A ver si esto nos ayuda!
- Compartir respuesta