separar datos y enviar como archivos Excel independientes (1ª parte)

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.

 

Continuar leyendo la 2 parte

Temática: 

Comentarios

Re: separar datos y enviar como archivos Excel ...

Imagen de ERAMIREM

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 ...

Imagen de pacomegia

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.

 

 

Data Tools Suite
datos y tablas con Excel

Re: separar datos y enviar como archivos Excel ...

Imagen de Cron

¿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