AUTOMATIZAÇÃO EMISS...
 
Notifications
Clear all

AUTOMATIZAÇÃO EMISSÃO RELATORIO POR MACRO

9 Posts
2 Usuários
4 Reactions
1,767 Visualizações
(@marcosuke)
Posts: 72
Trusted Member
Topic starter
 

Olá pessoal!

Preciso muito da ajuda de vocês.

Tenho um arquivo em excel, que possui uma caixa de seleção onde é possível selecionar uma lista com nomes de investidores.

Quando cada investidor é selecionado o arquivo traz a informação financeira desse investidor e após isso clico em um botão que possui uma macro que transforma a tela da planilha em um arquivo PDF para ser enviado por email para o investidor.

Hoje preciso fazer isso manualmente, seleciono o nome do investidor, clico no botão para converter em PDF e envio por email. E vou fazendo isso com os próximos nomes, são perto de 400. Isso dá um trabalhão.

Gostaria de saber se alguém sabe uma forma de automatizar isso via macro. A macro faria a seleção do investidor (um a um), chamaria a macro pra salvar a tela em PDF e salvaria todos os relatorios em um caminho ja determinado na macro. (será que é possível ja enviar o email de forma automática tb?)

Alguem poderia me ajudar com isso? Anexei um modelo bem simples como exemplo.

Abraços!

 

 

 

 
Postado : 05/01/2021 11:55 am
Mauro Coutinho
(@coutinho)
Posts: 95
Estimable Member
 

@marcosuke o ideal seria voce ter enviado o arquivo que está utilizando alterando para nomes e dados fictícios dos investidores, assim seria bem mais fácil tentar montar alguma coisa, pois no arquivo anexo faltam varios detalhes alem das rotinas que já está utilizando.

Desta forma, baseando no seu anexo, cole a rotina abaixo em um Modulo, se for o mesmo layout do arquivo original ela trará todos os nomes um por um, só tem de ajustar colocando a chamada para as suas rotinas.

Sub ProcuraAplicadores()
Dim iLin As Long
Dim sCol As Long
Dim sAplicadores

Dim wsDados As Worksheet
Set wsDados = Worksheets("APLICADORES")

iLin = 5 'Linha 5
sCol = 3 'Coluna 3

With wsDados

Do While Not IsEmpty(.Cells(iLin, sCol))

sAplicadores = .Cells(iLin, sCol).Value

MsgBox ("Coloque aqui a sua rotina") & Chr(13) _
& ("para montar e salvar em Pdf") & Chr(13) _
& (" para o Aplicador :-") & Chr(13) & Chr(13) _
& sAplicadores

iLin = iLin + 1

Loop

End With

End Sub

 

Mauro Coutinho

[]s

 
Postado : 05/01/2021 4:24 pm
marcosuke reacted
(@marcosuke)
Posts: 72
Trusted Member
Topic starter
 

@coutinho Muito obrigado pela contribuição, nem sei como te agradecer.

 

Não sou muito experiente em VBA, mas estou me esforçando para aprender, por isso, acho que ainda vou precisar da sua ajuda.

Pelo que entendi, o código faz a leitura da linha 3 e coluna 5 da aba Aplicadores da minha planilha de exemplo, para adaptar isso para minha planilha original, (aba se chama LISTAAPLICADORES, a linha é a 5 e a coluna a 5), o código ficaria desta forma:

Dim wsDados As Worksheet
Set wsDados = Worksheets("LISTAAPLICADORES")

iLin = 5 'Linha 5
sCol = 5 'Coluna 5

Nessa parte fiquei com duvidas do que o código faz:

MsgBox ("Coloque aqui a sua rotina") & Chr(13) _
& ("para montar e salvar em Pdf") & Chr(13) _
& (" para o Aplicador :-") & Chr(13) & Chr(13) _
& sAplicadores

"Coloque aqui a sua rotina"> O msgbox geralmente traz alguma mensagem em determinada ação, é oque acontece aqui?

"para montar e salvar em Pdf" > Aqui o código chama a minha macro que converte o arquivo em PFD? Se sim como faço para o código chamar a macro que converte em PDF? O código que utilizo é a seguinte:

Sub Salvar_Documento()
'
' Salvar_Documento Macro

ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=Application.GetSaveAsFilename( _
VBA.Strings.Format(Range("f3").Value) + ".pdf", _
fileFilter:="pdf Files (*.pdf), *.pdf")
MsgBox "Relatório de investimentos salvo com Sucesso!", vbInformation, "Relatório de Investimentos"

End Sub

" para o Aplicador :-" > Esse momento do código não entendi qual é a ação.

 

Mauro, mais uma vez obrigado pela gentileza. Abraço!

 
Postado : 07/01/2021 2:31 pm
Mauro Coutinho
(@coutinho)
Posts: 95
Estimable Member
 

@marcosuke

quanto a questão do nome da aba, linha e coluna você fez corretamente.

Na parte do MsgBox coloquei só para ilustrar o que faz a linha :
sAplicadores = .Cells(iLin, sCol).Value
que tras o nome de cada um separado da relação na Variável "sAplicadores" e é aonde tem de fazer a chamada para as rotinas que utiliza eliminando essa instrução MsgBox.

Como eu disse no inicio, o ideal seria ter o arquivo original, pra ter conhecimento do layout e como está montando a aba que quer salvar.
A rotina que mostrou só salva uma determinada aba (ActiveSheet) em Pdf, então eu não tenho conhecimento que aba seria, como ela é montada com as informações, a área, se as informações veem atraves de formulas ou rotinas.

Mas a principio, seu raciocínio está correto, então, se não tiver como enviar o arquivo original, o que voce tem de fazer seria :

Após essa linha : sAplicadores = .Cells(iLin, sCol).Value, apagar a instrução MsgBox pegar o nome armazenado na variavel "sAplicadores" jogar para o campo da planilha a ser montada e qdo a aba estiver pronta chamar a rotina para salvar utilizando a instrução "Call" ficando assim :
Call Salvar_Documento

Espero que tenha dado para entender, qq coisa escreva.

 

[]s

Mauro Coutinho

 
Postado : 07/01/2021 3:30 pm
marcosuke reacted
(@marcosuke)
Posts: 72
Trusted Member
Topic starter
 

@coutinho

Olá Mauro!

Vou anexar o layout exato do arquivo que utilizo.

Lá deixei algumas anotações pra você entender melhor o funcionamento.

Peço desculpas por não saber me expressar bem sobre o assunto, mas como disse, ainda estou engatinhando no VBA.

Veja se fica mais claro a idéia com o arquivo anexo.

Obrigado!

 
Postado : 07/01/2021 10:17 pm
Mauro Coutinho
(@coutinho)
Posts: 95
Estimable Member
 

@marcosuke vi seu arquivo e a única duvida que fiquei é o que vai para área de impressão ?? Você tem as formulas para buscar o nome, numero da conta e montar o nome do arquivo, não vi nenhuma infomação jogada para a Área de Impressão.
Sendo assim a rotina ficaria da seguinte forma:

Sub ProcuraAplicadores()
Dim iLin As Long
Dim sCol As Long
Dim sLISTAAPLICADORES

Dim wsDados As Worksheet
Set wsDados = Worksheets("LISTAAPLICADORES")

iLin = 5 'Linha 5
sCol = 5 'Coluna 5

With wsDados

Do While Not IsEmpty(.Cells(iLin, sCol))

sLISTAAPLICADORES = .Cells(iLin, sCol).Value

'Lança o Nome na Aba RELATORIO_MENSAL em E4
Range("E4").Value = sLISTAAPLICADORES

Call Salvar_Documento

iLin = iLin + 1

Loop

End With

End Sub

-----------------------
Uma outra sugestão sem precisar usar formulas seria jogar o nome pra E4 e montar o nome do arquivo na propria rotina e salvar, abaixo como ficaria, só aque a variável sNomePdf fica no escopo como Publica, copie e cole em um novo modulo e veja o que acha.

Public sNomePdf

Sub ProcuraAplicadores_Mais_Nome_Arquivo()
Dim iLin As Long
Dim sCol As Long
Dim sLISTAAPLICADORES
Dim sConta

Dim wsDados As Worksheet
Set wsDados = Worksheets("LISTAAPLICADORES")

iLin = 5 'Linha 5
sCol = 5 'Coluna 5

With wsDados

Do While Not IsEmpty(.Cells(iLin, sCol))

'Armazena na variavel o Nome do aplicador
sLISTAAPLICADORES = .Cells(iLin, sCol).Value

'Coloca o Nome em E4
Range("E4").Value = sLISTAAPLICADORES

'Armazena na variavel o Numero da Conta
sConta = .Cells(iLin, sCol + 1).Value

'Montamos o nome do arquivo
sNomePdf = sConta & "_" & sLISTAAPLICADORES

Call Salvar_Documento2

iLin = iLin + 1

Loop

End With

End Sub

Sub Salvar_Documento2()

'Salva o arquivo com o nome da Variável sNomePdf
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=Application.GetSaveAsFilename( _
VBA.Strings.Format(sNomePdf) + ".pdf", _
fileFilter:="pdf Files (*.pdf), *.pdf")
MsgBox "Relatório de investimentos salvo com Sucesso!", vbInformation, "Relatório de Investimentos"

End Sub

[]s
Mauro Coutinho

Este post foi modificado 4 anos atrás por Mauro Coutinho
 
Postado : 10/01/2021 9:26 pm
marcosuke reacted
(@marcosuke)
Posts: 72
Trusted Member
Topic starter
 

@coutinho

Olá Mauro!! Fantástico! Já no primeiro código funcionou muito bem, muito obrigado meu amigo! Ainda chego nesse nível.

Neste primeiro codigo é possível fazer três coisas para finalizar a sua ajuda?:

1 - Quando executar a macro, pedir para o usuário escolher um local para salvar os relatorios e salvar todos eles no local escolhido pelo usuário (sem a necessidade de ficar escolhendo um local para salvar para cada arquivo)

2- Ele exibe a msg de "salvo com sucesso", apenas quando salvar todos os relatorios.

3- Quando a macro é iniciada, e eu tiver que cancelar por algum motivo, gostaria que ao pressionar ESC ele parasse o processo sem apresentar erro, apenas uma msg que o processo foi interrompido pelo usuário.

Meu amigo, muito obrigado mesmo pela força! Ficou muito top mesmo o seu trabalho!

 

 
Postado : 14/01/2021 5:52 pm
Mauro Coutinho
(@coutinho)
Posts: 95
Estimable Member
 

@marcosuke abaixo refiz todas as rotinas e disponibilizei conforme a sequencia a ser seguida, ou seja :

1º) Rotina "OpenPrompt" onde abrira a cx de dialogo para selecionar onde salvar armazenando o caminho na Variável "OutputFolder"

2º) Rotina ProcuraAplicadores1 - onde irá buscar o nome de cada Aplicador

3º) Rotina Salvar_Documento4 - onde salvará todos os documentos na pasta armazenada na variável e os nomes na celula

Copie em um modulo novo ou faça os ajustes nas rotinas que ja tem so adicionando a macro OpenPrompt e não esquecendo de declarar a variável.

Faça os testes e qq duvida retorne, ahh qto ao ESC não tive como testar, a velocidade que foi excecutada aqui é grnade que nem da tempo de captar o pressionar da mesma, mas existem rotinas para forçar a parada, mas veja antes se essas de agora dão certo.

'Variavel referente ao caminho da pasta selecionada
Dim OutputFolder As String

Sub OpenPrompt()

Dim SaveDialogBox As Object

'Selecione a pasta para Salvar
Set SaveDialogBox = Application.FileDialog(msoFileDialogFolderPicker)

'Verifica se foi clicado em Cancelar
If SaveDialogBox.Show = -1 Then

'Armazena o caminho da pasta
OutputFolder = SaveDialogBox.SelectedItems(1)

'Chama a rotina ProcuraAplicadores1
Call ProcuraAplicadores1
End If

End Sub

Sub ProcuraAplicadores1()
Dim iLin As Long
Dim sCol As Long
Dim sLISTAAPLICADORES

Dim wsDados As Worksheet
Set wsDados = Worksheets("LISTAAPLICADORES")

iLin = 5 'Linha 5
sCol = 5 'Coluna 5

With wsDados

Do While Not IsEmpty(.Cells(iLin, sCol))

sLISTAAPLICADORES = .Cells(iLin, sCol).Value

'Lança o Nome na Aba RELATORIO_MENSAL em E4
Range("E4").Value = sLISTAAPLICADORES

Call Salvar_Documento4

iLin = iLin + 1

Loop

End With

MsgBox "Todos os relatorios salvo com Sucesso!", vbInformation, "Relatório de Investimentos"

End Sub

Sub Salvar_Documento4()

'Salva todos os documentos na pasta armazenada na Variável OutputFolder e nome definido em I6
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=OutputFolder & "\" & Format(Range("I6").Value) + ".pdf"

End Sub

 

[]s

Mauro Coutinho

 
Postado : 19/01/2021 1:18 am
marcosuke reacted
(@marcosuke)
Posts: 72
Trusted Member
Topic starter
 

@coutinho rapaz eu nem tenho como te agracer!

Muito obrigado Mauro, e me perdoe a demora, infelizmente tive alguns problemas com o meu computador.

Você é muito fera, a macro fiuncionou perfeitamente no que eu precisava.

Que a vida possa ser generosa com você da mesma forma como você foi comigo.

Espero um dia poder ser fera no vba e poder ajudar pessoas como você fez.

Muito obrigado!!!

 

Este post foi modificado 4 anos atrás 2 vezes por marcosuke
 
Postado : 02/02/2021 1:14 pm