none
Problema em preencher um documento word RRS feed

  • Pergunta

  • Pessoal, estou fazendo um programinha para uso proprio que pega informações de um form e preenche um documento word de template.

    Até que consegui progredir um pouco pesquisando pela internet, mas estou com um problema, o meu código só preenche o documento na primeira ocorrencia, se eu tiver várias variaveis @nome por exemplo, ele só preenche na primeira vez que ela aparece... 

    Alguém tem alguma dica de como fazer isso recursivamente? 

        Private Sub subDados(header As String, data As String)
    
            With objWord.Selection.Find
                .ClearFormatting()
                .Text = header
                .Execute()
                .Forward = True
            End With
    
            Clipboard.Clear()
            Clipboard.SetText(data)
            objWord.Selection.Paste()
            Clipboard.Clear()
        
        End Sub


        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
          
    
            objWord = New Microsoft.Office.Interop.Word.Application
           
                objDoc = objWord.Documents.Open("c:\temp\PRO_PS.doc")
    
    
                Call subDados("@CLIENTENOME", txtCLIENTENOME.Text)
                Call subDados("@CONTATONOME", txtCONTATONOME.Text)
                Call subDados("@CONTATOEMAIL", txtCONTATOEMAIL.Text)
                Call subDados("@CONTATOTEL", txtCONTATOTEL.Text)
    
                objWord.ActiveDocument.SaveAs2("c:\temp\PRO_PS2.doc")
                objWord.Quit()
                MsgBox("Arquivo gerado com sucesso!")
            End If
    
     objWord = Nothing
    
    
        End Sub

    Basicamente é isso... qualquer ajuda é bem vinda!! 


    terça-feira, 13 de janeiro de 2015 17:57

Respostas

  • Aqui fiz de um outro jeito aqui e acho que deu certo... parece que tem um método pra isso... o wdReplaceAll

        Private Sub subDados(header As String, data As String)
    
            With objWord.Selection.Find
                .ClearFormatting()
                .Text = header
                .Replacement.ClearFormatting()
                .Replacement.Text = data
                .Execute(Replace:=Word.WdReplace.wdReplaceAll)
    
            End With
         
    
        End Sub

    • Marcado como Resposta Leonardo Mundim quarta-feira, 14 de janeiro de 2015 15:42
    quarta-feira, 14 de janeiro de 2015 13:18

Todas as Respostas

  • Tente fazer como abaixo, pois esta limpando o clipboard quando o mesmo contem dados e sempre vai vazio o paste:

    Private Sub subDados(header As String, data As String)
    
            With objWord.Selection.Find
                .ClearFormatting()
                .Text = header
                .Execute()
                .Forward = True
            End With
    
            Clipboard.SetText(data)
            objWord.Selection.Paste()
            Clipboard.Clear()
        
        End Sub

    terça-feira, 13 de janeiro de 2015 18:15
  • Não adiantou não... pelo oq entendi aquele clipboard.clear antes é para previnir que nao tenha nada colado no clipboard... 

    terça-feira, 13 de janeiro de 2015 18:23
  • Me informe uma coisa, ele so grava o ultimo item que você passa correto?
    terça-feira, 13 de janeiro de 2015 18:38
  • Coloque isso ai e testa:
    Private Sub subDados(header As String, data As String)
    
            With objWord.Selection.Find
                .ClearFormatting()
                .Text = header
                .Execute()
                .Forward = True
            End With
    
            Clipboard.Clear()
            Clipboard.SetText(data+"\n")
            objWord.Selection.Paste()
            Clipboard.Clear()
        
        End Sub

    Ao meu ver a cada chamada que você faz de SubDados() ele sobrepõe o valor anterior ficando sempre o ultimo valor inserido


    • Editado Mr. GMSOFT terça-feira, 13 de janeiro de 2015 18:43
    terça-feira, 13 de janeiro de 2015 18:42
  • Então... a cada chamada do método subDados ele substitui corretamente, porém se o meu documento do word tem a variável em mais de um ponto, ele só substitui na primeira ocorrência. 
    terça-feira, 13 de janeiro de 2015 18:59
  • Você não entendeu ele sobrepõe os dados anteriores, testou o código que coloquei?
    terça-feira, 13 de janeiro de 2015 20:14
  • Antes de mais nada, obrigado por me estar ajudando.

    Mas não deu certo não... foi o mesmo efeito. Eu ainda acho q ele não esta sobrepondo e sim que ele não esta varrendo todo o documento. 

    e não entendi o pq do "\n" seria pra dar um enter? pq no vb acho q não rola assim

    quarta-feira, 14 de janeiro de 2015 10:26
  • Eu refiz seu projeto aqui e entendi de fato o problema, no caso se você precisar acrescentar informações no arquivo pressionando uma segunda vez ocorre o problema no objDoc não é isso?

    Veja essa Thread

    • Editado Mr. GMSOFT quarta-feira, 14 de janeiro de 2015 13:08
    quarta-feira, 14 de janeiro de 2015 12:22
  • é mais ou menos por ai... 

    imagina que meu arquivo do Word PRO_PS.doc é desta meneira:

    @CLIENTENOME.
    At.: @CONTATONOME
    E-mail: @CONTATOEMAIL
    Tel.: @CONTATOTEL
    
    
    
    @CLIENTENOME.
    At.: @CONTATONOME
    E-mail: @CONTATOEMAIL
    Tel.: @CONTATOTEL
    
    
    @CLIENTENOME.
    At.: @CONTATONOME
    E-mail: @CONTATOEMAIL
    Tel.: @CONTATOTEL
    


    Ai com o programa ele ta trocando somente a primeira ocorrência, ficando assim:

    empresa.
    At.: contato
    E-mail: email
    Tel.: (11) 1111-1111
    
    
    
    @CLIENTENOME.
    At.: @CONTATONOME
    E-mail: @CONTATOEMAIL
    Tel.: @CONTATOTEL
    
    
    
    @CLIENTENOME.
    At.: @CONTATONOME
    E-mail: @CONTATOEMAIL
    Tel.: @CONTATOTEL
    
    
    

    Se eu clicar no botão novamente ai vai dar erro pq o arquivo continua aberto... eu queria é clicar apenas uma vez e ele varresse o documento todo... não sei se falta um do while ate o fim do doc etc

    quarta-feira, 14 de janeiro de 2015 12:34
  • Mais a depender de onde você carrega os dados pode fazer um foreach ou while, veja minha Thread na postagem anterior para tentar eliminar o erro
    quarta-feira, 14 de janeiro de 2015 13:10
  • Aqui fiz de um outro jeito aqui e acho que deu certo... parece que tem um método pra isso... o wdReplaceAll

        Private Sub subDados(header As String, data As String)
    
            With objWord.Selection.Find
                .ClearFormatting()
                .Text = header
                .Replacement.ClearFormatting()
                .Replacement.Text = data
                .Execute(Replace:=Word.WdReplace.wdReplaceAll)
    
            End With
         
    
        End Sub

    • Marcado como Resposta Leonardo Mundim quarta-feira, 14 de janeiro de 2015 15:42
    quarta-feira, 14 de janeiro de 2015 13:18