Bloqueo de celdas

Hola amigo!
Mi nombre es leonardi, Actualmente estoy diseñando una hoja electrónica en Excel 2002 pa realizar los pedidos de suministros de papelería en la empresa en que trabajo, la idea es tener un listado con tres columnas a saber: nombre del producto, código y la cantidad requerida con la cualidad de que el usuario no pueda modificar la lista de productos y sus códigos.
Como son muchos productos, desde luego no todas las dependencias solicitan todos lo productos, lo que se quiere es que al digitar la cantidades requeridas en la respectiva columna, pueda imprimir unicamente aquellos productos que estén diligenciados en dicha columna. Esto lo logre por medio de un filtro en la columna de cantidad requerida, pero cuando bloqueo la hoja de calculo, el autofiltro no despliega las funciones como por ejemplo "(Todas),(Las 10 más...)(Personalizar)(Vacías) (No Vacías)"
Esta hoja la diseñe en Excel 2002 y no tengo ningún problema ya que al proteger la hoja me arroja la opción de permitir que el usuario utilice autofiltros, pero cuando hice una copia para abrirlo en excel 97, 2000, no me funciona el autofiltro.
De antemano muchas gracias amigo"!!!!
1

1 respuesta

1
Respuesta de
Buenas, Leonardi
Digamos primero que VB es un programa similar pero distinto a Visual Basic For Applications (VBA) y a su vez este difiere entre las distintaas aplicaciones del paquete Office, aun cuando es posible que dialoguen naturalmente entre si. De allí que no reconozcas los comandos en la macro que te envié anteriormente.
De todos modos, como te había explicado, ella te permitirá mantener la protección de la hoja para que el usuario no pueda modificar las celdas bloqueadas y, al momento de imprimir, solo aparezcan las filas con datos ("como si" hubiera un filtro)
A continuación copio la macro con algunas mejoras y te explico qué hace en cada paso:
Sub OcultaLin()
'Oculta líneas según el siguiente criterio:
'============
CharKey = 0 ' cero. Implica que esto será el criterio para ocultar o no una fila
RangoCtrl = "A2:A14" 'el rango de celdas donde están las cantidades.
'Obviamente puedes reemplazarlo por el tuyo
'============
Application.EnableCancelKey = xlDisabled ' Evita que se detenga la macro antes de que vuelva a protegerse la página
'anula esta línea durante las pruebas y habilítala cuando publiques el archivo
ActiveSheet.Unprotect "TuClave" 'quita la protección de la hoja utilizando la clave "TuClave" supuesto que esta fuese la que usaste para proteger la hoja.
For Each Cell In Range(RangoCtrl) 'Inicia el ciclo de control en cada celda de la selección
If Cell.Value = CharKey Then 'compara el valor de la celda activa con el de la clave que le diste al inicio. O sea que sea cero.
Cell.EntireRow.Hidden = True 'Si cumple la condición oculta la linea
Else
Cell.EntireRow.Hidden = False 'Si no cumple -es distinto de cero- muestra la linea
End If
'ActiveCell.Offset(1).Select 'activa la celda inferior
Next Cell 'reinicia loop de control
ActiveSheet.Protect "TuClave" 'revisada y ocultadas las filas, vuelve a proteger la hoja.
Application.EnableCancelKey = xlInterrupt
End Sub
---
La solución de la tabla gemela es, lejos, más rudimentaria que el uso de la macro anterior.
La idea es tener una hoja con celdas vinculadas a la base original, para preservar aquella que -incluso- sería conveniente que esté oculta.
En esta nueva hoja no habría protección y, por lo tanto, podría usarse los autofiltros.
Pero considerando que sólo los necesitas para ocultar lineas, tendrías resuelto el problema con la macro que te acabo de explicar sin necesidad de agrandar tu archivo.
Espero haber sido -esta vez- suficientemente claro.
Buen fin de semana!
Fernando
Hola Fernando!
Con anterioridad he diseñado varias aplicaciones en VB access 2000 y he manejado diversos comandos pero no reconozco ninguno de los que me has enviado para programar macros bajo Excel.
Te pido que por favor me aclares con mayor detalle el realizar lo de la tabla gamela con vínculos a la original.
Así como lo planteas lo que te entiendo es que el usuario de la hoja gemela va a poder hacerle cambios al listado de productos y eso no es lo que se quiere ya que quien solicita el pedido del producto no puede digitar ni agregar productos a la lista ya establecida. Es decir que quien utiliza la hoja solamente puede hacer las siguientes operaciones en las correspondientes celdas habilitadas para cambios:
Digita la fecha
Digita la dependencia
Digita las cantidades de cada producto
Filtra las cantidades (No vacías)
E Imprime.
Otra cosa ¿Dónde puedo bajar un buen manual de programación en VB excel?
De antemano muhas gracias amigo.
Éxitos!
Buenas, Leonardi
La versión de MS Excel incluida en Office XP, como ya notaste, permite utilizar filtros en hojas protegidas.
Lamentablemente, el uso de autofiltros es incompatible con la protección de hojas en las versiones anteriores
Una solución será armar una tabla gemela a la que quieres filtrar (una con vínculos a la original) en una hoja no protegida y aplicar los autofiltros sobre esta.
Otra será crear una macro que:
- Desproteja la hoja
- Aplique el filtro
- Imprima
- Quite el Filtro
- Proteja la hoja
Pero para tu objetivo podrías prescindir de los filtros e intentar otro tipo de solución:
Hace algunos años atrás, cuando usaba el viejo y querido Lotus 123 tenía una fórmula que -sin necesidad de ocultar/mostrar- impedía que se imprima una fila en base a una condición que, usualmente, era si una celda tenía un valor cero.
Al migrar a MS Excel, perdí esa posibilidad y pese a las muchas consultas que planteé sobre el tema, todas las respuestas me informaban que eso no es posible en MS Excel.
Pero puede utilizarse una macro que se ocupe de ocultar las filas.
Y esta sería tu macro (inserta un módulo nuevo en el Editor de Visual Basic):
Sub OcultaLin()
'Oculta líneas según el siguiente criterio:
'============
CharKey = 0
ActiveSheet.Unprotect "TuClave"
Range("C2:C500").Select 'rango de celdas donde están las cantidades.
For each Cell in selection
If ActiveCell.Value = CharKey Then
ActiveCell.EntireRow.Hidden = True
Else
ActiveCell.EntireRow.Hidden = False
End If
ActiveCell.Offset(1).Select
Next cell
ActiveSheet.protect "TuClave"
End Sub
Así, recorre la columna A ocultando o mostrando filas según el valor, hasta que encuentra una celda vacía (Final de Rango).
También, puedes agregarle un comando de impresión para que:
- Oculte (con la macro OcultaLin)
- Imprima
- Muestre todas las celdas.
Esto último con una instrucción tan simple como esta:
Rows("2:814").EntireRow.Hidden = False
Esto debería resolver tu pregunta. Si así fuera, agradeceré un comentario y que la finalices.
Si no, pregúntame de nuevo.
Un abrazo!
Fernando
"Me lo explicaron y lo olvidé,
Lo leí y lo entendí,
lo hice y lo aprendí".
*====================================*
La presente respuesta ha demandado un tiempo de lectura,
análisis, elaboración y redacción. A cambio, simplemente,
pretendo que te tomes un minuto para FINALIZARLA, si
hubiera satisfecho -en alguna medida- tu requerimiento.
(Considera que la valoración que figura predeterminada
es 3/5. Tal vez quieras cambiarla...)
En caso contrario, puedes preguntarme nuevamente
aclarando qué entendí mal o qué faltó. Gracias...
*====================================*
Añade un comentario a esta respuesta
Añade tu respuesta
Haz clic para o
Escribe tu mensaje
¿No es la respuesta que estabas buscando? Puedes explorar otras preguntas del tema Microsoft Excel o hacer tu propia pregunta: