Bloquear solo llenas (Fernando Arroyo)

30/12/2003 - 11:04 por Compumakro | Informe spam
Hola Fernándo.
La idea es que no emerja ningún cuadro y permita introducir datos si la
celda está vacía.
Luego se introducen datos y ahí si pide contraseña.

Yo hice lo siguiente pero emerje dos veces el pedir contraseña. Además igual
pide contraseña con las celdas vacías.

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim Permiso As String
Permiso = InputBox("¿Cuál es tu clave?")
If Target.Cells(1).Value >= 1 Then
InputBox ("¿Cuál es tu clave?")
If Permiso <> "password" Then
MsgBox "La clave ¡ NO es correcta !!!"
Else
Target = InputBox("Indica el dato para la celda " & Target.Address)
End If
Application.EnableEvents = False
Cells(Cells(65536, Target.Column).End(xlUp).Row + 1,
Target.Column).Select
Application.EnableEvents = True
End If
End Sub


Saludos
Oscar
Barranquilla

Preguntas similare

Leer las respuestas

#1 Héctor Miguel
31/12/2003 - 10:32 | Informe spam
hola, oscar !

[me parece que] esta consulta esta relacionada con una anterior acerca de ''ingreso por inputbox' del dia 20 :))
['aunque'... tampoco 'supe' si te fue 'de utilidad' la propuesta] :((

si entiendo bien [la secuencia de tus consultas], lo que 'intentas' hacer es...
1.- 'impedir' al usuario que introduzca datos 'directamente' en las celdas [¿'inhabilitar' el teclado???]
2.- 'filtrar' [todas] las entradas a las celdas por 'inputboxes' [aunque el 'efecto final' es igual a una 'entrada directa'] -???-
3.- 'de paso' [si la celda tiene datos]... pedirle una contraseña para 'poder modificar' su contenido [mismo comentario]

[oscar dice...]
... que no emerja ningun cuadro y permita introducir datos si la celda esta vacia [...]
... lo siguiente ... emerje dos veces el pedir contraseña ... igual pide contraseña con las celdas vacias [...]



==> la 'aparicion' de los inputboxes 'obedece' a la 'secuencia' [y la logica] de las instrucciones en el codigo <= ademas de que 'modificar' una celda 'dispara' -nuevamente- el evento '_SelectionChange'
[NO 'importa' si NO 'sucede' un cambio 'real' o 'efectivo' de la celda 'activa' o... '_SelectionChange']

'atendiendo' al 'asunto' que 'nos ocupa'...
1.- para 'inhabilitar' el teclado [y el raton] para el usuario, 'se puede usar' => Application.Interactive = False < Pros: el usuario NO PODRA 'usar' el teclado [ni el raton]... ¡ PARA NADA !!!
Cons: TAMPOCO 'cambiar de celda activa', NI 'cerrar' la aplicacion [...] ¡ NI NADA !!!
TAMPOCO la aplicacion ['por si misma'] 'regresa' [a True] la 'interactividad' con el usuario <== OJO

2.- para los 'efectos' que necesitas [si he 'interpretado bien' la secuencia de tus consultas]
al final expongo una 'combinacion' de eventos que tiene un 'efecto similar' al 'Application.Interactive = False'
[creo que 'cubriendo' ademas -casi todas- las 'eventualidades' de acciones del usuario y tus 'requerimientos'] :))

saludos,
hector.

en el modulo de codigo de 'la hoja' ==' para cuando el usuario 'cambie' la seleccion de la celda 'activa' '
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim DatoActual As String, Permiso As String, DatoNuevo As String
DatoActual = Target.Cells(1, 1).Formula
If Not IsEmpty(Target.Cells(1, 1)) Then
Permiso = InputBox("¿Cual es tu clave?", "")
If Permiso <> "PassWord" Then GoTo ClaveInválida
End If
DatoNuevo = InputBox("Ingresa el nuevo dato.", "")
If DatoNuevo = "" Then
If DatoActual <> "" Then
If MsgBox("¿Confirmas el ""borrado"" del dato actual en " & _
Target.Cells(1, 1).Address(False, False) & "?", _
vbOKCancel + vbQuestion + vbDefaultButton2, "") = vbCancel _
Then GoTo SiguienteCelda Else GoTo Modificar
Else: GoTo SiguienteCelda
End If
Else
Modificar:
Application.EnableEvents = False
Target.Cells(1, 1) = DatoNuevo: DatoActual = DatoNuevo
Application.EnableEvents = True
End If
Exit Sub
ClaveInválida:
MsgBox "Clave... ¡ Incorrecta !!!", , ""
SiguienteCelda:
DatoActual = ""
Application.EnableEvents = False
Cells(65536, Target.Column).End(xlUp).Select
If Not IsEmpty(ActiveCell) Then ActiveCell.Offset(1).Select
Application.EnableEvents = True
End Sub

' por si cuando el usuario modifica 'directamente' el contenido de la celda '
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
Application.Undo
Application.EnableEvents = True
End Sub

P.D. [espero que no lo tomes 'a mal'] :))
[creo que] no es 'buena idea' pedir 'que responda' [solamente] algun grupo o persona 'en particular' :((
[con seguridad] 'alguien mas' podria tener la respuesta ANTES que 'el interpelado'... 'pero'... ¿responderia???
[inclusive, 'el interpelado' pudiera no 'estar disponible' en ese momento y A TI pudiera 'urgirte' una solucion] :\\
Respuesta Responder a este mensaje
#2 Héctor Miguel
03/01/2004 - 03:56 | Informe spam
hola, Oscar !

... que se pueda escribir en una celda en Blanco
... pero una vez que tenga dato y se vuelva a seleccionar te pida una contraseña para ser modificada.
Esta ... te pide contraseña solo si la celda tiene datos. No lo pide si esta Vacia:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Cells(1).Value <> "" Then
MsgBox "Esta celda no se puede modificar."
Application.EnableEvents = False
Cells(Cells(65536, Target.Column).End(xlUp).Row + 1, Target.Column).Select
Application.EnableEvents = True
End If
End Sub
... quiero que esta ultima en vez que me diga que ... no se puede modificar, me pida una contraseña para ser modificada [...]
Saludos y Prospero 2004
Oscar Barranquilla
PD: Veo que tienes buen humor y eso muy bueno.



==> primero... 'lo primero'... mis mejores deseos para ti y los tuyos en el proximo año 2004 [y 'los que vengan']
con relacion a lo del 'buen humor'... SI... de vez en cuando... 'lo dejo aparecer'... :))

==> pasando ahora a 'lo que nos ocupa'... :))
con un 'mejor entendimiento' [de parte mia] de lo que 'realmente' quieres [primeras dos lineas de este mensaje]...
unos comentarios 'previos' de [algunas] 'situaciones' con las cuales 'se tiene que lidiar' [en 'estos casos'] :)) o... :((
algunas caracteristicas 'de navegacion' que intervienen [o 'interfieren'] en 'detectar' un '_SelectionChange' son [p.e.]...
1.- si el usuario 'acostumbra' [usar] la 'facilidad' de 'mover seleccion despues de entrar' [y en que direccion 'se va']
=> herramientas / opciones / [ficha] modificar
2.- si el usuario 'selecciona' un rango [mas de una celda]... mientras 'navega' por el, el evento '_SelectionChange' NO se 'dispara'
=> podria 'tener incluidas' celdas 'NO vacias' en esa seleccion y... el evento '_SelectionChange'... => NI 'se da cuenta'
:((
=> la 'mejor alternativa' es... EVITAR que el usuario seleccione mas de una celda por vez o ...
una 'combinacion' [bastante extensa] de 'trucos' con eventos y 're-asignaciones' de las teclas de navegacion :((
3.- AUN SIN la 'caracteristica' de 'mover seleccion despues de entrar'... 'presionar' {Enter} en una celda... SI 'lo dispara'
[lo que ocasiona un -aparente- 'doble-evento]
=> aunque el cursor 'se quede donde mismo'... la aplicacion 'considera' que SI hubo 'cambio de seleccion'
p.e. una 'simple linea' con =>MsgBox Target.Address<= 'puesta' EN LOS DOS eventos [_Change y _SelectionChange]
al 'presionar' {Enter} en una celda [aun vacia] SIN la caracteristica de 'mover seleccion despues de entrar' ...
el cursor 'se queda ahi'... 'pero'... el mensaje 'aparece' DOS VECES [una por cada evento]

bueno... [espero que...] no me preguntes 'porque'... 'pero'... los siguientes codigos son 'la mejor alternativa' a tu
'requerimiento'

saludos,
hector.

P.D. en las pruebas, 'separe' los codigos [con las diferentes 'combinaciones'] =>y 'anote' sus 'fallas'< si te interesan... te los hago llegar :))
o... si necesitas ayuda para 'descifrar' lo que hace cada parte del codigo... ¿avisas?

en el modulo de codigo de 'la hoja' ==Dim MoverAlEnter As Boolean
Private Sub Worksheet_Activate()
MoverAlEnter = Application.MoveAfterReturn
Application.MoveAfterReturn = False
Application.OnKey "{Enter}", "Sin_Monitor"
Application.OnKey "~", "Sin_Monitor"
End Sub
Private Sub Worksheet_Deactivate()
Application.MoveAfterReturn = MoverAlEnter
Application.OnKey "{Enter}"
Application.OnKey "~"
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim Permiso As String
If Target.Cells.Count > 1 Then
Application.EnableEvents = False
ActiveCell.Select
Application.EnableEvents = True
End If
If IsEmpty(ActiveCell) Then Exit Sub
Permiso = InputBox("¿Cual es tu clave?", "")
If Permiso <> "PassWord" Then
MsgBox "Clave... ¡ Incorrecta !!!", , ""
Cells(65536, ActiveCell.Column).End(xlUp).Offset(1).Select
End If
End Sub

en un modulo de codigo 'normal' ==Option Private Module
Sub Sin_Monitor()
Application.EnableEvents = False
Application.OnTime Now + TimeValue("0:00:01"), "HabilitarEventos"
End Sub
Sub HabilitarEventos()
Application.EnableEvents = True
End Sub
Respuesta Responder a este mensaje
#3 Compumakro
04/01/2004 - 19:05 | Informe spam
Hector Miguel:
Ya lo probé y está excelente. Vi también que no deja seleccionar Rangos.
No se porqué tengo el presentimiento que ésta solución va a ser de mucha
utilidad a más de uno. Eso me alegra.
Espero de tu gentileza, las explicaciones de los detalles.
Un Abrazo
Oscar
Barranquilla

"Héctor Miguel" escribió en el mensaje
news:
hola, Oscar !

> ... que se pueda escribir en una celda en Blanco
> ... pero una vez que tenga dato y se vuelva a seleccionar te pida una


contraseña para ser modificada.
> Esta ... te pide contraseña solo si la celda tiene datos. No lo pide si


esta Vacia:
> Private Sub Worksheet_SelectionChange(ByVal Target As Range)
> If Target.Cells(1).Value <> "" Then
> MsgBox "Esta celda no se puede modificar."
> Application.EnableEvents = False
> Cells(Cells(65536, Target.Column).End(xlUp).Row + 1,


Target.Column).Select
> Application.EnableEvents = True
> End If
> End Sub
> ... quiero que esta ultima en vez que me diga que ... no se puede


modificar, me pida una contraseña para ser modificada [...]
> Saludos y Prospero 2004
> Oscar Barranquilla
> PD: Veo que tienes buen humor y eso muy bueno.

==> primero... 'lo primero'... mis mejores deseos para ti y los tuyos


en el proximo año 2004 [y 'los que vengan']
con relacion a lo del 'buen humor'... SI... de vez en cuando...


'lo dejo aparecer'... :))

==> pasando ahora a 'lo que nos ocupa'... :))
con un 'mejor entendimiento' [de parte mia] de lo que 'realmente' quieres


[primeras dos lineas de este mensaje]...
unos comentarios 'previos' de [algunas] 'situaciones' con las cuales 'se


tiene que lidiar' [en 'estos casos'] :)) o... :((
algunas caracteristicas 'de navegacion' que intervienen [o 'interfieren']


en 'detectar' un '_SelectionChange' son [p.e.]...
1.- si el usuario 'acostumbra' [usar] la 'facilidad' de 'mover seleccion


despues de entrar' [y en que direccion 'se va']
=> herramientas / opciones / [ficha] modificar
2.- si el usuario 'selecciona' un rango [mas de una celda]... mientras


'navega' por el, el evento '_SelectionChange' NO se 'dispara'
=> podria 'tener incluidas' celdas 'NO vacias' en esa seleccion y...


el evento '_SelectionChange'... => NI 'se da cuenta'
:((
=> la 'mejor alternativa' es... EVITAR que el usuario seleccione mas


de una celda por vez o ...
una 'combinacion' [bastante extensa] de 'trucos' con eventos y


're-asignaciones' de las teclas de navegacion :((
3.- AUN SIN la 'caracteristica' de 'mover seleccion despues de entrar'...


'presionar' {Enter} en una celda... SI 'lo dispara'
[lo que ocasiona un -aparente- 'doble-evento]
=> aunque el cursor 'se quede donde mismo'... la aplicacion


'considera' que SI hubo 'cambio de seleccion'
p.e. una 'simple linea' con =>MsgBox Target.Address<= 'puesta'


EN LOS DOS eventos [_Change y _SelectionChange]
al 'presionar' {Enter} en una celda [aun vacia] SIN la


caracteristica de 'mover seleccion despues de entrar' ...
el cursor 'se queda ahi'... 'pero'... el mensaje 'aparece' DOS


VECES [una por cada evento]

bueno... [espero que...] no me preguntes 'porque'... 'pero'... los


siguientes codigos son 'la mejor alternativa' a tu
'requerimiento'

saludos,
hector.

P.D. en las pruebas, 'separe' los codigos [con las diferentes


'combinaciones'] =>y 'anote' sus 'fallas'<> si te interesan... te los hago llegar :))
o... si necesitas ayuda para 'descifrar' lo que hace cada parte


del codigo... ¿avisas?

en el modulo de codigo de 'la hoja' ==> Dim MoverAlEnter As Boolean
Private Sub Worksheet_Activate()
MoverAlEnter = Application.MoveAfterReturn
Application.MoveAfterReturn = False
Application.OnKey "{Enter}", "Sin_Monitor"
Application.OnKey "~", "Sin_Monitor"
End Sub
Private Sub Worksheet_Deactivate()
Application.MoveAfterReturn = MoverAlEnter
Application.OnKey "{Enter}"
Application.OnKey "~"
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim Permiso As String
If Target.Cells.Count > 1 Then
Application.EnableEvents = False
ActiveCell.Select
Application.EnableEvents = True
End If
If IsEmpty(ActiveCell) Then Exit Sub
Permiso = InputBox("¿Cual es tu clave?", "")
If Permiso <> "PassWord" Then
MsgBox "Clave... ¡ Incorrecta !!!", , ""
Cells(65536, ActiveCell.Column).End(xlUp).Offset(1).Select
End If
End Sub

en un modulo de codigo 'normal' ==> Option Private Module
Sub Sin_Monitor()
Application.EnableEvents = False
Application.OnTime Now + TimeValue("0:00:01"), "HabilitarEventos"
End Sub
Sub HabilitarEventos()
Application.EnableEvents = True
End Sub


Respuesta Responder a este mensaje
#4 Héctor Miguel
07/01/2004 - 07:19 | Informe spam
hola, Oscar !

... explicaciones de los detalles.



[solo por si no analizaste ya el codigo] :))

[en el caso que requerias] hay tres cosas que tenian que ser 'evitadas':
1.- que el usuario seleccionara varias celdas.
a) mientras 'navega' por el rango, el evento '_SelectionChange' NO se 'dispara'
b) podria 'incluir' celdas 'NO vacias' en esa seleccion [SIN ser 'detectadas']
2.- que el cursor se desplazara a una siguiente celda al presionar 'enter'.
[por 'problemas de deteccion' de si la celda habia sido cambiada -en su valor- o no]
3.- que excel 'interpretara' un 'enter' como un 'siguiente' 'Worksheet_SelectionChange'
[se 'dispara' DOS VECES el evento 'Worksheet_SelectionCjange']

en los casos 2 y 3, se podria 'activar' dos veces o 'SIN necesidad' la solicitud de la contraseña :((

en pocas palabras, y tratando de hacer 'entendible' el funcionamiento del codigo...
para 'prevenir' [o 'corregir'] las tres situaciones:
1° 'capturamos' el estado del 'mover seleccion despues del enter' Y la 'utilizacion' de la/s tecla/s {Enter}
a) las 'sustituimos' por nuestras 'necesidades de navegacion' [en el evento 'Worksheet_Activate' y...
b) las 'restituimos' a su 'estado original' [en el evento 'Worksheet_Deactivate']
2° 'evitamos' una seleccion 'multiple' del usuario [en el evento 'Worksheet_SelectionChange']
'dejandolo' EN LA PRIMERA que 'habia seleccionado' [o donde 'inicio' la seleccion 'multiple']
__________
If Target.Cells.Count > 1 Then
Application.EnableEvents = False
ActiveCell.Select
Application.EnableEvents = True
End If
¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨
saludos,
hector.
Respuesta Responder a este mensaje
#5 Compumakro
09/01/2004 - 01:14 | Informe spam
Gracias Hector M.
Cordial Saludo
Oscar
Barranquilla

"Héctor Miguel" escribió en el mensaje
news:
hola, Oscar !

> ... explicaciones de los detalles.

[solo por si no analizaste ya el codigo] :))

[en el caso que requerias] hay tres cosas que tenian que ser 'evitadas':
1.- que el usuario seleccionara varias celdas.
a) mientras 'navega' por el rango, el evento '_SelectionChange' NO se


'dispara'
b) podria 'incluir' celdas 'NO vacias' en esa seleccion [SIN ser


'detectadas']
2.- que el cursor se desplazara a una siguiente celda al presionar


'enter'.
[por 'problemas de deteccion' de si la celda habia sido cambiada -en


su valor- o no]
3.- que excel 'interpretara' un 'enter' como un 'siguiente'


'Worksheet_SelectionChange'
[se 'dispara' DOS VECES el evento 'Worksheet_SelectionCjange']

en los casos 2 y 3, se podria 'activar' dos veces o 'SIN necesidad'


la solicitud de la contraseña :((

en pocas palabras, y tratando de hacer 'entendible' el funcionamiento del


codigo...
para 'prevenir' [o 'corregir'] las tres situaciones:
1° 'capturamos' el estado del 'mover seleccion despues del enter' Y la


'utilizacion' de la/s tecla/s {Enter}
a) las 'sustituimos' por nuestras 'necesidades de navegacion' [en


el evento 'Worksheet_Activate' y...
b) las 'restituimos' a su 'estado original' [en el evento


'Worksheet_Deactivate']
2° 'evitamos' una seleccion 'multiple' del usuario [en el evento


'Worksheet_SelectionChange']
'dejandolo' EN LA PRIMERA que 'habia seleccionado' [o donde


'inicio' la seleccion 'multiple']
__________
If Target.Cells.Count > 1 Then
Application.EnableEvents = False
ActiveCell.Select
Application.EnableEvents = True
End If
¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨
saludos,
hector.


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida