Si tienes todos tus datos juntos (es un buen comienzo) que corresponden a diferentes personas ¿cómo harías para separarlos y enviar por email a cada una de esas personas su parte sin que nadie viese lo de los demás?
arodrigu, una asidua visitante de necesitomas.com planteó en el foro este tema que no es inmediato resolver, y me ha dado pie a preparar este envío.
La situación inicial
La situación actual es copiar y pegar a mano y enviar a mano por email el archivo. por pocas veces que haya que repetirlo, se convierte en algo repetitivo, aburrido, y lo peor, muy susceptible a que te equivoques o te olvides de algo. La solución típica para estos casos pasará por una macro.
pasos previos
Listado de personas
Obviamente, para automatizar el envío de emails necesitaremos tener las direcciones de correo de las personas que aparecen en el listado.
En un 99.9% de los casos no estaremos utilizando el email en nuestros datos sino el nombre de la persona o algún otro dato identificativo. necesitamos las direcciones de email.
Esto parece una tontería, pero más de una vez he tenido que explicar que el ordenador no se inventa nada, que si no le das los datos no los puede adivinar.
Si no tienes una lista de personas, mira este enlace para saber cómo crearla a partir de los datos existentes.
Validación
El segundo problema es que nuestros datos de nombres puede que no se hayan escrito igual que en el listado a no ser que hayamos tenido la precaución de establecer una regla de validación que nos permita únicamente introducir los nombres de personas definidos previamente.
aquí puedes ver cómo definir una validación mediante una lista, y aquí hay más cosas de validación.
Si aplicamos la validación después de tener los datos, podemos hacer que Excel nos marque aquellas celdas que no cumplen el criterio.
Manos a la obra
Filtro Avanzado
Queremos extraer parte de la información, la que corresponde a cada persona, y enviársela por email.
Podemos "extraer" estos datos de varias maneras, para este ejemplo utilizaré las opciones avanzadas del filtro de Excel.
El filtro avanzado nos permite copiar el resultado del filtro "a otro lugar" en nuestro caso a una hoja auxiliar que luego enviaremos al destinatario.
Así que en una hoja del libro sin datos emplearemos el filtro avanzado para copiar los datos correspondientes a una persona
(vamos a poner los criterios en esta misma hoja y así vemos a qué corresponden esos datos)
Estrategia
Vamos a pensar un poco qué pasos hay que dar, así será más fácil enfocar la macro que automatice el proceso
- establezco los criterios de filtrado
- filtro los datos
- copio la hoja con los datos filtrados a un nuevo libro
- envío este nuevo libro al destinatario
La macro
¿qué hará nuestra macro? Pues irá repitiendo todos estos pasos para cada una de las personas en la lista.
Es decir, que envolveremos todos estos pasos con un bucle que recorra la lista de personas.
Comentarios
Re: separar datos y enviar como archivos Excel independientes (1
¡Ya lo daba por perdido¡ Muchas Gracias, Pacomegia. Espero ansiosa la 2ª parte...
Re: separar datos y enviar como archivos Excel independientes (1
¿que tal vamos pacomegia? Estoy deseosa de saber como acaba....
mil gracias
arodrigu
Re: separar datos y enviar como archivos Excel independientes (1
Buenísimo post, Paco, como siempre de lujo. Espero con expectativa la segunda parte de este gran proceso :)
Re: separar datos y enviar como archivos Excel ...
Excelente, no se imagina el trabajo que me he ahorrado y la efectividad al aplicar esta macro. Tengo una pregunta. Como hago para adicionar un texto en cuerpo del mensaje. Te adjunto el archivo con la adaptación de la macro utilizada. Le agradezco inmensamente la ayuda.
Re: separar datos y enviar como archivos Excel ...
Con el método SendMail no puedes definir el cuerpo del mensaje.
tienes destinatario y asunto como argumentos de esta función, pero no tienes cuerpo del mensaje.
Puedes recurrir a crear un objeto "email" de Outlook y ahí definir todas las propiedades que necesites.
mira esta página sobre el envío de correos desde Excel
y esta otra para enviar los correos aunque no se tenga outlook instalado
Por cierto, echa también un vistazo a MultiMail, por si te da alguna idea.
------
Ya sé Excel, pero necesito más.
Re: separar datos y enviar como archivos Excel ...
¿No funciona en Excel el tema con los mensajes CDO?
En Access he comprobado que funciona.
Algo así como:
Sub EnviaCorreo()
Dim cdoMsg As New CDO.Message
Dim destinatario, title, txt1, txt2, txt3, txt4, txt5, txt6, txt7 As String
If MsgBox("¿Desea enviar correo?", vbInformation + vbYesNo, "Enviar correo electrónico...") = vbYes Then
Nombre = -----Aquí buscas el nombre que le quieras poner
destinatario = ----Aquí buscas en tu lista de destinatarios el correcto
destinatario = destinatario & "@yahoo.es"
txt1 = "Hola"
txt2 = "Línea 2 del mensaje"
title = "Título del mensaje"
txt3 = "Línea 3 del mensaje" <---- y así sucesivamente
txt4 =
txt5 =
txt6 =
txt6 =
txt7 =
With cdoMsg
With .Configuration.Fields
.item(cdoSendUsingMethod).Value = cdoSendUsingPort
.item(cdoSMTPServerPort).Value = 25 <-------puerto de salida
.item(cdoSMTPServer).Value = "smtp.yahoo.es" <------ servidor SMTP
.item(cdoSendUserName).Value = "remitente@yahoo.es" <----------dirección de respuesta
.item(cdoSendPassword).Value = "contraseña" <------------aquí la contraseña de envío de mensajes
.item(cdoSMTPAuthenticate).Value = 1 'cdoBasic
.item(cdoSMTPUseSSL).Value = False
.Update
End With
.From = """Nombre del remitente""" & "remitente@yahoo.es"
.To = """Receipient""" & destinatario
.Subject = title
.TextBody = txt1 & vbNewLine & vbNewLine _
& txt2 & vbNewLine _
& txt3 & vbNewLine _
& txt4 & vbNewLine _
& txt5 & vbNewLine _
& txt6 & vbNewLine _
& vbNewLine _
& txt7
'.AddAttachment App.Path & "\attach.txt"
On Error Resume Next
.Send
End With
If Err.Number <> 0 Then
MsgBox "Error al enviar mensaje. Por favor, contacte con el administrador. Error " & Hex$(Err.Number) & vbNewLine & Err.Description, _
vbOKOnly Or vbExclamation, "Error" <-------------Tiene truco. El administrador eres tú ;)
Else
MsgBox "Correo enviado correctamente.", vbOKOnly, "Correo enviado"
End If
End If
End Sub