locked
Salvar Mala Direta Em Arquivos Separados RRS feed

  • Pergunta

  • Boa tarde galera!

    É o seguinte, estou com um problemão, mas não estou conseguindo resolver, pois não tenho conhecimento avançado em VBA, peço por gentileza uma ajuda de vocês.

    Tenho um modelo de carta no Word que captura alguns campos de uma planilha que tenho no excel, ele captura o campo E-mail e Senha.

    Até consigo gerar a mala direta, mas quando tenho muitos registros, ele gera em um arquivo só todos os registros e preciso que gere em arquivos .doc separados.

    Alguém saberia me dizer como fazer isso, mas peço que detalhem o máximo para mim pois sou totalmente novato nesse assunto.

    Ah detalhe em minhas pesquisas até encontrei algo parecido, mas não consegui fazer funcionar, pois não sei se estou fazendo a coisa certa, o codigo que encontrei esta abaixo em vermelho.

    Obrigado Galera!

    CODE
    Sub SalvaComo Arqs
    ' Converte todas as seções para subdocumentos
    TudoParaSubDocs ActiveDocument
    ' Salva cada subdocumento como um arquivo separado
    SalvaTodosSubDocs ActiveDocument
    End Sub


    CODE
    Sub TudoParaSubDocs(ByRef doc As Word.Document)
    Dim ctaSec As Long
    Dim NrSecs As Long
    NrSecs = doc.Sections.Count
    ' Inicial pelo final porque a criação de
    ' Subdocs iinsere seções adicionais
    For ctaSec = NrSecs - 1 To 1 Step -1
    doc.Subdocuments.AddFromRange doc.Sections(ctaSec).Range
    Next ctaSec
    End Sub


    CODE
    Sub SalvaTodosSubDocs(ByRef doc As Word.Document)
    Dim subdoc As Word.Subdocument
    Dim NovoDoc As Word.Document
    Dim ContaDocs As Long
    ContaDocs = 1
    ' Deve estar em Exibir Mestre para trabalhar com
    ' Subdocs como arquivos separados
    doc.ActiveWindow.View = wdMasterView
    For Each subdoc In doc.Subdocuments
    Set NovoDoc = subdoc.Open
    ' Remove as quebras de seção Próxima Página
    ' Geradas pela fusão dos arquivos
    RemoveQuebrasSec NovoDoc
    With NovoDoc
    .SaveAs FileName:="Arquivo" & CStr(ContaDocs)
    .Close
    End With
    ContaDocs = ContaDocs + 1
    Next subdoc
    End Sub


    CODE
    Sub RemoveQuebrasSec(doc As Word.Document)
    With doc.Range.Find
    .ClearFormatting
    .Text = "^b"
    With .Replacement
    .ClearFormatting
    .Text = ""
    End With
    .Execute Replace:=wdReplaceAll
    End With
    End Sub

     

    Vlw!

    terça-feira, 1 de fevereiro de 2011 15:37

Todas as Respostas

  • Ae galera me ajudem nessa solução por favor. Vlw!
    terça-feira, 1 de fevereiro de 2011 21:43
  • Olá,

    antes de pensar no código VBA, gostaria de saber se o Mala Direta (Mail Merge) feito na tela atende ao que você precisa.

    Ao executar o Mail Merge, o Word faz o que você descreveu, então porque não o usou na macro?


    Luiz Cláudio Cosenza Vieira da Rocha - http://msmvps.com/blogs/officedev - IT Lab www.itlab.com.br - Access FAQ: www.accessfaq.com.br
    terça-feira, 1 de fevereiro de 2011 23:39
    Moderador
  • Opa blz Luiz, valew pelo retorno!

     

    Então cara, eu encontrei esse código e pelo que descrevia a pessoa era o que eu pretendia fazer, mas sinceramente eu não conheço nada de VBA, se puder me auxiliar e lhe agradeço enormemente.

     

    Se você puder detalhar passo a passo como fazer, como inserir esse código, pois não sei por onde iniciar.

     

    Meu cenario é o seguinte:

     

    Tenho uma carta no Word que contém duas variaveis importantes: E-mail e Senha, ela carrega essas informações de uma planilha no Excel, no Excel tem duas colunas E-mail e Senha. Quando peço para gerar a mala direta, ela gera em um arquivo único do WORD todas as cartas, quero que ele gere um arquivo .doc para cada conjunto de E-mail e Senha.

     

    Será que consegui explicar direito?

     

    Me add anunes22@hotmail.com.

     

    Abraço Luiz!

    quarta-feira, 2 de fevereiro de 2011 16:01
  • Up, alguém pode me ajudar?
    terça-feira, 8 de fevereiro de 2011 15:31
  • Verifique o primeiro modelo deste link: http://www.ambienteoffice.com.br/word/criar_mala_direta_programaticamente_usando_o_excel/
    Felipe Costa Gualberto - http://www.ambienteoffice.com.br
    segunda-feira, 21 de fevereiro de 2011 17:13
    Moderador
  • Antes de mais nada, cole o código no seu modelo de mala direta. Neste código há um erro na primeira linha Sub SalvaComo Arqs. Apague o Arqs.

    Assim que gerar o documento com todas as páginas, execute a macro SalvarComo.

     

    Qualquer coisa entre em contato via MSN: osmarjjr@hotmail.com.

    Eu traduzi o artig. :)

    quarta-feira, 23 de fevereiro de 2011 16:56
  • Bom dia a todos!

    Não sou programador e nem trabalho com isso, mas como também tive essa necessidade do Mail Merge aqui na empresa e gosto de otimizações, cheguei ao seguinte resultado logo abaixo.

    Nesse código implementei como Save as PDF, é só trocar alguns parametros que é possível trocar o formato final e outras coisas.

    Sub SalvarComoPDF()

    Dim a As Integer
    Dim registro As Integer

    'Set Mail Merge in the first register
    ActiveDocument.MailMerge.DataSource.ActiveRecord = wdFirstRecord

    'Mail Merge Count
    a = ActiveDocument.MailMerge.DataSource.RecordCount

    'For to exportToPDF all registers
    For registro = 1 To a

        ActiveDocument.ExportAsFixedFormat OutputFileName:= _
            "C:\Users\Usuário\Desktop\teste mala direta\" & registro & " - Solicitação de Cadastros.pdf" _
            , ExportFormat:=wdExportFormatPDF, OpenAfterExport:=False, OptimizeFor:= _
            wdExportOptimizeForPrint, Range:=wdExportAllDocument, From:=1, To:=1, _
            Item:=wdExportDocumentContent, IncludeDocProps:=True, KeepIRM:=True, _
            CreateBookmarks:=wdExportCreateNoBookmarks, DocStructureTags:=True, _
            BitmapMissingFonts:=True, UseISO19005_1:=False
        
        ActiveDocument.MailMerge.DataSource.ActiveRecord = wdNextRecord
                
        Next registro
            
        End
                
    End Sub


    • Sugerido como Resposta edu.ribeiro quinta-feira, 5 de abril de 2012 12:35
    • Editado edu.ribeiro quinta-feira, 5 de abril de 2012 12:35
    quinta-feira, 5 de abril de 2012 12:33
  • E aí cara? Quanto aquele problema da Mala Direta? Conseguiu concluir? Estou com o mesmo problemão.

    Tentei usar o codigo acima, mas deu uma mensagem que nao entendi.

    Acho que usei de forma errada o codigo. Se puder me ajudar te agradeceria.

    PHFMatos

    quinta-feira, 3 de maio de 2012 12:48
  • Caro Osmar,

    quanto ao problema da mala-direta em arquivos separados, tem algum particular na execucao a macro?

    Exemplo:

    1 -como sao varias macros, devo separa-las ou posso colocar todas juntas.

    2 - na propria macro tem uma instrucao "Deve estar em Exibir Mestre para trabalhar com Subdocs como arquivos separados" e isso eu nao entendi.

    Se puder me dar uma luz, agradeceria,

    PHFMatos

    quinta-feira, 3 de maio de 2012 12:53
  • Prezado amigo,

    Peguei o código do edu.ribeiro e fiz uma pequena alteração para que quando salvar o arquivo o mesmo seja salvo com o valor de alguma coluna da minha mala direta, assim fica mais fácil de identificar o arquivo. Para usá-lo, basta criar uma macro no arquivo word da mala direta, e não no arquivo resultante da mala direta, e em seguida executar a macro. Testei no Office 2010 e funcionou sem problemas.

    Sub SalvarComoPDF()

    Dim qtde As Integer
    Dim nomeArquivo As String
    Dim registro As Integer

    'Set Mail Merge in the first register
    ActiveDocument.MailMerge.DataSource.ActiveRecord = wdFirstRecord

    'Mail Merge Count
    qtde = ActiveDocument.MailMerge.DataSource.RecordCount
    'arquivo = ActiveDocument.MailMerge.DataSource.FieldNames(1).Name

    'For to exportToPDF all registers
    For registro = 1 To qtde
        
        nomeArquivo = ActiveDocument.MailMerge.DataSource.DataFields("NomeDaColunaDaMalaDireta").Value
        
        ActiveDocument.ExportAsFixedFormat OutputFileName:= _
            "H:\Temp\MalaDireta\pdf\" & nomeArquivo & ".pdf" _
            , ExportFormat:=wdExportFormatPDF, OpenAfterExport:=False, OptimizeFor:= _
            wdExportOptimizeForPrint, Range:=wdExportAllDocument, From:=1, To:=1, _
            Item:=wdExportDocumentContent, IncludeDocProps:=True, KeepIRM:=True, _
            CreateBookmarks:=wdExportCreateNoBookmarks, DocStructureTags:=True, _
            BitmapMissingFonts:=True, UseISO19005_1:=False
        
        ActiveDocument.MailMerge.DataSource.ActiveRecord = wdNextRecord
                
        Next registro
            
        End
                
    End Sub

    terça-feira, 4 de dezembro de 2012 23:46
    1. Prezado amigo,
    2. Peguei o código do edu.ribeiro e fiz uma pequena alteração para que quando salvar o arquivo o mesmo seja salvo com o valor de alguma coluna da minha mala direta, assim fica mais fácil de identificar o arquivo. Para usá-lo, basta criar uma macro no arquivo word da mala direta, e não no arquivo resultante da mala direta, e em seguida executar a macro. Testei no Office 2010 e funcionou sem problemas.
    3. Sub SalvarComoPDF()

      Dim qtde As Integer
      Dim nomeArquivo As String
      Dim registro As Integer

      'Set Mail Merge in the first register
      ActiveDocument.MailMerge.DataSource.ActiveRecord = wdFirstRecord

      'Mail Merge Count
      qtde = ActiveDocument.MailMerge.DataSource.RecordCount
      'arquivo = ActiveDocument.MailMerge.DataSource.FieldNames(1).Name

      'For to exportToPDF all registers
      For registro = 1 To qtde

          nomeArquivo = ActiveDocument.MailMerge.DataSource.DataFields("NomeDaColunaDaMalaDireta").Value

          ActiveDocument.ExportAsFixedFormat OutputFileName:= _
              "H:\Temp\MalaDireta\pdf\" & nomeArquivo & ".pdf" _
              , ExportFormat:=wdExportFormatPDF, OpenAfterExport:=False, OptimizeFor:= _
              wdExportOptimizeForPrint, Range:=wdExportAllDocument, From:=1, To:=1, _
              Item:=wdExportDocumentContent, IncludeDocProps:=True, KeepIRM:=True, _
              CreateBookmarks:=wdExportCreateNoBookmarks, DocStructureTags:=True, _
              BitmapMissingFonts:=True, UseISO19005_1:=False

          ActiveDocument.MailMerge.DataSource.ActiveRecord = wdNextRecord

          Next registro

          End

      End Sub

                                                     

    Não entendi, colega não entendo nada de nada, mas preciso muito fazer isso, você pode me ensinar passo a passo? meu email é elisson@hotmail.com.br

    Preciso Salvar separadamente cada arquivo com um nome Específico.

    terça-feira, 26 de novembro de 2013 14:16
  • Olá,

    O tópico ao qual você respondeu é muito antigo. Sugiro que crie um novo tópico com sua pergunta, referenciando este link. Com isso, você aumentará as chances de obter uma resposta e ajudará a manter o fórum organizado.


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br

    terça-feira, 26 de novembro de 2013 23:40
    Moderador
  • Você conseguiu resolver o problema?

    Como você fez?

    quinta-feira, 12 de março de 2015 18:54
  • Como utilizar esse código?
    quinta-feira, 12 de março de 2015 18:55