Notifications
Clear all

CRIAR MACRO PARA ENVIAR E-MAIL

16 Posts
3 Usuários
0 Reactions
3,556 Visualizações
(@artotto)
Posts: 13
Active Member
Topic starter
 

Bom Dia,

Preciso muito de ajuda neste caso, preciso criar uma macro na minha planilha de cronograma de atividades:

Preciso criar uma marco onde eu consiga clicar no Botar e enviar um e-mail para quem tem atividade naquela data, por exemplo eu tenho uma planilha com 180 atividades, eu queria entrar diariamente na planilha e clicar no botão enviar e caso tenha atividades naquele dia enviar um e-mail para a pessoa, constando a atividade e uma mensagem:

"Olá, Prezada (o)"
"Consta(m) Atividade(s) para você no Cronograma de Fechamento;"
"Por gentileza Verificar"
"Atenciosamente"
"Gian Silva"

É mais ou menos assim (Cada barra é uma coluna):

Colunas A / B / C / D / E / F
linha 1 [email protected] / 04/10/2019 / Conferir tabela de INSS - SEMPRE PARA O MÊS POSTERIOR PRISCILA / FP - 1o. PROCESSAMENTO / Selecione / Pendente
linha 2 [email protected] / 04/10/2019 / Conferir Salário Familia - SEMPRE PARA O MÊS POSTERIOR PRISCILA / FP - 1o. PROCESSAMENTO / Selecione / Pendente

Total de 180 linhas

Obrigado mesmo. :cry:

https://www.sendspace.com/file/055471

 
Postado : 14/10/2019 5:30 am
(@laerteb)
Posts: 67
Trusted Member
 

Boa tarde, ARTOTTO

Como tu és membro novo deste Fórum, por gentileza verificar as regras do mesmo, pois tu postou dois
Tópicos iguais e não está em "sintonia" com as regras (verifique)... ;)

Em relação ao arquivo exemplo estarei verificando e logo que tiver analisado(com calma :D ) te informo aqui :) ...
Aguarde também outras respostas do pessoal ;)

Abraços

LaerteB ;)

 
Postado : 14/10/2019 10:57 am
(@laerteb)
Posts: 67
Trusted Member
 

Boa tarde, ARTOTTO

Estou com uma correria aqui, mas pude ver o seu caso e inclui alguns trechos
no seu código (para salientar, aqui funcionou com MsgBox ;))...

Porém como não utilizo o Outlook, não testei com o envio de e-mail, mas
funcionará é só seguir conforme abaixo :

Primeiro retire/exclua este trecho abaixo, do seu código:

    linha = ActiveCell.Row - 1
    If Target.Address = "$F$" & linha Then

        If Plan1.Cells(linha, 1) = "HOJE()" Then
            texto = "Prezado(a) " & Plan1.Cells(linha, 1) & "," & vbCrLf & _
                    "Consta a atividade" & Plan1.Cells(linha, 3) & " em aberto para você " & _
                    Plan1.Cells(linha, 5) & " Por gentileza verificar o cronograma." & _
                    vbCrLf & _
                    "Atenciosamente." & vbCrLf & vbCrLf & _
                    "XXXXXX" & vbCrLf & "Departamento XXXXX"
        End If

        With OutMail
            .To = Plan1.Cells(linha, 1)
            .CC = ""
            .BCC = ""
            .Subject = "Atividade - Cronograma Fechamento RH"
            '.HTMLBody = texto
            .Body = texto
            .Display   'Utilize Send para enviar o email sem abrir o Outlook
        End With
        On Error GoTo 0

        Set OutMail = Nothing
        Set OutApp = Nothing
    End If

Agora no lugar deste acima, inclua este trecho abaixo no seu código:

 Dim DataHoje As Date
  
 Set Rng = Range("B4")

  DataHoje = Date

  Do While Rng.Value <> ""
    Rng.Select

  If Str(Rng.Value) = DataHoje Then

            texto = "Prezado(a) " & Rng.Offset(0, -1).Value & "," & vbCrLf & _
                    "Consta a atividade " & Rng.Offset(0, 1).Value & " em aberto para você " & _
                    Rng.Offset(0, 3).Value & " Por gentileza verificar o cronograma." & _
                    vbCrLf & _
                    "Atenciosamente." & vbCrLf & vbCrLf & _
                    "XXXXXX" & vbCrLf & "Departamento XXXXX"
                    
  End If

   Set Rng = Rng.Offset(1, 0)

  Loop

   ' MsgBox (texto)  ' linha de teste

          With OutMail
            .To = Plan1.Cells(linha, 1)
            .CC = ""
            .BCC = ""
            .Subject = "Atividade - Cronograma Fechamento RH"
            '.HTMLBody = texto
            .Body = texto
            .Display   'Utilize Send para enviar o email sem abrir o Outlook
        End With

        On Error GoTo 0

        Set OutMail = Nothing
        Set OutApp = Nothing
        Set Rng = Nothing

Editado às 17:05hs (14/10/2019):
Desculpe na pressa errei a "posição" do trecho do envio do e-mail (se ficar como antes só será enviado o
último registro com a data atual, mesmo se tiver mais de um); então o correto seria como abaixo:

 ......
           texto = "Prezado(a) " & Rng.Offset(0, -1).Value & "," & vbCrLf & _
                    "Consta a atividade " & Rng.Offset(0, 1).Value & " em aberto para você " & _
                    Rng.Offset(0, 3).Value & " Por gentileza verificar o cronograma." & _
                    vbCrLf & _
                    "Atenciosamente." & vbCrLf & vbCrLf & _
                    "XXXXXX" & vbCrLf & "Departamento XXXXX"

   'colocar este trecho aqui

            With OutMail
            .To = Plan1.Cells(linha, 1)
            .CC = ""
            .BCC = ""
            .Subject = "Atividade - Cronograma Fechamento RH"
            '.HTMLBody = texto
            .Body = texto
            .Display   'Utilize Send para enviar o email sem abrir o Outlook
        End With

  End If
  
   Set Rng = Rng.Offset(1, 0)

  Loop

        On Error GoTo 0

        Set OutMail = Nothing
        Set OutApp = Nothing
        Set Rng = Nothing
.....

Obs: a pesquisa é feita na coluna "B", pela data atual :)

Por gentileza verificar se era isso que queria :)

Qualquer dúvida estamos aqui para ajudá-lo...

Aguardando sua resposta e seu Feed Back(é muito importante) ... se foi útil, não esqueça de clicar na "mãozinha" :D

LaerteB :D

 
Postado : 14/10/2019 1:03 pm
(@artotto)
Posts: 13
Active Member
Topic starter
 

Laerte, Boa Tarde.

Obrigado por tirar um tempo e desculpe atrapalhar:

Ficou assim e mesmo clicando no botão "enviar" não chega nenhum e-mail:

Private Sub CommandButton1_Click()

End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim OutApp As Object
    Dim OutMail As Object
    Dim texto As String

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

    Dim DataHoje As Date
 
Set Rng = Range("B4")

  DataHoje = Date

  Do While Rng.Value <> ""
    Rng.Select

  If Str(Rng.Value) = DataHoje Then

            texto = "Prezado(a) " & Rng.Offset(0, -1).Value & "," & vbCrLf & _
                    "Consta(m) a(s) atividade(s) " & Rng.Offset(0, 1).Value & " em aberto para você " & _
                    Rng.Offset(0, 3).Value & " Por gentileza verificar o cronograma." & _
                    vbCrLf & _
                    "Atenciosamente." & vbCrLf & vbCrLf & _
                    "Gian Silva" & vbCrLf & " - Coordenador de Departamento Pessoal"
                   
 With OutMail
            .To = Plan1.Cells(linha, 1)
            .CC = ""
            .BCC = ""
            .Subject = "Atividade - Cronograma Fechamento RH"
            '.HTMLBody = texto
            .Body = texto
            .Display   'Utilize Send para enviar o email sem abrir o Outlook
        End With

  End If
 
   Set Rng = Rng.Offset(1, 0)

  Loop

        On Error GoTo 0

        Set OutMail = Nothing
        Set OutApp = Nothing
        Set Rng = Nothing
End Sub
 
Postado : 14/10/2019 2:16 pm
JSCOPA10
(@jscopa10)
Posts: 344
Reputable Member
 

.
ARTOTTO, sempre que você postar código clique em "CODE" para ele ficar igual ao ao Laerte!! ... Este eu já coloquei !!!
.

 
Postado : 14/10/2019 2:19 pm
(@laerteb)
Posts: 67
Trusted Member
 

Boa tarde, ARTOTTO

Não precisa se desculpar, estamos aqui para ajudar no nosso tempo livre :) ..

Como estou na correria, vou olhar melhor o seu caso a noite, mas de antemão verifique
se existe na coluna "B" alguma célula com 14/10/2019 (data de hoje); pois no seu arquivo
não existia esta data, eu alterei algumas linhas com a data de hoje para fazer o teste ;) ...

Se mesmo assim não for enviado e-mail (alterando uma ou algumas linhas da coluna "B"
para a data de hoje; somente para testar), me avise aqui que olharei melhor a noite Ok :D ..

Aguardando sua resposta e seu Feed Back(é muito importante) ... se foi útil, não esqueça de clicar na "mãozinha" :D

LaerteB

 
Postado : 14/10/2019 2:51 pm
(@artotto)
Posts: 13
Active Member
Topic starter
 

Laerte deu certo até este ponto, ai ele para

 With OutMail
            .To = Plan1.Cells(linha, 1)

Até aqui vai tranquilo, segue ele inteiro

Private Sub CommandButton1_Click()

End Sub
Private Sub EnviaEmail()
    Dim OutApp As Object
    Dim OutMail As Object
    Dim texto As String

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

    Dim DataHoje As Date
 
Set Rng = Range("B4")

  DataHoje = Date

  Do While Rng.Value <> ""
    Rng.Select

  If Str(Rng.Value) = DataHoje Then

            texto = "Prezado(a) " & Rng.Offset(0, -1).Value & "," & vbCrLf & _
                    "Consta(m) a(s) atividade(s) " & Rng.Offset(0, 1).Value & " em aberto para você " & _
                    Rng.Offset(0, 3).Value & " Por gentileza verificar o cronograma." & _
                    vbCrLf & _
                    "Atenciosamente." & vbCrLf & vbCrLf & _
                    "Gian Silva" & vbCrLf & " - Coordenador de Departamento Pessoal"
                   
 With OutMail
            .To = Plan1.Cells(linha, 1)
            .CC = ""
            .BCC = ""
            .Subject = "Atividade - Cronograma Fechamento RH"
            '.HTMLBody = texto
            .Body = texto
            .Display   'Utilize Send para enviar o email sem abrir o Outlook
        End With

  End If
 
   Set Rng = Rng.Offset(1, 0)

  Loop

        On Error GoTo 0

        Set OutMail = Nothing
        Set OutApp = Nothing
        Set Rng = Nothing
        
        End Sub
 
Postado : 14/10/2019 2:52 pm
(@artotto)
Posts: 13
Active Member
Topic starter
 

Laerte,

Obrigado e já dei jóinha lá e vou dar novamente assim que terminarmos..

O código ficou assim

 Private Sub CommandButton1_Click()

End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim OutApp As Object
    Dim OutMail As Object
    Dim texto As String

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

    Dim DataHoje As Date
 
Set Rng = Range("B4")

  DataHoje = Date

  Do While Rng.Value <> ""
    Rng.Select

  If Str(Rng.Value) = DataHoje Then

            texto = "Prezado(a) " & Rng.Offset(0, -1).Value & "," & vbCrLf & _
                    "Consta(m) a(s) atividade(s) " & Rng.Offset(0, 1).Value & " em aberto para você " & _
                    Rng.Offset(0, 3).Value & " Por gentileza verificar o cronograma." & _
                    vbCrLf & _
                    "Atenciosamente." & vbCrLf & vbCrLf & _
                    "Gian Silva" & vbCrLf & " - Coordenador de Departamento Pessoal"
                   
 With OutMail
            .To = Plan1.Cells(linha, 1)
            .CC = ""
            .BCC = ""
            .Subject = "Atividade - Cronograma Fechamento RH"
            '.HTMLBody = texto
            .Body = texto
            .Display   'Utilize Send para enviar o email sem abrir o Outlook
        End With

  End If
 
   Set Rng = Rng.Offset(1, 0)

  Loop

        On Error GoTo 0

        Set OutMail = Nothing
        Set OutApp = Nothing
        Set Rng = Nothing
        
End Sub

Mas quando coloco para depurar ele para aqui:

    .To = Plan1.Cells(linha, 1)

Obrigado e Bom descanso

 
Postado : 14/10/2019 3:00 pm
(@laerteb)
Posts: 67
Trusted Member
 

Boa tarde, ARTOTTO

É que no seu arquivo a Plan1 não é o correto e sim Planilha1, altere este trecho pelo que se
encontra abaixo:

    .To = Planilha1.Cells(linha, 1)

Editado às 18:55 (14/10/2019)... como estava na correria deixei de perceber que
não existia mais a "linha" e outras questões pertinentes a este trecho :cry: , desta forma mesmo alterando para
Panilha1 não iria resolver (a presa é inimiga da perfeição)...

Então o que pode resolver o seu problema é acrescentar este trecho abaixo, na sequencia dos "Dim" :

 Dim textomail As String

E também acrescentar este trecho, abaixo do "texto=..." :

        textomail = Rng.Offset(0, -1).Value

Agora alterar o trecho abaixo :

            .To = Plan1.Cells(linha, 1)

Por esse :

            .To = textomail

Espero que isto resolva o problema, mas se não me informe ok :) .

Aguardando sua resposta e seu Feed Back(é muito importante) ... se foi útil, não esqueça de clicar na "mãozinha" :D

LaerteB

 
Postado : 14/10/2019 3:08 pm
(@artotto)
Posts: 13
Active Member
Topic starter
 

Laerte,

Muito Obrigado, deu certo sim e ainda consegui colocar o anexo.

Você ajudou muito mesmo, obrigado pelo tempo em ajudar;

Abraço;

 
Postado : 15/10/2019 8:42 am
(@laerteb)
Posts: 67
Trusted Member
 

Bom dia, ARTOTTO

Obrigado você, aqui estamos para ajudar da melhor forma possível :)

Fiquei feliz que conseguiu resolver o seu problema :D

Qualquer coisa pode contar conosco ;)

Abraço

LaerteB :D

 
Postado : 15/10/2019 9:00 am
(@artotto)
Posts: 13
Active Member
Topic starter
 

Laerte, Boa Tarde.

Cara os dias que contêm mais de 1 linha na mesma data ele não abre 2, 3 emails para cada e-mail, ele abre 1 e-mail e anexa 2 ou 3 vezes o arquivo;

Private Sub CommandButton1_Click()

End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim OutApp As Object
    Dim OutMail As Object
    Dim texto As String
    Dim textomail As String

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

    Dim DataHoje As Date
 
Set Rng = Range("B4")

  DataHoje = Date

  Do While Rng.Value <> ""
    Rng.Select

  If Str(Rng.Value) = DataHoje Then

            texto = "Prezado(a) " & Rng.Offset(0, 3).Value & "," & vbCrLf & vbCrLf & _
                    "Consta(m) a(s) atividade(s): " & Rng.Offset(0, 1).Value & ", em aberto para você." & vbCrLf & vbCrLf & _
                    "Por gentileza verificar o cronograma anexo." & vbCrLf & vbCrLf & _
                    "Atenciosamente." & vbCrLf & vbCrLf & _
                    "Gian Silva" & vbCrLf & "Coordenador de Departamento Pessoal"
                    textomail = Rng.Offset(0, -1).Value
                                
 With OutMail
            .To = textomail
            .CC = ""
            .BCC = ""
            .Subject = "Atividade - Cronograma Fechamento RH"
            .Attachments.Add "L:Departamento PessoalFolha_Gestão FolhaCronograma FechamentoCRONOGRAMA - FECHAMENTO RH.xlsm"
            '.HTMLBody = texto
            .Body = texto
            .Display   'Utilize Send para enviar o email sem abrir o Outlook
        End With

  End If
 
   Set Rng = Rng.Offset(1, 0)

  Loop

        On Error GoTo 0

        Set OutMail = Nothing
        Set OutApp = Nothing
        Set Rng = Nothing
        
End Sub
 
Postado : 17/10/2019 10:28 am
(@artotto)
Posts: 13
Active Member
Topic starter
 

Laerte,

Agradeço o retorno, mas já eliminei os módulos, o que acontece é que tenho 163 linhas qual contêm diversas datas certo...

14/10/2019
15/10/2019
17/10/2019
17/10/2019
18/10/2019
18/10/2019
18/10/2019

Acontece que nos dias que têm mais de 1 linha com a mesma data, ao invés de abrir 3 e-mails sendo 1 para cada destinatário (Linha), ele abre 1 e-mail anexando 3 arquivos.

Veja se fui claro, senão eu anexo para você, ou se puder me passa seu e-mail que envio e respondo por aqui.

Valeu Abraço;

 
Postado : 17/10/2019 2:34 pm
(@laerteb)
Posts: 67
Trusted Member
 

Bom dia, ARTOTTO

Olha, não precisa clicar no botão "citar" para responder, clique no botão "Responder" no canto
esquerdo no final da página do Tópico :); (no seu caso não é necessário informar o
conteúdo da mensagem anterior; caso seja realmente necessário deixe somente uma ou duas linhas
no "citar" OK ;) ).

Editado em 20/10/2019: Quero me desculpar pelos trechos anteriores desta mensagem (que criei na sexta 18/10
que agora apaguei, pois consegui testar em outro PC (neste final de semana) que continha o Outlook e pude
perceber as suas questões levantadas ARTOTTO... Então, desta forma o que pegava era que não abria instâncias novas do
Outlook, quando era encontrado nova data igual, fazendo que substituísse os campos pela última linha que continha
a data atual :oops: ...

Então troquei de lugar alguns trechos e agora abre 1 e-mail (a ser enviado) por vez (por data atual), deixando
as janelas abertas, para ti confirmar e enviá-las :D ...

Obs: incluí algumas linhas (estão comentadas) que se for utilizá-las irão colorir a célula que contem a data atual,
e desta forma se disparar novamente o código abaixo, não irá enviar novamente as linhas que contiverem
células de cor verde claro na coluna "B" ;) ... espero que isto possa te ajudar de alguma maneira (se quiser é claro) :) .

Agora, você substitui o código anterior por este abaixo:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim OutApp As Object
    Dim OutMail As Object
    Dim texto As String
    Dim DataHoje As Date
    Dim textomail As String

 Set Rng = Range("B4")

  DataHoje = Date

  Do While Rng.Value <> ""
    Rng.Select
 
  If Str(Rng.Value) = DataHoje And Rng.Offset(0, 0).Interior.ColorIndex <> 4 Then
    Set OutApp = CreateObject("Outlook.Application")
    Set OutMail = OutApp.CreateItem(0)
     
        With OutMail
         .Display
        End With

            texto = "Prezado(a) " & Rng.Offset(0, -1).Value & "," & vbCrLf & _
                    "Consta a atividade " & Rng.Offset(0, 1).Value & " em aberto para você " & _
                    Rng.Offset(0, 3).Value & " Por gentileza verificar o cronograma." & _
                    vbCrLf & _
                    "Atenciosamente." & vbCrLf & vbCrLf & _
                    "Gian Silva" & vbCrLf & "Departamento Pessoal"
                    
        textomail = Rng.Offset(0, -1).Value
         ' Rng.Offset(0, 0).Select  'seleciona a célula que contém a data atual
        '  Selection.Interior.ColorIndex = 4   'colori a célula selecionada
                    

 With OutMail
            .To = textomail
            .CC = ""
            .BCC = ""
            .Subject = "Atividade - Cronograma Fechamento RH"
            '.HTMLBody = texto
            .Body = texto

 End With
        
        Set OutMail = Nothing
        Set OutApp = Nothing

  End If
  
   Set Rng = Rng.Offset(1, 0)

  Loop

        On Error GoTo 0

        Set Rng = Nothing

End Sub

Verifique se era o que estava esperando :D ...

Se houver qualquer dúvida acima, me informe ;) ..

Aguardando sua resposta e seu Feed Back (é muito importante)... se foi útil, não esqueça de clicar na "mãozinha" :D

LaerteB :D

 
Postado : 18/10/2019 6:50 am
(@artotto)
Posts: 13
Active Member
Topic starter
 

Valeu Laerte, era isso mesmo que eu precisava.

Agora só vou fazer funcionar o botão enviar e já era.

Obrigado e abraço.

 
Postado : 21/10/2019 9:40 am
Página 1 / 2