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 de fejoal
1
1
fejoal, Por falta de tiempo para responder como me gusta hacerlo suspendo...
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