Seleccionar celdas

Hola de nuevo Fernando,
Le he estado dando vueltas pero no consigo saber como se hace. A ver si me puedes echar una mano...
Necesitaría que en una hoja de excel solo me dejara seleccionar las celdas que yo deseara. Las tengo todas protegidas y no me deja modificar el contenido (lógicamente) pero si que me deja seleccionarlas. ¿Abría alguna manera de hacer una macro que solo se pudiera seleccionar una o dos celdas nada más?
Gracias

1 respuesta

Respuesta
1
El método sugerido no permite definir rangos discontinuos.
(Tenías que arruinar mi respuesta! ;)
Entonces, estuve pensando una alternativa para el caso de que las celdas permitidas sean dos.
En tal caso habrá un macro basado en eventos que se ocupará de restringir las celdas disponibles.
Para que funcione, activa el editor de Visual Basic (presiona Alt+F11) y busca
La hoja donde quieres que esto ocurra (donde harás la carga de datos). Da doble click sobre ella. (Otra forma de llegar a este punto es hacer click derecho sobre la solapa de esta hoja y elegir la opción "Ver Código)
Copia el código siguiente y pégalo en el panel desplegado a la derecha de su Editor de Visual Basic:
'Define aquí las celdas permitidas:
Const Celda1 = "A2"
Const Celda2 = "E6"
'-------------- gracias
Public CeldaAct
Private Sub Worksheet_Activate()
Range(Celda1).Select
CeldaAct = ActiveCell.Address(False, False)
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
ada = Range(CeldaAct).Address
'If Target.Address <> Celda1.Address Then
If CeldaAct <> Celda1 Then
Application.EnableEvents = False
Range(Celda1).Select
CeldaAct = ActiveCell.Address(False, False)
Application.EnableEvents = True
Else
Application.EnableEvents = False
Range(Celda2).Select
CeldaAct = ActiveCell.Address(False, False)
Application.EnableEvents = True
End If
End Sub
Al comienzo de la macro encontrarás dos variables para indicar cuales son las dos celdas accesibles. Coloca allí las que desees para ESA hoja.
Cierra el Editor de Visual Basic y graba el archivo.
De esta manera cualquier tecla de movimiento que toques (flechas, avance de página, tab) te llevará a la otra celda.
Espero que esto te satisfaga (y no te gastes en preguntar, cómo aplicarlo en más de dos celdas, pues esta solución no servirá)
Otro abrazo!
Fernando
Es justo lo que quería pero, ¿cómo sería si quisiera que solamente se pudieran seleccionar las celdas a2 y e6?
En realidad tengo 6 celdas a activar. Supongo que es mucho más dificil que aplicar el comando IF...ELSE
Si llegaras a saber como hacerlo te agradecería que me lo comunicaras.
Muchas gracias por el interés mostrado.
Un abrazo
Efectivamente, VBA cuenta con una propiedad que te ayudará a esto: ScrollArea.
Usa por ejemplo estos dos macros:
Sub PermiteAlg()
ActiveSheet.ScrollArea = "A1:A2"
End Sub
Sub PermiteTot()
ActiveSheet.ScrollArea = ""
End Sub
El primero restringe las celdas accesibles a A1 y A2
mientra que el segundo libera la restricción permitinedo el acceso normal a cualquier celda del la hoja.
Espero que te sirva.
Un abrazo!
Fernando
David:
¡Cuánto tiempo se ahorraría si los usuarios pensaran, primero, que es lo que quieren exactamente!
Como notarás cada una de las tres soluciones difieren entre sí. Por lo tanto, cada una de ellas demandó un tiempo de programación distinto.
Como tampoco dijiste cuáles eran las celdas que si están permitidas, la siguiente solución permitirá operar con cualquier cantidad no nula de celdas.
Para ello, permitirá acceder a aquellas celdas desbloqueadas (aunque no uses la protección de hoja) dentro de un rango amplio que le definirás al inicio de la macro.
Te recomiendo que quites la marca de bloqueadas a las celdas que te interesen, ANTES de pegar el siguiente procedimiento en el panel de la hoja donde debe efectuarse este control:
'Define aquí el rango amplio que
'comprenda a las celdas habilitadas:
Const SupIzq = "B2"
Const InfDer = "F20"
'------------------ gracias
Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
FilA = Range(SupIzq).Row
FilZ = Range(InfDer).Row
ColA = Range(SupIzq).Column
ColZ = Range(InfDer).Column
'Controla que selección actual esté dentro del rango indicado
If Application.Intersect(Range(SupIzq, InfDer), ActiveCell) Is Nothing Then
Range(SupIzq).Select
End If
FilT = ActiveCell.Row
ColT = ActiveCell.Column
ColsChk = 0
'Busca celda permitida desde la actual en adelante
88:
If ActiveCell.Locked Then
Application.ScreenUpdating = False
Application.EnableEvents = False
For ActCol = ColT To ColZ
QueFila = IIf(ColsChk = 0, FilT, FilA)
For ActFil = QueFila To FilZ
ActiveCell.Offset(1).Select
If ActiveCell.Locked = False Then GoTo Final
Next ActFil
ColsChk = ColsChk + 1
ActiveCell.Offset(FilA - FilZ, 1).Select
Next ActCol
Else
GoTo Final
End If
'Busca celda permitida desde inicio de rango amplio
If ActiveCell.Locked Then
Range(SupIzq).Select
ColT = ActiveCell.Column
GoTo 88
End If
Final:
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
Recuerda cambiar las direcciones de las celdas que marcan el rango comprendido entre la primer celda superior izquierda y la última celda inferior derecha donde estarán las celdas permitidas (=desbloqueadas).
Al cerrar el editor de visual basic quedará activa esta restricción.
Ten en cuenta que el movimiento a la siguiente celda desprotegida lleva el sentido de arriba hacia abajo y luego de izquierda a derecha.
Cualquier desplazamiento fuera de ese rango te llevará a la primer celda desprotegida dentro de ese rango. Esto será así, aún si usas el mouse para seleccionar otra celda.
Pruébalo y dime si, finalmente, esto es lo que querías. (Ojalá que no hayas omitido otro "datito")
Un abrazo!
Fernando

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas