jueves, 26 de julio de 2012

Ocultar una hoja e impedir que se puedan añadir nuevas hojas

Siguiendo con el ejercicio de la última entrada, vamos a usar el libro SE218-IMC.xlsx para ocultar la "Hoja2" y que nadie la pueda mostrar. También impediremos que se puedan añadir nuevas hojas al libro y algunas cosas más.

Hacemos clic en la pestaña de la "Hoja2" con el botón derecho y, en el menú emergente, elegimos Ocultar. La hoja ha desaparecido. Si quisiéramos mostrarla haríamos clic con el botón derecho en la pestaña de cualquier hoja visible y elegiríamos Mostrar, pero no vamos a hacerlo.

Accedemos a Revisar + Proteger libro para mostrar el cuadro de diálogo Proteger estructura y ventanas.

Si marcamos Estructura, Excel impedirá que los usuarios:
  • Vean las hojas ocultas.
  • Muevan, eliminen, oculten o cambien el nombre de las hojas visibles.
  • Inserten nuevas hojas.
  • Copien las hojas en otro libro.
Si marcamos Ventanas, Excel impedirá que los usuarios:
  • Cambien el tamaño y la posición de las ventanas cuando se abra el libro.
  • Muevan, cambien de tamaño o cierren las ventanas.
Marcamos las dos opciones, ponemos una contraseña y pulsamos Aceptar. Excel pide confirmación.

La protección está activada. Veamos si hemos conseguido nuestro propósito.

Para mostrar las hojas ocultas hacemos clic con el botón derecho en la pestaña de la "Hoja1" y elegimos Mostrar..., pero es imposible. La opción está desactivada.

No podemos cambiar el nombre "Hoja1" por otro más adecuado; esta opción tampoco está disponible. En realidad, sólo podemos acceder al editor VBA, desproteger la hoja si conocemos la contraseña o seleccionar todas las hojas (si hay más de una visible). El resto de las opciones, como insertar una nueva hoja, eliminarla, moverla a otra posición o a otro libro, cambiar el color de la etiqueta u ocultarla, están desactivadas. Tampoco se puede minimizar, maximizar o cerrar la ventana.

Como en otras ocasiones que hemos puesto una contraseña de protección, nos preguntamos si podemos desactivarla. Y, también como en los otros casos, la respuesta es afirmativa.

Si conocemos la contraseña iremos a Revisar + Proteger libro. Excel nos pedirá la contraseña, la escribimos y aceptamos.

Si no conocemos la contraseña tendremos que recurrir a una macro parecida a la usada para desproteger hojas. Es la siguiente:

Para insertarla, primero, la descargamos desde aquí, luego, entramos en VBA pulsando Alt + F11, accedemos a Archivo + Importar archivo y buscamos el fichero ContraseñaLibro.bas que acabamos de descargar y descomprimir. Finalmente, salimos del editor de VBA pulsando Alt + Q.

Lanzamos la macro con Alt + F8 (Programador + Macros o Vista + Macros + Ver macros). Elegimos BuscarContraseñaLibro y pulsamos Ejecutar. Excel ejecutará la macro y mostrará el mensaje siguiente:

El libro ha quedado desprotegido. Si hacemos clic con el botón derecho en la pestaña de la "Hoja1" obtendremos la siguiente imagen:

Todas las opciones están disponibles. Podemos mostrar la "Hoja2", maximizar, minimizar o cerrar la ventana, cambiar el nombre de cualquier hoja, poner color a la etiqueta...

Como ya no necesitamos la macro, la eliminaremos entrando de nuevo en VBA (Alt + F11), haciendo clic con el botón derecho en Módulo1, seleccionando Quitar Módulo1 y pulsando el botón No cuando nos pregunte si lo deseamos exportar. Terminaremos con Alt + F8 para salir de VBA.

Cambiando la extensión del fichero por .ZIP también se puede desproteger el libro pero, en este caso, actuando de un modo ligeramente diferente con respecto al método descrito en el artículo Otra forma de desproteger una hoja.
  • Sustituimos la extensión del fichero SE218-IMC.xlsx por SE218-IMC.ZIP
  • Descomprimimos SE218-IMC.ZIP con WinZip.
  • Entramos en la carpeta "xl" y abrimos con el Bloc de notas el fichero workbook.xml.
  • Buscamos la primera aparición de la palabra password, seleccionamos y borramos el bloque siguiente: <workbookProtection workbookPassword="DBC9" lockStructure="1" lockWindows="1"/>
  • Guardamos el fichero con Archivo + Guardar y cerramos el Bloc de notas.
  • Volvemos a comprimir todos los ficheros obteniendo una nueva versión de SE218-IMC.ZIP
  • Sustituimos la extensión del fichero SE218-IMC.ZIP por SE218-IMC.xlsx.
  • Abrimos el libro y vamos a Revisar + Proteger libro. De este modo, el libro queda totalmente desprotegido.

¿Existe alguna forma de ocultar una hoja y que nadie pueda volver a mostrarla? Probemos este método (vamos a ocultar la "Hoja2" que previamente habremos mostrado).
  • Con el libro desprotegido accedemos a VBA pulsando Alt + F11.
  • Insertamos una macro sin contenido eligiendo Insertar + Módulo. La macro puede ser la siguiente (este paso no hay que darlo en Excel 2003):
          Private Sub nada()
          End Sub
  • En el Explorador de proyectos hacemos clic en Hoja2 (Hoja2).
  • En la Ventana de Propiedades elegimos 2 - xlSheetVeryHidden en la propiedad Visible.
  • Accedemos a Herramientas + Propiedades de VBAProject y, en la pestaña Protección, marcamos Bloquear proyecto para visualización, ponemos una contraseña, la repetimos en la fila siguiente y pulsamos Aceptar.
  • Salimos de VBA pulsando Alt + Q. La "Hoja2" habrá desaparecido.
  • Si estamos en Excel 2007 o 2010, guardamos el libro con el nombre SE218-IMC.xlsm (¡ojo! hay que cambiar la extensión). En Excel 2003 se guarda con el nombre original.
  • Cerramos Excel y volvemos a abrir el libro para comprobar que no se puede acceder a la "Hoja2".



—¿La protección es realmente segura?
—No, también en este caso la protección es fácil de eliminar. Se hace así:
  • Sustituimos la extensión del fichero SE218-IMC.xlsm por SE218-IMC.ZIP
  • Descomprimimos SE218-IMC.ZIP con WinZip.
  • Entramos en la carpeta "xl" y abrimos con el Bloc de notas el fichero workbook.xml.
  • Buscamos el bloque <sheet name="Hoja2" sheetId="2" state="veryHidden" r:id="rId2"/>, eliminamos state="veryHidden" y lo dejamos así: <sheet name="Hoja2" sheetId="2" r:id="rId2"/>
  • Guardamos el fichero con Archivo + Guardar y cerramos el Bloc de notas.
  • Volvemos a comprimir todos los ficheros obteniendo una nueva versión de SE218-IMC.ZIP
  • Sustituimos la extensión del fichero SE218-IMC.ZIP por SE218-IMC.xlsm.
  • Abrimos el libro y comprobamos que la "Hoja2" ha aparecido de nuevo.


martes, 24 de julio de 2012

Proteger distintos rangos de una hoja con contraseñas diferentes

Hemos visto en una entrada antigua cómo proteger una hoja con contraseña y, también, cómo desprotegerla por tres métodos: usando una macro incorporada a la misma hoja, grabando la macro en otro libro abierto desde el libro protegido y, finalmente, haciendo uso del sistema de archivos Open XML.

Pues bien, además de la protección explicada, es posible proteger diversas zonas de una misma hoja con diferentes contraseñas. De este modo, si en un proyecto intervienen varias personas, podremos dividir la hoja en zonas protegidas con contraseñas diferentes, y suministrando a cada técnico la contraseña de una zona conseguiremos que pueda modificar únicamente esa zona pero no las demás.

Ilustraremos el caso con el libro SE218-IMC.xlsx que tiene dos hojas. Usaremos la "Hoja1" en este ejercicio y dejaremos la "Hoja2" para otro tipo de protección que se explicará en el próximo artículo.

Las personas que van a trabajar en esta hoja son Luis, Miren, Juan e Iker. Cada uno podrá escribir únicamente en las celdas de las filas 3 a 11 de la columna que lleva su nombre. Así, por ejemplo, Luis escribirá en el rango C3:C11, Miren lo hará en D3:D11, etc.

Las celdas del rango C12:F12 tienen sendas fórmulas para calcular el Índice de Masa Corporal de un individuo (en la "Hoja2" se explica qué es el Índice de Masa Corporal).

Seleccionamos toda la hoja con el botón derecho haciendo clic en el cuadro que hay encima de la fila 1 y a la izquierda de la columna A. En el menú emergente seleccionamos Formato de celdas. En la ficha Proteger, marcamos los cuadros de verificación Bloqueda y Oculta. Terminamos pulsando Aceptar.

Accedemos a Revisar + Permitir que los usuarios modifiquen rangos. Excel mostrará el cuadro de diálogo correspondiente:

Pulsamos el botón Nuevo. Vamos a poner una protección en el rango C3:C11 para que únicamente pueda usarlo Luis. La contraseña será su propio nombre. Por tanto, dejaremos el cuadro de diálogo como se muestra a continuación y pulsaremos Aceptar. Excel pide confirmación de la contraseña.

Hemos vuelto al la ventana Permitir que los usuarios modifiquen rangos. Volvemos a pulsar Nuevo para introducir los valores de Miren:

Repitiendo los mismos pasos con Juan e Iker obtendremos este resultado:

Ahora, pulsamos el botón Proteger hoja, marcamos las opciones que deseemos y ponemos la contraseña que queramos y que no tienen necesidad de conocer ninguno de las cuatro personas a las que vamos a darles los permisos de acceso a la hoja. De nuevo, Excel nos pide confirmación de la contraseña.

Guardamos el libro y salimos de Excel. Cuando una persona, por ejemplo Juan, quiere hacer una modificación, abrirá el libro e intentará escribir en su zona (E3:E11). En ese momento, Excel le pedirá la contraseña para desbloquear el rango:

Juan escribirá la contraseña que previamente le habremos comunicado y podrá continuar con su trabajo. Si intenta modificar una zona reservada a otro técnico no podrá hacerlo porque desconocerá la contraseña.

Cuando Juan termine su trabajo deberá guardar los cambios y cerrar el libro, ya que de no hacerlo podrá venir otro operario y entrar en su zona porque la contraseña de desbloqueo ya ha sido introducida.

¿Se puede desproteger esta hoja? Sí, se puede. Cualquiera de los tres métodos descritos en el primer párrafo es válido.

En caso de emplear el método del cambio de extensión por .ZIP, se deberá buscar una expresión más larga. Lo haremos de esta manera:
  • Sustituimos la extensión del fichero SE218-IMC.xlsx por SE218-IMC.ZIP
  • Descomprimimos SE218-IMC.ZIP con WinZip.
  • Entramos en la carpeta "xl\worksheets" y abrimos con el Bloc de notas el fichero sheet1.xml.
  • Buscamos la primera aparición de la palabra password, seleccionamos y borramos el bloque siguiente:

  • Guardamos el fichero con Archivo + Guardar y cerramos el Bloc de notas.
  • Volvemos a comprimir todos los ficheros obteniendo una nueva versión de SE218-IMC.ZIP
  • Sustituimos la extensión del fichero SE218-IMC.ZIP por SE218-IMC.xlsx. La hoja ha quedado desprotegida.




viernes, 20 de julio de 2012

La función TEXTO

La función TEXTO transforma un número en texto y permite asignar un formato de salida. La sintaxis es:

TEXTO(valor;formato)
  • valor: número, fórmula que devuelve un número o referencia a una celda que contiene un valor numérico.
  • formato: formato numérico, de fecha o de hora con cadena de texto entre comillas.
El argumento valor tiene que ser un número. Si recordamos que las fechas y las horas se almacenan como números, se comprende que puedan ser datos válidos como argumentos para la función TEXTO.

Pongamos unos cuantos ejemplos para ver cómo funciona TEXTO con números.

En A1:
2150,35

En A3:
=TEXTO(A1;"#.###,0")    [Resultado: 2.150,4]

En A4:
="Precio: "&TEXTO(A1;"#.###,00 €")    [Resultado: Precio: 2.150,35 €]

Ahora, otros ejemplos con fechas.

En C1:
20/07/2012

En C3:
=TEXTO(C1;"(dddd) dd/mmm/aaaa")    [Resultado: (viernes) 20/jul/2012]

En C4:
="La fecha es: "&TEXTO(C1;"dd")&" de "&TEXTO(C1;"mmmm")&" de "&TEXTO(C1;"aaaa")    [Resultado: La fecha es: 20 de julio de 2012]

Con horas:

En E1:
16:02:07

En E3:
=TEXTO(E1;"hh:mm am/pm")    [Resultado: 04:02 PM]

En E4:
="Comienzo a las "&TEXTO(E1;"hh:mm:ss am/pm")    [Resultado: Comienzo a las 04:02:07 PM]

Veamos otro ejemplo sencillo donde podemos usar la función TEXTO.

Restando las fechas de C3 y C2 hemos calculado, en C5, los días transcurridos entre ambas fechas. Para que en la celda B5 se muestre el texto donde aparecen los datos de C2 y C3, hay que poner la siguiente fórmula:

En B5:
="Días transcurridos entre el "&TEXTO(C2;"dddd, d/m/aaaa")&" y el "&TEXTO(C3;"dddd, d/m/aaaa")


lunes, 16 de julio de 2012

Ocultar elementos repetidos en una columna

¿Cuál de las dos tablas resulta más fácil de leer?

Si creemos que es más cómoda la tabla de la derecha intentaremos usarla preferentemente. Puede que no nos convenga borrar los datos repetidos de la columna B, en cuyo caso la solución será ocultarlos (no borrarlos) con un formato condicional.

Seleccionamos B3:B15 y accedemos a Inicio + Formato condicional + Nueva regla. Elegimos Utilice una fórmula que determine las celdas para aplicar formato y ponemos la fórmula siguiente: =B3=B2

Haciendo clic en el botón Formato accedemos al cuadro de diálogo Formato de celdas. En la pestaña Número elegimos la Categoría Personalizada y en Tipo ponemos tres veces el signo de punto y coma.

En la pestaña Bordes, eliminamos el borde superior.

Pulsamos dos veces Aceptar y el ejercicio estará terminado. Podremos comprobar que no se han borrado los datos poniéndonos en una celda cualquiera de la columna B (por ejemplo en B10) y observando que en la barra de fórmulas el dato permanece.

Nota: En Excel 2003 al usar el Formato condicional no se puede poner un formato Personalizado ya que no se muestra la pestaña Número en el cuadro de diálogo Formato de celdas.