DESACTIVAR TECLADO.

23/11/2007 - 14:13 por Sofía Álvarez | Informe spam
Hola de nuevo.

Dándolo vueltas a una hoja, megustaría que no se pueda utilizar el teclado
para introducir datos. Más que nada para evitar el copiar el imprimir
pantalla. etc.

Se puede, y en caso afirmativo ¿cómo?.
 

Leer las respuestas

#1 Ivan
23/11/2007 - 14:31 | Informe spam
hola Sofia,


que no se pueda utilizar el teclado


para introducir datos. Más que nada para evitar el copiar el imprimir
pantalla. etc.





con permiso [espero] de Hector Miguel, y esperando que el acabe de matizartelo, aqui te pego un extracto de un articulo
suyo [si no me equivoco ya no esta disponible en la red] que hace referencia a la forma de deshabilitar algunos comandos
y sus atajos de teclado .

'extracto articlo 'Proteger xls' de Hector Miguel Orozco -

Impedir que el usuario utilice "algunos" Comandos.

Habrá ocasiones en las cuales "quisieras" que el usuario no pueda "copiar | cortar | pegar" datos "de" ni "a" ciertas
celdas, hojas o libros.

1.- Una manera sería "inhabilitar" el modo "Cortar/Copiar" de la aplicación ("imperceptible" para el usuario), usando
algún evento ("SelectionChange", "Activate", "Deactivate") de los objetos "Worksheet" ó "Workbook" con la siguiente
línea: Application.CutCopyMode = False. para "simular" el efecto de presionar {Esc} ("al momento de" copiar ó cortar)
"cancelando" de la memoria el contenido del "porta-papeles".

2.- Otra manera sería "inhabilitar" los "atajos de teclado" como {Ctrl}-C, {Ctrl}-X, {Ctrl}-V utilizando para ello el
método "OnKey" del objeto "Application" en cualquiera (o varios) de los eventos mencionados en el párrafo anterior.

La sintaxis del método es: Application.OnKey "Tecla", "Procedimiento". Donde: argumento "Tecla" es la tecla (o
combinación de teclas) que al ser presionada(s) "ejecutará(n)" la macro especificada por el argumento "Procedimiento".
Si se omite el procedimiento, la(s) tecla(s) "vuelve(n)" a su acción natural.

Por ejemplo, para impedir que se usen esas combinaciones de teclado en una hoja en específico, los siguientes códigos
"trabajan" bien:

Private Sub Worksheet_Activate()

Application.OnKey "^c", ""

Application.OnKey "^x", ""

Application.OnKey "^v", ""

End Sub
Cuando el usuario "activa" la hoja (con el código)...

Los "atajos de teclado" {Ctrl}-C, {Ctrl}-X, {Ctrl}-V

para "copiar", "cortar" y "pegar" quedan "inhabilitados" K

puesto que se especifica un argumento "vacío" para "la macro".




Private Sub Worksheet_Deactivate()

Application.OnKey "^c"

Application.OnKey "^x"

Application.OnKey "^v"

End Sub
Cuando el usuario "des-activa" la hoja (con el código)...

Los "atajos de teclado" {Ctrl}-C, {Ctrl}-X, {Ctrl}-V

para "copiar", "cortar" y "pegar" quedan "re-habilitados" J


Nota: El método "OnKey" (usado de la manera anterior) NO IMPIDE el uso de los comandos (por menús o botones) para
efectuar las mismas acciones de "copiar", "cortar" y "pegar".

Si quieres "impedir" que se usen "también" comandos "integrados" de Excel, entonces...

Opciones "avanzadas" para trabajar con menús y comandos:.

"Asegurar" un control de los comandos (sean barras de menús y/o herramientas) implica "averiguar" que tanto se han
personalizado en el "entorno" de cada usuario.

Considerando que los menús pueden contener submenús y éstos a su vez más submenús se debe desarrollar una macro que
pueda "ir descendiendo" a todos los niveles de todos los elementos existentes.

Una vez "detectados" los comandos "objetivo", una propiedad ("Enabled" o "Visible") habrá de permitir (o no) su uso.

Utilizaremos las siguientes variables Públicas:

Public Barra As CommandBar, _

Comando As CommandBarControl, _

Contenedor As CommandBarControl, _

Siguiente As Integer
Declaramos las variables del tipo "necesario"...


En los siguientes procedimientos | funciones:

Private Sub DesHabilitarComandos()

On Error Resume Next

For Each Barra In Application.CommandBars

For Each Comando In Barra.Controls

Siguiente = AtenuarProhibidos(Comando)

Next Comando

Next Barra

End Sub
Macro para "Des-Habilitar" comandos

Por si existiera algún error

Para buscar en TODAS las barras (Herramientas ó Menús)

Para buscar en TODOS los controles (Comandos ó Submenús)

Inicia un "bucle" de búsqueda (a través de una función "recursiva")

"Busca" en el siguiente botón

"Busca" en la siguiente Barra de Comandos

Fin del procedimiento




Private Function AtenuarProhibidos( _

Comando As CommandBarControl) _

As Integer

On Error Resume Next

Siguiente = 0

Select Case Comando.Type

Case 1, 2, 4, 6, 7, 13, 18

Select Case Comando.ID

Case 19, 21, 22

Comando.Enabled = False

End Select

Case Else

For Each Contenedor In Comando.Controls

Siguiente = Siguiente + AtenuarProhibidos(Contenedor)

Next Contenedor

Siguiente = Siguiente - 1

End Select

AtenuarProhibidos = Siguiente + 1

End Function
Función "recursiva" para "bajar" por los menús





Por si existiera algún error

"Inicializa" la variable del bucle

Para "afectar" sólo a Comandos ó Menús

Si es un botón de comando...

"Ver" cuál es

Si es "copiar", "cortar" ó "pegar"

Lo "DES-HABILITA"



Si es un Menú (ó Submenú)

... seguir buscando "más abajo"

... haciendo una "Re-Llamada" de la función

(continuar con el "bucle")

(regresar al bucle en el mismo control)

y ...

continuar "la llamada" a la función con "el siguiente"

Fin de la función


Aunque es posible que este procedimiento sea "auto-alternante" (podría cambiarse en la función la sentencia:
Comando.Enabled = False. por una que "auto-invierta" el estado del botón +/- así: If Comando.Enabled = True Then
Comando.Enabled = False Else Comando.Enabled = True.), para un control "más estable" es mejor "definir" procedimientos
"separados" (uno para inhabilitar y otro para re-habilitar los botones de comando). Dejo a tu criterio "la contra-parte".

Complementariamente (y para NO "perjudicar" la interacción con el usuario) puedes usar los eventos "WindowActivate" y
"WindowDeactivate" del objeto "ThisWorkbook" para que, los comandos queden inhabilitados "solamente" cuando la ventana
"activa" sea "el libro".

Private Sub Workbook_WindowActivate(ByVal Wn As Window)

DesHabilitarComandos

End Sub
Private Sub Workbook_WindowDeactivate(ByVal Wn As Window)

ReHabilitarComandos

End Sub


Puedes incluir además en los procedimientos, las opciones del usuario para "personalizar" las barras de menús y
herramientas para que "sufran" el mismo efecto que lo botones.

De esta manera, podrá agregar más barras (con los botones y menús que "no funcionan") siempre y cuando la ventana
"activa" sea "otro libro", pero... al "regresar" a nuestro libro... ¡dejarán de "funcionar" también!!!

Para mayor información acerca de las "ID's" (ó nombres) de otros comandos y menús que pudieras considerar como
"necesarios" de inhabilitar para protección de tu trabajo, visita la página:
http://support.microsoft.com/suppor...3/5/52.ASP

Otra acción "conveniente" de controlar es el uso del comando "especial" de guardar, para lo cual puedes aprovechar los
mismos eventos "WindowActivate" para "permitir su uso sólo en el libro" con la línea:
Application.CommandBars("File").Controls("Guardar &especial").Visible = True. y el evento "WindowDeactivate" para
"inhabilitar" su uso "fuera del libro" con otra línea "inversa" como: Application.CommandBars("File").Controls("Guardar
&especial").Visible = False..



'-



como te digo espero que el propio Hector acabe de aclararte lo que haga falta, pero asi por lo menos ya tendra un poco
de trabajo avanzado



un saludo

Ivan

Preguntas similares