Word: substitua as quebras de linha automáticas por retornos de carro

0

Eu tenho um problema bastante incomum. Eu tenho um arquivo do MS Word (criado pelo Adobe Acrobat, original era um PDF)) que contém várias caixas de texto. O conteúdo dessas caixas de texto precisa ser analisado para que eu possa importá-lo em um banco de dados. O texto no documento PDF é formatado em duas colunas. Infelizmente, a conversão de arquivos no Adobe Acrobat não insere um retorno de carro após cada linha. Como resultado, quando o DOCX é salvo como um arquivo de texto, o texto fica confuso. A conversão de arquivos no Word, a opção "adicionar linha termina", não funciona para caixas de texto ou quadros de texto. Transformar todas as caixas de texto no texto do parágrafo também atrapalha o texto. Na minha opinião, é a melhor maneira de resolver isso uma macro vba que reconhece cada final de linha automática em qualquer caixa de texto no documento e insere um retorno de carro. No entanto, tentei fazer isso com o marcador predefinido "\ line", mas isso também não parece funcionar nas caixas de texto. Continuo recebendo um erro "O objeto é removido", o que não ocorre se apenas o texto do parágrafo for selecionado (não em uma caixa de texto).

Sub ChangeAutoLineBreaks()
Dim r As Word.Range

Set r = Selection.Range

Selection.Collapse direction:=wdCollapseStart
Do Until Selection.End > r.End
  Selection.Bookmarks("\Line").Select
  If Right(Selection, 1) = " " Then
      Selection.SetRange Selection.End - 1, Selection.End
      Selection.Delete
      Selection.Text = vbCr
      Selection.Bookmarks("\Line").Select
      Selection.Collapse direction:=wdCollapseStart
  End If
  Selection.MoveDown wdLine, 1, False
Loop

' reselect our original selection
r.Select
Set r = Nothing
End Sub

Já experimentei outras ferramentas de migração de arquivos (pdf > docx ou pdf > txt), mas obtive o melhor resultado se a conversão do arquivo for feita usando o MS Word como um bypass.

Alguém tem alguma dica de como fazer isso funcionar no Word?

Screenshot descrevendo o problema

Link para o documento docx

Thx!

Peter

    
por Art 11.01.2017 / 00:42

2 respostas

0

Thx Máté, não trouxe a solução, mas me ajudou na direção certa. Na verdade, e por ser complicado, foi uma análise simples do comportamento das seleções quando a tarefa foi executada manualmente. Sua solução assumiu que havia apenas um final de linha automático dentro de um parágrafo, mas havia parágrafos usando mais de duas linhas. Foi assim que resolvi isso.

    Dim aShape As Shape
Dim aParagraph As Paragraph

On Error Resume Next
Application.ScreenUpdating = False

For Each aShape In ActiveDocument.Shapes
    If aShape.Type = msoTextBox Then
        For Each aParagraph In aShape.TextFrame.TextRange.Paragraphs
            aParagraph.Range.Select
            Selection.Collapse direction:=wdCollapseStart
            Selection.HomeKey Unit:=wdLine
            Selection.EndKey Unit:=wdLine
            Do Until Asc(Selection.Text) = 13
                Selection.InsertAfter vbCrLf
                Selection.MoveDown wdLine, 1
                Selection.EndKey Unit:=wdLine
            Loop
        Next
    End If
Next aShape

Application.ScreenUpdating = True
    
por 12.01.2017 / 23:56
0

O Word não tem um objeto para marcar as extremidades da linha nos parágrafos, por isso é realmente uma tarefa complicada.

Como solução alternativa, você pode:

  • coloque a seleção no início de cada parágrafo
  • mova uma linha (como pressionar a seta para baixo)
  • recuar um caractere e verificar se é um quebra de parágrafo
    • se não, adicione-o

Abaixo exemplo de código faz este processo para um parágrafo, só precisa percorrer todos os parágrafos em suas caixas de texto (eu testei, funciona com caixas de texto também).

    Selection.Paragraphs(1).Range.Select
    Selection.Collapse wdCollapseStart
    Selection.MoveDown wdLine, 1
    Selection.MoveLeft wdCharacter, 1, True
    If Asc(Selection.Text) <> 13 Then
        Selection.InsertAfter Chr(13)
    End If
    
por 11.01.2017 / 12:59