Notifications
Clear all

Melhorar Macro que envia Excel por e-mail sozinha.

4 Posts
2 Usuários
0 Reactions
957 Visualizações
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Colegas, tudo beleza...
Preciso de ajuda para melhorar o meu código VBA abaixo. Ele está funcionando normalmente, porém, gostaria de algumas melhorias, vou explicar o que ele faz e depois o que quero melhorar:
A função principal dele é enviar (via Outlook) mala direta para uma lista de e-mails que tem nesta planilha.
Então, o excel tem duas abas, uma chamada “Menu” que tem o botão que dispara a execução da Macro, e a outra aba chamada “Dados” que nesta tem os dados que compõem o e-mail como: e-mail do destinatário, Assunto e Texto do Corpo e o caminho do arquivo que será anexado ao e-mail.
Criei esta macro pois, no meu trabalho, tenho que enviar um relatório de vendas individualmente pra cada vendedor externo. Como é algo muito repetitivo, criei esta macro que cria o e-mail, anexa o arquivo, preenche os dados de cada vendedor e dispara o e-mail automaticamente.

Melhorias necessárias:
Toda execução ocorre em segundo plano, então só sei se terminou quando exibe a MsgBox no final de tudo, se caso algo travar não vou acompanhar.
1ª melhoria: Seria criar uma barra de status (ou progressão) para ir acompanhando o estágio de execução de 0% a 100% por exemplo.
2ª melhoria: Criar mais um campo para o Conteúdo do Corpo do e-mail, pois hoje, ele está levando para o corpo do e-mail o que está dentro da célula que tem o Assunto.

Alguém me ajuda com essas duas melhorias.? Não estou conseguindo sozinho.
Segue abaixo o Código VBA e o excel para visualizarem melhor.

Dim objOutlook As Outlook.Application
Dim objOutlookMsg As Outlook.MailItem
Dim strEmail As String, strName As String
Dim lRowCount As Long

Set objOutlook = CreateObject("outlook.application")
Sheets("Dados").Select 'Seleciona a pasta "Dados".
lRowCount = 2
Do Until ActiveSheet.Cells(lRowCount, 2) = ""
strEmail = ActiveSheet.Cells(lRowCount, 2).Value
strName = ActiveSheet.Cells(lRowCount, 1).Value
Set objOutlookMsg = objOutlook.CreateItem(olMailItem) 
With objOutlookMsg
.Subject = ActiveSheet.Cells(lRowCount, 3).Value ' Note: Could be Column "C" - ActiveSheet.Cells(lRowCount, 3).Value
.Body = ActiveSheet.Cells(lRowCount, 3).Value ' Note: Could be Column "D" - ActiveSheet.Cells(lRowCount, 4).Value
.To = strEmail
'.Attachments.Add ("c:/e-mail attachments/" & strName & ".xls")
.Attachments.Add (ActiveSheet.Cells(lRowCount, 4).Value)
.Send
End With
lRowCount = lRowCount + 1 ' Increment Row Counter
Loop
Sheets("Menu").Select
Range("C3").Select
MsgBox (" E-mails enviados com Sucesso! "), vbInformation, "Envio Automático dos E-mails."
Set objOutlook = Nothing
Set objOutlookMsg = Nothing
End Sub

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 19/10/2016 1:53 pm
(@wrsouza)
Posts: 8
Active Member
 

Danilo,
Boa noite

Veja se te ajuda... Pra dar um ar mais profissional e mais prático (ao meu ver), montei um formulário com uma listbox, onde na aba Dados você deverá preencher somente o e-mail do vendedor, o título do e-mail e o endereço do arquivo a ser anexado. Foi colocado a caixa de texto conforme pedido e a barra de progresso (esta só vai aparecer quando o botão enviar for apertado). Espero ter ajudado :D :D :D
Para abrir o formulário, é só pressionar o botão Enviar na aba menu.

 
Postado : 25/10/2016 11:28 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Olá WRSouza, Muito Obrigado pela ajuda, com certeza ficou muito melhor com sua sugestões, porém, estava faltando declarar algumas variáveis e, depois que eu as declarei, agora está dando um erro que não estou conseguindo resolve-lo, anexo tela do erro para verificar.

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 26/10/2016 4:43 am
(@wrsouza)
Posts: 8
Active Member
 

Danilo, boa tarde.

Vi que você declarou como variáveis o contador, x e o Format, correto?

Eu não os declarei pelos seguintes motivos:
- Format = A função format não é uma variável. Esta função é utilizada para formatar o números e usando consigo dar a forma que quiser: números, data, percentuais, entre outros;
- x = raramente declaro esta variável, principalmente quando uso ela na estrutura de repetição For Next;
- contador = Também raramente declaro esta variável (a explicação é a mesma do x);

Portanto, se remover as declarações, verá que a macro executará normalmente e, pode ficar tranquilo que, você não terá problemas em momento algum.

Weslei Rodrigues =D

 
Postado : 26/10/2016 1:33 pm