• Olá Visitante, se gosta do forum e pretende contribuir com um donativo para auxiliar nos encargos financeiros inerentes ao alojamento desta plataforma, pode encontrar mais informações sobre os várias formas disponíveis para o fazer no seguinte tópico: leia mais... O seu contributo é importante! Obrigado.

Envio automático de ficheiro por e-mail

mlcalves

GF Ouro
Membro Inactivo
Entrou
Mai 20, 2010
Mensagens
2,278
Gostos Recebidos
0
Boas. Muito útil para quem precisa que um ficheiro de excel seja enviado frequentemente por outlook para determinadas pessoas. Cria-se uma tarefa num windows para abrir o ficheiro de excel nos dias que queremos.

Depois abrimos o vba, e no livro incluimos código

Código:
Private Sub Workbook_Open()
Call Envio_ficheiroOutlook1   'O ficheiro ao abrir é chamada a função. Escolher a que mais convém
End Sub


Vou dar 3 exemplos:

Neste caso envia o próprio ficheiro.

Código:
Sub Envio_ficheiroOutlook1()
'Funciona em Excel 2000-2013
'Este código envia ficheiro com as alterações feitas até ao último "guardar"
    Dim OutApp As Object
    Dim OutMail As Object
    Dim strbody As String 'criado para definir todo o texto a colocar no corpo de e-mail
    
    'Uma vbnewline passa para a linha seguinte. 2 vb newline passa para 2 linhas a seguir.
    strbody = "Bom dia," & vbNewLine & vbNewLine & _
              "Junto envio ficheiro atualizado à data de hoje com o n.º de couves vendidas." & vbNewLine & vbNewLine & _
              "Atentamente," & vbNewLine & _
              "Zé das Couves"
              
    

    Set OutApp = CreateObject("Outlook.Application")
    Set OutMail = OutApp.CreateItem(0)

    On Error Resume Next
    With OutMail
        .SentOnBehalfOfName = """Gerente COuves"" <gerente@agri.xpt>"   'Imaginem que o gerente tem 2 contas de e-mail. Caso não queiram utilizar metam um ' antes do .Sent.. ou apaguem a linha toda
        .to = "financeira@agri.xpt"    'Para meterem mais e-mails basta meter ; a seguir ao e-mail e prosseguir inserindo o " no fim para "fechar"
        .CC = ""
        .BCC = ""
        .Subject = "Report diário de vendas"
        .Body = strbody 'neste caso está a usar o texto definido na strbody (ver acima). Mas podiam simplesmente meter uma frase entre ""
        .Attachments.Add ActiveWorkbook.FullName
        'Podem adicionar outros ficheiros. Ver linha abaixo.
        '.Attachments.Add ("C:\couves.txt")
        .Display   ' Aqui usa-se .display para visualizar e depois carregamos em enviar ou se não queremos visualizar, alteramos para .Send    - .display tb é usado mt vez para testarmos se vai tudo ok
    End With
    On Error GoTo 0

    Set OutMail = Nothing
    Set OutApp = Nothing
End Sub



No caso abaixo envia o ficheiro com outro nome

Código:
Sub Envio_ficheiroOutlook2()
'Funciona em Excel 2000-2013
'Copia o ficheiro com outro nome
    Dim wb1 As Workbook
    Dim TempFilePath As String
    Dim TempFileName As String
    Dim FileExtStr As String
    Dim OutApp As Object
    Dim OutMail As Object
    Dim strbody As String 'criado para definir todo o texto a colocar no corpo de e-mail

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

    Set wb1 = ActiveWorkbook
    
      'Uma vbnewline passa para a linha seguinte. 2 vb newline passa para 2 linhas a seguir.
    strbody = "Bom dia," & vbNewLine & vbNewLine & _
              "Junto envio ficheiro atualizado à data de hoje com o n.º de couves vendidas." & vbNewLine & vbNewLine & _
              "Atentamente," & vbNewLine & _
              "Zé das Couves"
    

    'Fazer uma cópia do ficheiro /Abrir /Enviar e-mail com ficheiro / Apagar ficheiro
    TempFilePath = Environ$("temp") & "\"
    TempFileName = "Couves Power " & Format(Now, "dd-mmm-yy h-mm-ss")     'Aqui mostra nome de ficheiro definido com data incluida. Se quiserem nome metem apenas "Couves Power"
    FileExtStr = "." & LCase(Right(wb1.Name, Len(wb1.Name) - InStrRev(wb1.Name, ".", , 1)))

    wb1.SaveCopyAs TempFilePath & TempFileName & FileExtStr

    Set OutApp = CreateObject("Outlook.Application")
    Set OutMail = OutApp.CreateItem(0)

    On Error Resume Next
    With OutMail
        .SentOnBehalfOfName = """Gerente COuves"" <gerente@agri.xpt>"   'Imaginem que o gerente tem 2 contas de e-mail. Caso não queiram utilizar metam um ' antes do .Sent.. apaguem a linha toda
        .to = "financeira@agri.xpt"    'Para meterem mais e-mails basta meter ; a seguir ao e-mail e prosseguir inserindo o " no fim para "fechar"
        .CC = ""
        .BCC = ""
        .Subject = "Report diário de vendas"
        .Body = strbody 'neste caso está a usar o texto definido na strbody (ver acima). Mas podiam simplesmente meter uma frase entre ""
        .Attachments.Add ActiveWorkbook.FullName
        'Podem adicionar outros ficheiros. Ver linha abaixo.
        '.Attachments.Add ("C:\couves.txt")
        .Display   ' Aqui usa-se .display para visualizar e carregar em enviar ou se não queremos visualizar, alteramos para .Send    - .display tb é usado mt vez para testarmos se vai tudo ok
    End With
    On Error GoTo 0

    'Apagar ficheiro
    Kill TempFilePath & TempFileName & FileExtStr

    Set OutMail = Nothing
    Set OutApp = Nothing

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

No exemplo abaixo mostra como copiar uma sheet para um novo ficheiro e enviar


Código:
Sub Email_Sheet()
'Funciona em Excel 2000-2013
    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 OutApp As Object
    Dim OutMail As Object
    Dim strbody As String 'criado para definir todo o texto a colocar no corpo de e-mail

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

    Set Sourcewb = ActiveWorkbook
    
        'Uma vbnewline passa para a linha seguinte. 2 vbnewline passa para 2 linhas a seguir.
    strbody = "Bom dia," & vbNewLine & vbNewLine & _
              "Junto envio ficheiro atualizado à data de hoje com o n.º de couves vendidas." & vbNewLine & vbNewLine & _
              "Atentamente," & vbNewLine & _
              "Zé das Couves"

    
    'ActiveSheet.Copy ' Copia a sheet ativa para um novo livro e procede ao envio
    Sheets("Vendas").Copy ' Copia a sheet especifica para um novo livro e procede ao envio
    Set Destwb = ActiveWorkbook

    'Determina a versão de excel e respetiva extenção/formato
    With Destwb
        If Val(Application.Version) < 12 Then
            'Se usas o Excel 97-2003
            FileExtStr = ".xls": FileFormatNum = -4143
        Else
            'Se usas Excel 2007-2013
            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 With

    '    'Copia o conteudo das celulas como valores apenas caso seja pretendido 
    '    With Destwb.Sheets(1).UsedRange
    '        .Cells.Copy
    '        .Cells.PasteSpecial xlPasteValues
    '        .Cells(1).Select
    '    End With
    '    Application.CutCopyMode = False

    'Salva novo livro/ Envia livro/Apaga livro
    TempFilePath = Environ$("temp") & "\"
    TempFileName = "Couves power"

    Set OutApp = CreateObject("Outlook.Application")
    Set OutMail = OutApp.CreateItem(0)

    With Destwb
        .SaveAs TempFilePath & TempFileName & FileExtStr, FileFormat:=FileFormatNum
        On Error Resume Next
        With OutMail
        .SentOnBehalfOfName = """Gerente COuves"" <gerente@agri.xpt>"   'Imaginem que o gerente tem 2 contas de e-mail. Caso não queiram utilizar metam um ' antes do .Sent.. apaguem a linha toda
        .to = "financeira@agri.xpt"    'Para meterem mais e-mails basta meter ; a seguir ao e-mail e prosseguir inserindo o " no fim para "fechar"
        .CC = ""
        .BCC = ""
        .Subject = "Report diário de vendas"
        .Body = strbody 'neste caso está a usar o texto definido na strbody (ver acima). Mas podiam simplesmente meter uma frase entre ""
        .Attachments.Add ActiveWorkbook.FullName
        'Podem adicionar outros ficheiros. Ver linha abaixo.
        '.Attachments.Add ("C:\couves.txt")
        .Display   ' Aqui usa-se .display para visualizar e carregar em enviar ou se não queremos visualizar, alteramos para .Send    - .display tb é usado mt vez para testarmos se vai tudo ok
        End With
        On Error GoTo 0
        .Close savechanges:=False
    End With

    'Apaga ficheiro que enviaste
    Kill TempFilePath & TempFileName & FileExtStr

    Set OutMail = Nothing
    Set OutApp = Nothing

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