Bueno, después de tantos meses ausente (hasta desconozco la nueva interfaz de Blogger al redactar estas líneas), vuelvo al ruedo con una entrada que tiene su lado "ético", controvertido si se quiere.
La cuestión en si pasa por mi conciencia: hay una voz muy baja que me dice "-esto no es correcto". Pero el problema con el que tuve que lidiar hace unos días hace acallar esa voz, ya casi un susurro imperceptible en estos momentos. Jajaja.
Veamos: ¿por qué querría desproteger una hoja de cálculos si su autor le puso una contraseña para que nadie acceda (por lo menos en su totalidad) al material que allí se encuentra? ¿Quiere ocultar complejas funciones o solo "cuidarlas", para que nadie por error las borre y de esta forma evitar que la planilla se corrompa y deje de trabajar como debe? De seguir con las preguntas, seguro debería habilitar un blog aparte solamente para ellas, por cuanto doy por terminado con el tema.
[+/-] Ver el resto / Ocultar
Les cuento.
Me envían un libro de Excel en el cual debo completar ciertos datos personales: nombres y apellido, fecha de nacimiento, domicilio, etc, etc, etc... de esas típicas que nos solicitan al realizar trámites varios. Bueno, resulta que el ancho de las celdas no es el correcto y algunos registros quedan "tapados", a lo que se le suma que el autor de esa planilla omitió dar formato de fecha a la celda que solicita el día de mi nacimiento... aparecen números con el símbolo $ delante.
Me envían un libro de Excel en el cual debo completar ciertos datos personales: nombres y apellido, fecha de nacimiento, domicilio, etc, etc, etc... de esas típicas que nos solicitan al realizar trámites varios. Bueno, resulta que el ancho de las celdas no es el correcto y algunos registros quedan "tapados", a lo que se le suma que el autor de esa planilla omitió dar formato de fecha a la celda que solicita el día de mi nacimiento... aparecen números con el símbolo $ delante.
Como me era muy trabajoso contactar a esta persona, indicarle que arregle esos errores y que me retorne la planilla... decidí crear una rutina que desbloquee la hoja de cálculos, aprovechando un conocido "bug" de Excel en ese sentido. Y dicha rutina es la que compartiré con Uds., quienes como usuarios finales tendrán acceso a cualquier planilla bloqueada.
No nos engañemos mucho tampoco: si posee sendas funciones que interrelacionan con otras hojas, libros, nombres de rangos, matriciales y algo mas, no podremos escudriñar demasiado. Y ojo con modificar algo, por que seguro "metemos la pata" y algo deja de andar como debería. ¿Se entiende?
El código.
Si empezamos, como siempre debemos, por la parte lógica, los pasos serían (mas o menos) estos:
1) generar una contraseña (aleatoria, ya que no tenemos idea que pusieron)
2) intentar desbloquear la hoja
3) si el punto 2 es exitoso, avisar
4) si el punto 2 fracasa, volver al 1 y repetir hasta que la planilla quede desbloqueada.
Mas de uno ya habrá imaginado que, como ya vimos en otras entradas del blog, pueden existir miles y miles y miles de millones de combinaciones posibles, lo que llevaría a nuestra macro hacia un rotundo fracaso. Si "la pegamos" rápido quizás en unos segundos todo esté listo, pero si esto no sucede también nuestro ordenador podrá quedarse por años trabajando sin encontrar el password correcto.
Y aquí es donde aprovecharemos esa "debilidad" inexplicable que poseen las contraseñas de las hojas de cálculo. Aunque es factible que al principio no se comprenda muy bien, demos un vistazo al código, mas abajo lo explico y todo se resuelve sin inconvenientes:
¿Empezamos? 11 bucles iteran del 65 al 66 el doceavo lo hace desde el 32 al 126. En el centro de toda esa "maraña" de bucles a cada variable numérica (vean que están definidas como Integer) la convierto en una letra con la función intrínseca de VBA Chr(). El Chr() de 65 y 66 es "A" y "B", respectivamente.
El bucle nro 12 hace lo mismo, pero con un rango de caracteres mas amplio: desde el espacio en blanco (32) hasta "~" (126), llamada esta última virgulilla (que no es otro que la "lomita" encima de nuestra muy castellana letra ñ".
A cada variable la convierto en un caracter, como ya dije, y las concateno en la String "Contraseña" y ejecuto el código necesario para desproteger la hoja: ActiveSheet.Unprotect, pasando como argumento la contraseña que termino de armar. Luego viene un If... si los contenidos de la planilla están desprotegidos ( = False), entonces aviso y termino con la rutina. Caso contrario, el bucle seguirá iterando hasta lograr su objetivo: desbloquear la hoja.
Les muestro una imagen. A esta planilla la protegí con la palabra "blog".... pero vean lo que me indica la macro al encontrar la contraseña:
Bueno, gracias a ese bug puedo subir la presente entrada. En caso de dar con la verdadera contraseña (blog) no lo habría escrito, ya que implicaría poner al descubierto una clave y eso es algo por demás de personal. Si bien podremos utilizar esta macro para desbloquear (cosa que no está bien en trabajos ajenos), nunca seremos conocedores de la clave ingresada por el usuario.
Sigamos.
Mejoré mi archivo original para que este código pueda aplicarse a cualquier libro. En una celda se debe ingresar el nombre del libro y en otra el nombre de la hoja que necesitamos desbloquear. El archivo en Excel debe estar abierto y, desde ya, la hoja existir dentro de el. Si alguna de estas condiciones falla, la macro no se ejecuta.
Una pequeña imagen para mejorar lo que estoy diciendo:
Esa imagen que ven es la del libro que contiene mi macro, recuerden que deben tener abierto el otro archivo, el que posee la hoja bloqueada. Ingresan bien los nombres y a esperar.... pueden ser unos pocos segundos o unos pocos minutos, pero al final la planilla se "quiebra" y queda desprotegida.
El nuevo código incluye referencias al libro y hoja que ingresamos:
Noten que programé una función que verifica la veracidad de los datos ingresados.
Es un placer estar de vuelta, fue mucho tiempo sin mi querido Excel y la posibilidad de estar en contacto con mis lectores. He tenido una seguidilla de problemas (sencillos y graves) que a la fecha se encuentran prácticamente solucionados, pero que desviaron fuertemente mi atención hacia el blog. Poseo, mas o menos, 150 mensajes sin contestar, los iré leyendo y levantando las entradas respectivas, cumpliendo así con la tarea que asumí. Solo les pido un poco de paciencia y gracias a todos, por que el blog está cerca de las 200.000 visitas. Todo un lujo.
Algo mas: usen esta macro para modificar sus proyectos (mas de una vez olvidé mis propias contraseñas) y eviten abrir el trabajo de otros, salvo que necesiten cambiar algo para trabajar mejor. Por que como les comentara mas arriba, no se logra mucho "husmeando" en una maraña de funciones, lo mas probable es que arruinemos algo y el libro pierda su funcionalidad.
Un abrazo.
1) generar una contraseña (aleatoria, ya que no tenemos idea que pusieron)
2) intentar desbloquear la hoja
3) si el punto 2 es exitoso, avisar
4) si el punto 2 fracasa, volver al 1 y repetir hasta que la planilla quede desbloqueada.
Mas de uno ya habrá imaginado que, como ya vimos en otras entradas del blog, pueden existir miles y miles y miles de millones de combinaciones posibles, lo que llevaría a nuestra macro hacia un rotundo fracaso. Si "la pegamos" rápido quizás en unos segundos todo esté listo, pero si esto no sucede también nuestro ordenador podrá quedarse por años trabajando sin encontrar el password correcto.
Y aquí es donde aprovecharemos esa "debilidad" inexplicable que poseen las contraseñas de las hojas de cálculo. Aunque es factible que al principio no se comprenda muy bien, demos un vistazo al código, mas abajo lo explico y todo se resuelve sin inconvenientes:
Sub DesbloquearHoja() Dim a As Integer, b As Integer, c As Integer Dim d As Integer, e As Integer, f As Integer Dim a1 As Integer, a2 As Integer, a3 As Integer Dim a4 As Integer, a5 As Integer, a6 As Integer Dim Contraseña As String On Error Resume Next 'las variables se van incrementando en cada iteración. en el 'centro de los bucles vemos como Chr() convierte cada número 'en una letra (código ascii), los concatena, para luego 'intentar romper la contraseña con esa cadena de texto 'que armamos: For a = 65 To 66: For b = 65 To 66: For c = 65 To 66 For d = 65 To 66: For e = 65 To 66: For a1 = 65 To 66 For a2 = 65 To 66: For a3 = 65 To 66: For a4 = 65 To 66 For a5 = 65 To 66: For a6 = 65 To 66: For f = 32 To 126 Contraseña = Chr(a) & Chr(b) & Chr(c) & Chr(d) & Chr(e) & Chr(a1) _ & Chr(a2) & Chr(a3) & Chr(a4) & Chr(a5) & Chr(a6) & Chr(f) ActiveSheet.Unprotect Contraseña If ActiveSheet.ProtectContents = False Then MsgBox "La contraseña es:" & vbCrLf & Contraseña End End If Next: Next: Next: Next: Next: Next Next: Next: Next: Next: Next: Next End SubSi, es una estructura de bucles For...Next un poco "rara", pero muy utilizada en estos casos, en donde anido un total de 12 bucles. De esta forma aparece todo mas ordenado y el código no se desplaza tanto hacia la derecha, permitiendo observarlo todo de un solo pantallazo.
¿Empezamos? 11 bucles iteran del 65 al 66 el doceavo lo hace desde el 32 al 126. En el centro de toda esa "maraña" de bucles a cada variable numérica (vean que están definidas como Integer) la convierto en una letra con la función intrínseca de VBA Chr(). El Chr() de 65 y 66 es "A" y "B", respectivamente.
El bucle nro 12 hace lo mismo, pero con un rango de caracteres mas amplio: desde el espacio en blanco (32) hasta "~" (126), llamada esta última virgulilla (que no es otro que la "lomita" encima de nuestra muy castellana letra ñ".
A cada variable la convierto en un caracter, como ya dije, y las concateno en la String "Contraseña" y ejecuto el código necesario para desproteger la hoja: ActiveSheet.Unprotect, pasando como argumento la contraseña que termino de armar. Luego viene un If... si los contenidos de la planilla están desprotegidos ( = False), entonces aviso y termino con la rutina. Caso contrario, el bucle seguirá iterando hasta lograr su objetivo: desbloquear la hoja.
Les muestro una imagen. A esta planilla la protegí con la palabra "blog".... pero vean lo que me indica la macro al encontrar la contraseña:
ahahah. Desprotegió la hoja con AAAAAAAAABBn. no con "blog"
Bueno, gracias a ese bug puedo subir la presente entrada. En caso de dar con la verdadera contraseña (blog) no lo habría escrito, ya que implicaría poner al descubierto una clave y eso es algo por demás de personal. Si bien podremos utilizar esta macro para desbloquear (cosa que no está bien en trabajos ajenos), nunca seremos conocedores de la clave ingresada por el usuario.
Sigamos.
Mejoré mi archivo original para que este código pueda aplicarse a cualquier libro. En una celda se debe ingresar el nombre del libro y en otra el nombre de la hoja que necesitamos desbloquear. El archivo en Excel debe estar abierto y, desde ya, la hoja existir dentro de el. Si alguna de estas condiciones falla, la macro no se ejecuta.
Una pequeña imagen para mejorar lo que estoy diciendo:
sencillo y sin altisonancias.
Esa imagen que ven es la del libro que contiene mi macro, recuerden que deben tener abierto el otro archivo, el que posee la hoja bloqueada. Ingresan bien los nombres y a esperar.... pueden ser unos pocos segundos o unos pocos minutos, pero al final la planilla se "quiebra" y queda desprotegida.
El nuevo código incluye referencias al libro y hoja que ingresamos:
Sub DesbloquearHojaDeOtroLibro() 'variables de uso local: Dim a As Integer, b As Integer, c As Integer Dim d As Integer, e As Integer, f As Integer Dim a1 As Integer, a2 As Integer, a3 As Integer Dim a4 As Integer, a5 As Integer, a6 As Integer Dim Contraseña As String Dim Libro, Hoja, LibroActual As String 'almaceno el nombre del libro actual, para luego poder 'volver al mismo libro donde tengo las macros: LibroActual = ActiveWorkbook.Name 'hago lo propio con los datos que ingresó el usuario: Libro = Range("libro").Value Hoja = Range("hoja").Value 'guardo el resultado de la función Verificar() en la 'variable res. res = Verificar(Libro, Hoja) 'si la función me devolvió algo... aviso del problema 'vuelvo al archivo original y termino con el programa If res <> "" Then Windows(LibroActual).Activate MsgBox res, vbCritical, "Error" End End If On Error Resume Next For a = 65 To 66: For b = 65 To 66: For c = 65 To 66 For d = 65 To 66: For e = 65 To 66: For a1 = 65 To 66 For a2 = 65 To 66: For a3 = 65 To 66: For a4 = 65 To 66 For a5 = 65 To 66: For a6 = 65 To 66: For f = 32 To 126 Contraseña = Chr(a) & Chr(b) & Chr(c) & Chr(d) & Chr(e) & Chr(a1) _ & Chr(a2) & Chr(a3) & Chr(a4) & Chr(a5) & Chr(a6) & Chr(f) ActiveSheet.Unprotect Contraseña If ActiveSheet.ProtectContents = False Then MsgBox "La contraseña es:" & vbCr & Contraseña End End If Next: Next: Next: Next: Next: Next Next: Next: Next: Next: Next: Next End Sub Function Verificar(L, H) As String 'inicializo a la función con un valor nulo ("") Verificar = "" On Error Resume Next 'voy al libro que ingresó el usuario: Windows(L).Activate If Err.Number <> 0 Then 'si el libro no existe, aviso y me voy Verificar = "El libro: " & L & " no se encuentra abierto" Exit Function End If 'si pasamos el If de arriba, nos queda aún seleccionar la hoja 'que nos indicó el usuario. si no existe, aviso y me voy Sheets(H).Select If Err.Number <> 0 Then Verificar = "La hoja: " & H & " no existe en el libro: " & L Exit Function End If End Function
Noten que programé una función que verifica la veracidad de los datos ingresados.
Es un placer estar de vuelta, fue mucho tiempo sin mi querido Excel y la posibilidad de estar en contacto con mis lectores. He tenido una seguidilla de problemas (sencillos y graves) que a la fecha se encuentran prácticamente solucionados, pero que desviaron fuertemente mi atención hacia el blog. Poseo, mas o menos, 150 mensajes sin contestar, los iré leyendo y levantando las entradas respectivas, cumpliendo así con la tarea que asumí. Solo les pido un poco de paciencia y gracias a todos, por que el blog está cerca de las 200.000 visitas. Todo un lujo.
Algo mas: usen esta macro para modificar sus proyectos (mas de una vez olvidé mis propias contraseñas) y eviten abrir el trabajo de otros, salvo que necesiten cambiar algo para trabajar mejor. Por que como les comentara mas arriba, no se logra mucho "husmeando" en una maraña de funciones, lo mas probable es que arruinemos algo y el libro pierda su funcionalidad.
Un abrazo.
- Obtener enlace
- X
- Correo electrónico
- Otras aplicaciones
Etiquetas
Macros
Etiquetas:
Macros
- Obtener enlace
- X
- Correo electrónico
- Otras aplicaciones
Welcome back my friend !!! Te entiendo totalmente lo de la falta de tiempo... Yo también trabajo, estudio, tengo una familia y -aca viene la diferencia entre vos y yo- tuve que abandonar el blog porque como vos decís, la tierra debería girar más lento... Es por eso que valoro enormemente este gran trabajo (por cierto, ad-honorem) que estás haciendo para la comunidad (léase "mundo"). Admiro tu capacidad para hacer todo en el mismo día...
ResponderEliminarPor cierto, con respecto a la entrada, no conocía este bug de Excel. Sorprendente. Cuántas veces necesité esto por haber perdido mi propia contraseña !!!!!!!
Muchas gracias por existir y compartir todo cuanto sabés con nosotros, tus fieles seguidores. Un abrazo gigante desde Tandil.
Hola AMIGO!!! Que alegría tener noticias tuyas después de tanto tiempo. Espero poder retomar nuevamente con esto del blog, aunque estimo que a un ritmo mas "bajo" (quizás algún que otro fin de semana), por que en verdad se hace casi imposible llevar todas las obligaciones. Lamentablemente tengo atrasadas 150 consultas, estimo que de a poco las iré contestando.
ResponderEliminarJusto lo que mencionas es el espíritu de esta entrada: cuantas veces nos olvidamos nuestra propia contraseña y la hoja queda inutilizada. Yo perdí la cuenta, demasiadas.
Un abrazo enorme y gracias x escribir.
Tengo una duda de como jalar datos de un programa de oracle a excel y que se este actualizando mediante un boton al darle click se actualizen los datos.
ResponderEliminarsolo que este programa tiene pasword y claro que lo tengo es solo que quiero ahorrar tiempo de estar bajando reportes diariamente y por eso me gustaria saber como relaciono excel con oracle........espero me puedas ayudar
mi correo es rayer187@gmail.com mi nombre Luis Ferrer espero me puedan ayudar gracias...
Luis: te vas al menú "datos/obtener datos externos/nueva consulta de base de datos".
ResponderEliminarEn el formulario seleccionas "". Presionas "aceptar".
Y ahora debes completar los campos que te solicita la consulta:
1) nombre (cualquiera)
2) se habilitará la lista desplegable, de la cual deberás elegir "Microsoft ODBC for Oracle"
3) conectar
4) seleccionar la tabla o consulta.
con eso debería andar todo bien, llevando a excel los registros que se encuentren desde la tabla seleccionada. Ojo: debes tener Oracle en la Pc, ya que Excel necesita tomar sus controladores para funcionar correctamente.