Un estimado lector, Edgar, quien me realizó un par de consultas en la entrada sobre como enviar mails desde Excel (con Outlook), necesita que el archivo anexado al correo electrónico tenga un valor autoincremental en su nombre, mismo que va aumentando en cada envío.
El tema sería así: supongamos que anexo a los correos un libro llamado "EnvioDeDatos.xls". Nuestra macro se debería encargar de hacer esto:
EnvioDeDatos-1.xls
EnvioDeDatos-2.xls
EnvioDeDatos-3.xls
y así ir "subiendo" ese número automáticamente. Está claro que mi amigo necesita ir guardando un "historial" de envíos, lo cual puede llegar a ser de mucha utilidad ante futuros reclamos.
Si bien esta entrada será mas sobre programación que sobre Excel en sí..... no puedo dejar de responderla, y menos si tiene como origen una consulta realizada sobre las entradas del blog.
[+/-] Ver el resto / OcultarEmpecemos.
Vamos a "configurar" una hoja en nuestro libro para guardar todos los parámetros relativos a ese archivo, como una base de datos a la que acudiremos en busca de información. ¿Es necesario? Si, es muy necesario, ya que al crear un archivo y luego guardarlo debemos, por ejemplo, chequear que el mismo no exista previamente. Y la usaremos también para ir almacenando el número de archivo enviado, junto a otras cuestiones varias que harán mas versátil nuestro proyecto.
Llamaremos a esta hoja "file" (sin comillas), y en la misma colocaremos una serie de requisitos para completar, y así asegurarnos que todo funcione correctamente. Veamos:
Analicemos la imagen superior: en la columna A los campos y en B sus respectivos valores:
ruta: directorio en donde se guardarán los archivos
nombre de archivo: que nombre llevará el libro por defecto
extensión: la extensión del archivo (xls, xlsx, xla, xlsm, etc, etc)
separador: que caracter usaremos para separar el nombre del número (guión medio por lo general)
autoincremento comienza en: a partir de que número iremos sumando
Si en una celda aparte concateno "todo eso", veremos a que quiero llegar con la macro y así generar correctamente el nuevo libro:
en rojo observamos como sumamos 1 al 0 y armamos el path del nuevo archivo.
Mas arriba dije que esto era muy necesario, pero corrijo: es extremadamente necesario.
Al armar una tabla de estas características estoy previendo cambios a futuro, los cuales serán fáciles de mantener, sin la necesidad de "meternos" en VBA. ¿Que pasa si la extensión del archivo que siempre envío cambia de xls a xlsx? Solo modifico el valor en B3 y listo. ¿Y si en un futuro deseo almacenar todos los libros enviados en otro directorio y/o cambiar los nombres? Muy fácil: modifico B1 y/ B2, acomodándome a las nuevas exigencias. Otro ejemplo: los archivos deben comenzar a autonumerarse desde 100 ó 1000: mas que fácil, solo cambio el valor en B5. ¿Se comprende? Esa tabla me permite cambiar muchas cosas, sin tener que modificar el código en VBA... y sobre ella trabajaremos a continuación.
En primer lugar se me ocurre esta función:
VBA posee la función Dir(ruta) que nos sirve para chequear si un archivo existe o no dentro de un determinado directorio.
Si hacemos:
If Dir("C:\Mis Documentos\CualquierArchivo.txt) = "" then
End If
le estamos preguntando a VBA sobre la existencia o no de ese archivo. Si Dir() vuelve "vacía" ("") el archivo no está. Sobre la base de esto y que ya tenemos en RutaTemp el path completo en donde guardaremos nuestro libro, necesitamos incorporarla a nuestra función para evitar errores, ya que Windows no nos permitirá salvar dos archivos con igual nombre dentro de un mismo directorio.
Agregamos a Dir() junto a otras cosas, para cerrar la tarea:
Para llamarla desde otro procedimiento sería algo así:
Podrán haber observado que la función creada no requiere argumentos, ya que los extraigo a todos de la tabla creada al inicio del post. Eso evita que ante futuros cambios necesitemos modificar VBA, solo vamos a la hoja "file" (a la cual podemos ocultar para mayor comodidad y seguridad) y hacemos las modificaciones pertinentes.
Si desean eliminar el archivo una vez que lo envían, utilicen el siguiente código:
Kill(Archivo)
Y listo, se borrará.
Suerte, gracias por sus mensajes y cualquier duda la vemos.
Public Function AutoIncrementarArchivo() As String Dim RutaTemp As String 'seteo la función al vacío: AutoIncrementarArchivo = "" 'y armo la ruta con los datos que tengo en la hoja '"file". noten que B5 le sumo 1, para lograr el incremento With Sheets("file") RutaTemp = .Range("b1") & Range("b2") & Range("b4") _ & Range("b5") + 1 & "." & Range("b3") End With AutoIncrementarArchivo = RutaTemp End FunctionSi ahora llamo a esa función desde un MsgBox, obtengo el siguiente resultado:
perfecto, ya tenemos la ruta de acceso al archivo que estamos por guardar
VBA posee la función Dir(ruta) que nos sirve para chequear si un archivo existe o no dentro de un determinado directorio.
Si hacemos:
If Dir("C:\Mis Documentos\CualquierArchivo.txt) = "" then
End If
le estamos preguntando a VBA sobre la existencia o no de ese archivo. Si Dir() vuelve "vacía" ("") el archivo no está. Sobre la base de esto y que ya tenemos en RutaTemp el path completo en donde guardaremos nuestro libro, necesitamos incorporarla a nuestra función para evitar errores, ya que Windows no nos permitirá salvar dos archivos con igual nombre dentro de un mismo directorio.
Agregamos a Dir() junto a otras cosas, para cerrar la tarea:
Public Function AutoIncrementarArchivo() As String Dim RutaTemp As String 'seteo la función al vacío: AutoIncrementarArchivo = "" 'y armo la ruta con los datos que tengo en la hoja '"file" With Sheets("file") RutaTemp = .Range("b1") & Range("b2") & Range("b4") _ & Range("b5") + 1 & "." & Range("b3") End With 'si Dir() vuelve vacía (pasando como argumento la ruta que 'terminamos de generar), entonces estoy en condiciones de 'guardar el archivo: If Dir(RutaTemp) = "" Then 'primero incremento el valor de B5 With Sheets("file") .Range("b5") = Range("b5") + 1 End With 'guardo el libro para que quede bien a salvo el nuevo 'numero incrementado: ActiveWorkbook.Save Else 'caso contrario devuelvo un valor nulo, para avisarle 'al Sub "llamador" que el archivo ya existe: AutoIncrementarArchivo = "" Exit Function End If 'y retorno la ruta, para que pueda ser utilizada al enviar 'el archivo anexo a un correo AutoIncrementarArchivo = RutaTemp End FunctionBueno, ya tenemos la función... que funciona.
Para llamarla desde otro procedimiento sería algo así:
Sub EnviarMail() Dim Archivo As String 'obtengo la ruta invocando a la función creada: Archivo = AutoIncrementarArchivo 'chequeo que todo esté bien: If Archivo <> "" Then 'genero el nuevo libro y lo guardo: ActiveSheet.Copy ActiveWorkbook.SaveAs Archivo ActiveWorkbook.Close xlSaveChanges 'y lo envío por mail: With OutLook .Attachment = Archivo .Send End With Else MsgBox "El archivo " & Archivo & " ya existe", vbCritical End If End SubY todo anda bien. Ese "With OutLook" que hice es solo de ejemplo, allí deberán incorporar el código que realmente envía el mail.
Podrán haber observado que la función creada no requiere argumentos, ya que los extraigo a todos de la tabla creada al inicio del post. Eso evita que ante futuros cambios necesitemos modificar VBA, solo vamos a la hoja "file" (a la cual podemos ocultar para mayor comodidad y seguridad) y hacemos las modificaciones pertinentes.
Si desean eliminar el archivo una vez que lo envían, utilicen el siguiente código:
Kill(Archivo)
Y listo, se borrará.
Suerte, gracias por sus mensajes y cualquier duda la vemos.
- Obtener enlace
- X
- Correo electrónico
- Otras aplicaciones
Etiquetas
Macros
Etiquetas:
Macros
- Obtener enlace
- X
- Correo electrónico
- Otras aplicaciones
Excelente aportación amio Damian, tengo ya otras dudas en mente XD, excelente fin de semana!
ResponderEliminarGracias Edgar, igualmente, que la pases bien.
ResponderEliminarExcelente aporte Damian, como siempre oportuna y bien explicita con los ejemplos
ResponderEliminarMuy buena, Damian por tu interés para ayudar a los demas
ResponderEliminarGracias por tus palabras, estimado, es un placer.
ResponderEliminarBuenas Noches:
ResponderEliminarQuiero primero agradecer por tu gran ayuda.
Mi necesidad es guardar los datos de la evaluación de mis clientes, datos que gestiono en una plantilla de evaluación con el nombre compuesto por la fecha y el nombre del cliente
(ejemplo 16-7 Luis Eduardo Grisalez)
Espero tu amable respuesta
Cordialmente;
Luis eduardo
Hola Luis.
ResponderEliminarPara que los archivos no se "pisen" (guarden con el mismo nombre) lo correcto estimo que sería colocar la fecha/hora y nombre de tus clientes.
En la columna de la fecha deberías colocar la función =AHORA() para que el sistema coloque la fecha y hora actual, por ej: 23:50:35
El tema de los segundos no es un dato menor, ya que así evitarías guardar un archivo con el mismo nombre.
luego, si en la columna B tienes el nombre, la instrucción sería algo así:
Ruta= "C:\" & Cells(1,"A") & Cells(1,"B") & ".xls"
Si analizas la instrucción anterior, te quedaría: la unidad de disco, la fecha/hora (columna A), apellido (columna B) y la extensión XLS del archivo.
Cualquier duda me avisas. Espero que te sea de utilidad.