Este fórum está sendo desativado

Depois de 9 anos, este fórum será desativado. Mas calma.... estamos migrando para uma comunidade no DISCORD. Junte-se a nós.

ENTRAR PARA DISCORD

Tópicos relacionados a códigos VBA, gravação de macros, etc.
#62100
Prezados, bom dia!

Precisando de um socorro pois não consigo chegar numa rotina que atenda minha necessidade.
A situação é hipotética. Tenho uma planilha que eu alimento em cada linha compras de clientes tipo NOME, COD_CLIENTE, EMAIL, PRODUTO e VALOR.
Teste Envio Email.xlsm
Caso o mesmo cliente compre mais de um tipo de produto, logicamente, incluo na linha de baixo, as mesmas informações só alterando o produto e valor.
Busquei algumas informações na internet e criei a macro em anexo que envia o email automaticamente assim que alimento nova compra. Se o cliente compra só um produto, perfeito, sem problemas, o email vai certinho com as informações que preciso. Mas se ele compra 2 tipos de produto, não estou conseguindo criar a condição de mandar no mesmo email, o valor total da compra e a descrição do 2º produto. Ele acaba mandando 2 emails pra mesma pessoa, cada um com um produto.
Em resumo, ao gerar o email, o cliente tendo adquirido mais de um produto, a mensagem tem que informar o valor total da compra e a descrição do segundo (terceiro, etc) produto na mesma mensagem.

Obrigado.

Essa é a MACRO criada:

Sub enviar_email()

'Define linha de início da macro
linha = 2

'Analisa onde a macro vai parar - Linha vazia
While Cells(linha, 2) <> ""

'Condicional para não repetir envio de email
If Cells(linha, 1) = "" And Cells(linha, 1) <> "Pendente" Then

'Macro para envio do email
Set objeto_outlook = CreateObject("Outlook.Application")

Set Email = objeto_outlook.createitem(0)

Email.display

Email.to = Cells(linha, 4).Value

Email.Subject = "CONFIRMAÇÃO DE COMPRA - " & Cells(linha, 2).Value

'Macro para inserir corpo do email em html
If Time > 12 Then

Email.htmlbody = "<BODY style=font-size:11pt;font-family:Calibri>Prezado(a) " & Cells(linha, 2).Value & ", bom dia!<br><br>Agradecemos a preferência e comunicamos que foi aprovada a sua compra no valor de " & Cells(linha, 6).Text _
& " (" & Extenso_Valor(Cells(linha, 6)) & ")" & " para os produtos abaixo:<br><br>" & "<B>Produto: " & Cells(linha, 5).Value & ". (Valor - " & Cells(linha, 6).Value & ")</B>" & "<br><br>Informo que o prazo de entrega é de até 7 dias úteis.<br><br>Seguimos à disposição." _
& Email.htmlbody

Else

Email.htmlbody = "<BODY style=font-size:11pt;font-family:Calibri>Prezado(a) " & Cells(linha, 2).Value & ", boa tarde!<br><br>Agradecemos a preferência e comunicamos que foi aprovada a sua compra no valor de " & Cells(linha, 6).Text _
& " (" & Extenso_Valor(Cells(linha, 6)) & ")" & " para os produtos abaixo:<br><br>" & "<B>Produto: " & Cells(linha, 5).Value & ". (Valor - " & Cells(linha, 6).Value & ")</B>" & "<br><br>Informo que o prazo de entrega é de até 7 dias úteis.<br><br>Seguimos à disposição." _
& Email.htmlbody

End If

'Macro para incluir anexos
'Email.attachments.Add ("C:\Users\freirefab\Administracao\Documentos de apoio\Nota Fiscal.pdf")


'Email.send

'registrar o envio do email na planiha
Cells(linha, 1).Value = "Sim"

End If

linha = linha + 1

Wend

End Sub
Você não está autorizado a ver ou baixar esse anexo.
#62128
Experimente:
Código: Selecionar todos
Sub EnviaEmail()
 linha = 2 'Define linha de início da macro
 'Condicional para não repetir envio de email
  If [A2] <> "" Then Exit Sub
  'Macro para envio do email
  Set objeto_outlook = CreateObject("Outlook.Application")
  Set Email = objeto_outlook.createitem(0)
  Email.to = [D2]
  Email.Subject = "CONFIRMAÇÃO DE COMPRA - " & [B2]
  Email.display
  Email.htmlbody = "Prezado(a) " & Cells(linha, 2).Value & ", " & _
   IIf(Time < 12, "bom dia!", "boa tarde") & "!<br><br>Agradecemos a preferência e comunicamos que aprovamos as suas " _
    & "compras conforme segue."
   'Analisa onde a macro vai parar - Linha vazia
    While Cells(linha, 5) <> ""
     Email.htmlbody = Email.htmlbody & "<br><br>" & Cells(linha, 5) & " no valor de R$ " & Format(Cells(linha, 6), "#,###.00")
     Cells(linha, 1).Value = "Sim": linha = linha + 1
    Wend
   Email.htmlbody = Email.htmlbody & "<br><br>Informo que o prazo de entrega é de até 7 dias úteis.<br><br>Seguimos à disposição."
   Email.send
End Sub
#
obs. nas colunas B e D basta preencher a linha 2, ou seja, B2 e D2.

No seu exemplo, a mensagem recebida será conforme abaixo.
#
Prezado(a) Fabio Bertier, bom dia!!

Agradecemos a preferência e comunicamos que aprovamos as suas compras conforme segue.

Caixa papelão no valor de R$ 2.000,00

Resma Papel no valor de R$ 1.000,00

Informo que o prazo de entrega é de até 7 dias úteis.

Seguimos à disposição.
#62131
Osvaldo, show de bola...muito mais enxuta que a minha rsrsrsr....mas um dia eu aprendo isso direito.
Só que é o seguinte. Com os 2 registros de exemplo, beleza. Gerou o email tranquilo.
Depois que inseri novos registros pra teste, ou seja, ela não deveria enviar pros já enviados e enviar somente pros novos, ela não gerou. Depurei e ela já sai da Sub direto.
E essa seria a ideia. A base vai ser alimentada constantemente e o sistema enviaria emails só pros novos registros.
Ainda tentei mexer aqui mas não consigo chegar nessa lógica...ô trenzim complicado...
#62136
Bertier escreveu: 11 Fev 2021 às 14:11 Com os 2 registros de exemplo, beleza.
O código funciona para qualquer quantidade de registros.

Depurei e ela já sai da Sub direto.
Verdade, coloquei uma trava se A2 estiver preenchida o código não executa.

A base vai ser alimentada constantemente e o sistema enviaria emails só pros novos registros.
Com base na sua descrição acima me parece que você quer utilizar a Planilha1 também como um Banco de Dados. Então imagine que inserindo registros continuamente nessa planilha, em um certo momento haverá por exemplo 1.000 registros de emails enviados, aí você acrescenta o registro 1.001 e em seguida roda o código para enviar o email referente somente ao registro 1.001. Aí o código irá verificar desnecessariamente 1.000 registros para no final disparar apenas um email. Isso é trabalho escravo para o processador ;)
Eu sugiro um outro caminho. Após enviar os emails referentes aos registros que estão na Planilha1 o próprio código replicaria os registros na Planilha2, que seria o seu Banco de Dados dos emails enviados, e em seguida o código limparia os registros já processados da Planilha1.
Bertier agradeceu por isso
#62139
Beleza. Retorne se precisar de ajuda para complementar o código.

Se você gravar uma macro enquanto apaga os registros da Planilha1 isso já te dará uma boa ideia.
Bertier agradeceu por isso
#62230
Osvaldo,
Acho que cheguei num resultado, não sei se o mais indicado, mas atendeu a sua sugestão.
Poderia dar uma olhada só pra ver se seria o melhor caminho ou se há forma mais simples de executar?
Obrigado.

Sub AlimBase()
Range("b2:" & ActiveSheet.Range("b2").End(xlDown).End(xlToRight).Address).Copy
Sheets("Base de Dados").Select
Range("A1048576").End(xlUp).Offset(1, 0).Select
ActiveCell.PasteSpecial
Sheets("Planilha1").Select
Range("b2:" & ActiveSheet.Range("b2").End(xlDown).End(xlToRight).Address).ClearContents
End Sub
#62242
Olá, Fabio.

Alterei um pouco o lay out da planilha, criei a segunda planilha que será o Banco de Dados, aproveitei o código anterior e mais esse último que você postou.
Coloquei 3 botões para limpar a primeira planilha, e depois de efetuar os testes, se você quiser, poderá exclui-los.
Veja no arquivo anexo.
Retorne se quiser fazer alterações ou ajustes.
Você não está autorizado a ver ou baixar esse anexo.
Bertier agradeceu por isso
#62257
Osvaldo, mais uma vez, muito obrigado pelo seu apoio e tempo dispensado. Gostei bastante do resultado. Só vou dar uma alterada no layout pois pelo que entendi, eu teria que ficar inserindo e enviando emails um a um e a minha idéia é eu enviar os emails em lotes, ou seja, inserir 5 clientes e seus produtos e ao enviar o email, a rotina já cria os 5 emails e envia. Isso se eu entendi direito sua idéia.
No mais, como sou iniciante nessa loucura do VBA (você deve ter notado), poderia me dar um feedback sobre a rotina que criei? A lógica dela estava correta? Poderia dar certo ou em algum momento ela poderia pesar ou mesmo dar erro na execução e resultado final?
#62267
Bertier escreveu: 16 Fev 2021 às 21:07 ... pelo que entendi, eu teria que ficar inserindo e enviando emails um a um ...
A ideia foi essa, digitar os dados referentes a um único destinatário e em seguida clicar no botão para enviar o email. Considerando que o ato de clicar no botão vá consumir 2 segundos, esse tempo comparado com o tempo do preenchimento dos dados não me parece relevante. Ainda, se você vincular a macro a um atalho de teclado, aquele tempo será ainda menor.
Comparando agora com o seu lay out original, lá há células com dados repetidos, cujo preenchimento certamente levará mais do que os 2 segundos para cada destinatário.
Se você preferir elabore um novo lay out conforme a sua preferência e nos passe, assim faremos os ajustes no código. Informe também sobre a planilha ENVIADOS, se deseja mantê-la e se sim, altere o lay out dela conforme desejar.

... poderia me dar um feedback sobre a rotina que criei?
Eu não cheguei a testá-lo, mas na análise visual me parece que a construção está correta.
A única recomendação que eu faria é para não utilizar Select ou Activate, pois esses comandos aumentam o tempo de execução do código, limitam a versatilidade na elaboração do código, além de provocar "pula-pula" na tela (flicking). Esses comandos raramente são necessários, eles sempre aparecem nas macros gravadas, pois essas macros somente reproduzem os movimentos feitos pelo operador. Compare com os códigos que eu passei. São Select free.
Bertier agradeceu por isso
long long title how many chars? lets see 123 ok more? yes 60

We have created lots of YouTube videos just so you can achieve [...]

Another post test yes yes yes or no, maybe ni? :-/

The best flat phpBB theme around. Period. Fine craftmanship and [...]

Do you need a super MOD? Well here it is. chew on this

All you need is right here. Content tag, SEO, listing, Pizza and spaghetti [...]

Lasagna on me this time ok? I got plenty of cash

this should be fantastic. but what about links,images, bbcodes etc etc? [...]

Estamos migrando para uma comunidade no Discord