Mensualmente he de generar 50 infomes que corresponden a otras tantas personas. Cada uno de de los libros esta protegido con una contraseña. En el poceso de construcción de los archivos he de abrirlos 2 veces, convirtiendose en una tarea muy tediosa y fuente de errores al introducir las contraseñas manualmente.
¿Sería posible la creación de una macro que abriese los libros introduciendo las contraseñas?
salu2 y muchas gracias
Sí se puede.
para abrir un libro utilizarías WorkBooks.Open que tiene varios argumentos, como la ruta del archivo que quieres abrir, si quieres abrirlo como sólo lectura, y también puedes indicarle la contraseña, tanto la de apertura, que es el argumento Password, como la de escritura si es diferente, con el argumento WriteResPassword.
Lo que ocurre es que necesitarás tener una lista con los archivos y las contraseñas, y esto puede ser algo "inseguro", que no sé si puede llegar a ser un problema en tu caso. aunque puede que ya exista ese listado de contraseñas y sea el que utilizas para introducirlas a mano ¿no?
------
Ya sé Excel, pero necesito más
------
Ya sé Excel, pero necesito más.
Efectivamente, el listado de contraseñas está en papel y con él en la mano voy introduciendo, una a una, las contraseñas de apertura. Había pensado en proteger el libro de las contraseñas con contraseña, lo que creo es mas seguro que el sistema que ahora utilizo.
He de decir, en esto de las Macros estoy en fase iniciatica, por lo que me resulta dificil lo mas sencillo. No sé como vincular el libro de las contraseñas con la apertura de los libros a traves de la macro. Es decir, con la grabadora activada, abro el libro de las contraseñas y comienzo a abrir los libros protegidos, pero me pide la contraseña y ahí me paro. Se me ocurre introducir la clave, pero eso no funciona.
salu2 y muchas gracias
Before Elvis there was nothig
Before Elvis there was nothig
Si te parece, lo vemos con un ejemplo.
Vamos a preparar una macro en el libro de las contraseñas, para que vaya recorriendo la lista de nombres de archivos.
El proceso sería algo así como:
para cada archivo
abrir un archivo
ejecutar los pasos que necesites
cerrar el archivo
siguiente
Ahora se trataría de crear este bucle, y esto es algo que no hace el grabador de macros. Con el grabador de macros sí puedes grabar los pasos que quieres dar con el libro ya abierto, e incluso abrir y cerrar el archivo, aunque luego tendrías que retocar ese código grabado.
supongamos que tenemos nuestra lista de archivos y contraseñas de esta manera (recuerda que el nombre del archivo tiene que tener la ruta completa, así que o pones la ruta en la celda, o si todos están en la misma ubicación puedes emplear una celda para especificar la ruta y luego componer la cadena completa):
A mí me gusta poner nombres a los rangos para luego referirme a ellos más cómodamente, aunque esto tampoco es necesario. también me gusta convertirlo en una tabla por si más adelante se añaden nuevos elementos, pero esto también es optativo (aunque te ahorra algunos quebraderos de cabeza)
pues vamos a preparar el esqueleto del bucle, para ello recorreremos las celdas con la lista de los nombres (yo he llamado ListaNombres a la primera columna de esta tabla). ¿y cómo se hace este bucle? pues muy sencillo, empleando FOR EACH. Entra en el editor de visual basic y empezamos:
Sub AbrirTodosArchivosLista()
Const Lista = "ListaNombres" ' utilizo una constante para el nombre de la lista
Dim celda As Range ' esta es la variable contador para el bucle
For Each celda In Range(Lista).Cells
' este bucle recorre la lista de nombres
Next
End Sub
Ahora lo que tenemos que hacer es abrir el archivo para cada celda. Para ello utilizaremos Workbooks.Open, teniendo en cuenta que el nombre del archivo está en la celda, y la contraseña está en la celda que se encuentra a su derecha (para esto emplearemos Offset)
Luego damos los pasos que queramos con el archivo abierto, para este ejemplo mostramos un mensaje, aquí podrías poner tu macro grabada.
por último cerramos el libro que acabamos de abrir, con el argumento SaveChanges igual a True, para guardar los cambios.
Ten en cuenta que cuando abres un libro, éste se convierte en el libro activo; si con tu macro cambias el libro activo, tendrías que tener cuidado con esto.
Así que nuestra macro quedaría algo así:
Sub AbrirTodosArchivosLista()
Const Lista = "ListaNombres"
Dim celda As Range
For Each celda In Range(Lista).Cells
Workbooks.Open celda.Value, , , , celda.Offset(0, 1).Value
MsgBox "Ahora que está el libro abierto, hacemos lo que queramos"
'aquí irían tus instrucciones para cada libro abierto
ActiveWorkbook.Close True
Next
End Sub
Espero que te sirva de ayuda. Ya me dirás...
------
Ya sé Excel, pero necesito más
------
Ya sé Excel, pero necesito más.