Impedir el traslado de celdas...

Hola de nuevo, Valedor. Esta es mi segunda pregunta que te hago, y seguro que no debe ser excesivamente complicada de resolver, dados tus conocimientos de VBA. Bueno en realidad son dos preguntas en una. Ahí van:
1.- ¿Se puede impedir que un usuario mueva el contenido de determinada celda, y lo pegue en otra (bien con cortar y pegar o con Ctrl+X y Ctrl+V)?. Esto me es vital, porque si mueven determinadas celdas, los cálculos que de ellas se determinen, pueden contener errores o referencias no válidas. Deseo imposibilitar el traslado de celdas (o el contenido de las mismas).
2.- ¿Se puede impedir que un usuario interrumpa la ejecución de una macro, cuando pulsa por ejemplo -y entre otras-, la tecla ESC?. ¿Se pueden deshabilitar las teclas o combinaciones de teclas que interrumpen las macros?.
Un cordial saludo, y miles de gracias por tanta ayuda que nos proporcionas, a todos los que como yo, te leemos habitualmente.
MrDudas.

1 Respuesta

Respuesta
1
1.- Esto lo logras Protegiendo la hoja, con esto no pueden mover, ni copiar ni cambiar nada, solo lo que uno quiera, esta opción esta en Menú Herramientas | Proteger | Proteger Hoja con código sería
'Para proteger el libro activo
ActiveWorkbook.Protect
'Para desproteger el libro activo
ActiveWorkbook.Unprotect
2.- Claro, prueba las siguientes macros de ejemplo, te recomiendo el uso del segundo método
Option Explicit
'Esta macro Llena celdas con valores aleatorios SIN la
'posibilidad de cancelar la macro, esto es peligroso cuando
'se usan ciclos o procesos muy largos
Public Sub Llena_Celdas1()
Dim co1 As Integer, co2 As Integer, co3 As Single
Application.EnableCancelKey = xlDisabled
Randomize
For co1 = 1 To 10
For co2 = 1 To 5
co3 = Timer
Do While Timer < co3 + 0.25
Loop
Cells(co1, co2).Value = Format(co1 * co2 * Rnd, "#,##0.00000")
Next co2
Next co1
Application.EnableCancelKey = xlInterrupt
End Sub
'Esta macro Llena celdas con valores aleatorios CON la
'posibilidad de cancelar la macro
Public Sub Llena_Celdas2()
Dim co1 As Integer, co2 As Integer, co3 As Single
On Error GoTo err_Llena_Celdas2
Application.EnableCancelKey = xlErrorHandler
Application.StatusBar = "Para cancelar presiona ESC"
Randomize
For co1 = 1 To 10
For co2 = 1 To 5
co3 = Timer
Do While Timer < co3 + 0.25
Loop
Cells(co1, co2).Value = Format(co1 * co2 * Rnd, "#,##0.00000")
Next co2
Next co1
Application.StatusBar = False
Application.EnableCancelKey = xlInterrupt
Exit Sub
err_Llena_Celdas2:
Select Case Err.Number
Case 18
MsgBox "Cancelaste la macro", vbInformation
Case Else
MsgBox "Ocurrio el error: " & Err.Number & " " & Err.Description
End Select
Application.StatusBar = False
End Sub
Saludos y es bueno saber que hay quien lea las respuestas habitualmente, conmigo ya somos dos...
Respecto al punto 1, lo que quiero, es que esas celdas en las que permito que el usuario entre datos (con el libro y hojas protegidos), simplemente pueda entrar o borrar datos, pero nunca moverlos entre esas mismas celdas desprotegidas. Es decir, supongamos un libro y hojas protegidas. En la Hoja1, permito que el usuario entre datos solo en dos celdas: en A1 y en A2. Lo que pretendo es que el usuario no pueda hacer esto: que se coloque en A1, pulse Ctrl+X, se vaya a A2 y pulse Ctrl+V. Es decir, no permitir el traslado de celdas desprotegidas. El motivo es que los datos de esas celdas A1 y A2 que contienen datos que se utilizan en otras hojas, y so se trasladan, esas hojas que contienen las fórmulas, dan referencias no válidas o errores.
Quizás sea imposible solucionar eso...
Sopon que A1 = 100 y A2 = 200
Evitar el mover o copiar con teclado o mouse "tal vez" se podría, pero ¿como evitas que el usuario se coloque en A2 y ponga 100 directamente, lo que te recomiendo es VALIDAR lo que el usuario introduzca en esa celda, es decir, limitarlo solo a los valores que Tu quieras, ahí tienes el menú Datos | Validación o con código, tienes el evento Change del objeto Worksheet...

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas