Cómo enviar adjunta por correo electrónico una hoja de Excel

Una de las consultas más habituales en los foros de Excel es acerca de la posibilidad de enviar por correo electrónico la hoja con la que se está trabajando en ese momento (la hoja activa). Buscando información acerca de ello, he encontrado un código que tras modificarlo, lo publico. La verdad es que no recuerdo el mensaje en concreto. Lo que sí sé es que fue publicado en el foro de Mr. Excel.

El usuario trabaja con hojas de cálculo que se actualizan automáticamente cada 2 o 3 minutos con información sobre bolsa. Al actualizarse esa información, se ejecutan unos cálculos que dan ciertos resultados. Era de vital importancia que la hoja fuese enviada lo más rápidamente posible para ganar tiempo a sus competidores.

El código para enviar por correo electrónico la hoja activa es el siguiente:

    Sub EnviarHojaActiva()
    'Este código funciona en las versiones 97-2010
    Dim FileExtStr As String
    Dim FileFormatNum As Long
    Dim Sourcewb As Workbook
    Dim Destwb As Workbook
    Dim TempFilePath As String
    Dim TempFileName As String
    Dim I As Long

    With Application
    .ScreenUpdating = False
    .EnableEvents = False
    End With

    Set Sourcewb = ActiveWorkbook

    'Copia la hoja a un libro nuevo
    ActiveSheet.Copy
    Set Destwb = ActiveWorkbook

    'Determina la versión de Excel y la extensión del archivo
    With Destwb
    If Val(Application.Version) < 12 Then
    'Estás utilizando 97-2003...
    FileExtStr = ".xls": FileFormatNum = -4143
    Else
    'Estás utilizando 2007, 2010 o 2013. Sale de la macro al responder
    'NO en el cuadro de diálogo de seguridad que aparece cuando copias
    'una hoja desde un archivo xlsm con las macros deshabilitadas.
    If Sourcewb.Name = .Name Then
    With Application
    .ScreenUpdating = True
    .EnableEvents = True
    End With
    MsgBox "Has respondido no en el cuadro de diálogo de seguridad"
    Exit Sub
    Else
    Select Case Sourcewb.FileFormat
    Case 51: FileExtStr = ".xlsx": FileFormatNum = 51
    Case 52:
    If .HasVBProject Then
    FileExtStr = ".xlsm": FileFormatNum = 52
    Else
    FileExtStr = ".xlsx": FileFormatNum = 51
    End If
    Case 56: FileExtStr = ".xls": FileFormatNum = 56
    Case Else: FileExtStr = ".xlsb": FileFormatNum = 50
    End Select
    End If
    End If
    End With

    ' 'Elimina las comillas de las siguiente líneas
    ' 'si quieres sustituir las fórmulas por valores
    ' With Destwb.Sheets(1).UsedRange
    ' .Cells.Copy
    ' .Cells.PasteSpecial xlPasteValues
    ' .Cells(1).Select
    ' End With
    ' Application.CutCopyMode = False

    'Graba la hoja que se enviará por correo
    TempFilePath = Environ$("temp") & ""
    TempFileName = "Parte de " & Sourcewb.Name & " " _
    & Format(Now, "dd-mmm-yy h-mm-ss")

    With Destwb
    .SaveAs TempFilePath & TempFileName & FileExtStr, _
    FileFormat:=FileFormatNum
    On Error Resume Next
    For I = 1 To 3
    ' Modifica el correo del destinatario y el asunto
    .SendMail "CORREO@MIDOMINIO.COM", "Este es el asunto"
    If Err.Number = 0 Then Exit For
    Next I
    On Error GoTo 0
    .Close SaveChanges:=False
    End With

    'Elimina el archivo temporal que se ha creado
    Kill TempFilePath & TempFileName & FileExtStr

    With Application
    .ScreenUpdating = True
    .EnableEvents = True
    End With
    End Sub

Al ejecutar la macro se abrirá un cuadro solicitando permiso para enviar el correo. Es una medida de seguridad para prevenir posibles envíos no autorizados.

¿Te ha servido el artículo? Házmelo saber!

Respuestas

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

  1. Hola!
    con esto lo mandas a través del cliente de escritorio de correo, pero si quieres que se mande a través de gmail? por ejemplo, o de cualquier otro servidor de correo web? Gracias!
  2. RG, para poder enviarlo necesitarías tener acceso a la API de cada servidor web, para programar un tipo de acceso por cada servidor. En mi opinión, no merece la pena este tipo de envío de correo.
  3. Hola! gracias por el enlace, lo revisaré en el día de hoy.

    Por qúe piensas que no merece la pena este tipo de envío? A mí me gustaría automatizarlo incluso, que lo haga cada hora.

  4. Te puse que no merecía la pena porque solo lo podrías utilizar para enviar correos desde una sola dirección. Si quieres enviar desde diferentes cuentas de correo, podrías crear una pequeña base de datos dentro de la hoja con los diferentes servidores desde los que se podrían enviar correos y solicitar a través de un InputBox la contraseña de cada cuenta cada vez que se vaya a enviar el correo.
  5. Creo que con el enlace que te puse más arriba tienes de sobra para comenzar.

    Deberías sustituir los datos del servidor por variables que tomen el valor de un formulario o de una pequeña base de datos alojada en una hoja. Como medida de seguridad, solicita siempre la contraseña del correo electrónico. Así prevendrás correos no autorizados.

  6. estaba yo probando para si ejecutar, quedarme con el y usarlo pero;

    me contiene esta línea
    .SendMail “CORREO@MIDOMINIO.COM“, “Este es el asunto”

    en rojo dentro del modulo. ¿Qué puede ser? el correo ya lo integre, es decir joaley7@tal y tal.com

  7. Buenos días, deseo configurar una macro que me envié un correo basándose en un fecha, por ejemplo tengo varios productos y uno de ellos ya esta vencido, deseo que me llegue a mi correo un mensaje para poder revisar cual es el producto que ya hay que cambiarlo.
  8. SERGIO, COMO SIEMPRE EXPECTACULAR TUS TUTORIALES, MUY SENCILLOS Y CLAROS, PERO DE PRONTO Y SI ES DE INTERES DE ALGUNA PERSONA QUE DESEE ENVIAR UNA MAIL DIRECTAMENTE DESDE EXCEL PODRIA UTILIZAR EL COMPLEMENTO RDBMAIL QUE FUNCIONA EXCELENTE. YO TRABAJO CON EXCEL 97 Y ESTA OK.
    SALUDOS