VBA Word избегать разрыва строки при вставке текста - PullRequest
0 голосов
/ 12 марта 2019

У меня есть следующий код, который отлично работает с одним исключением. Строка «MM.Content.InsertAfter Total» вставляет текст, но также вставляет разрывы строк (например, между «topic» и «[»), что мне не нужно. Как я могу помешать Word сделать это?

Sub Schleife_VAR()
    Dim Dok As Word.Document
    Set Dok = ThisDocument
    Dim Tabelle As Table
    Dim Cell As Range
    Dim counter As Integer
    Dim i As Integer
    Dim Number As Integer

    Dim MM As Word.Document
    Set MM = Documents.Open("C:\Users)

    For Each Tabelle In Dok.Tables
        Number = Dok.Range(0, Tabelle.Range.End).Tables.Count

        counter = Dok.Tables(Number).Rows.Count
        For i = 1 To counter
            Dim j As Integer

            If InStr(1, Tabelle.Cell(i, 1).Range.Text, "TOPIC") Then
                    Dim Topic As String
                    Topic = Tabelle.Cell(i, 2).Range
            ElseIf InStr(1, Tabelle.Cell(i, 1).Range.Text, "VAR") Then
                    Dim Total As String
                    Total = Topic & " " & "[" + Tabelle.Cell(i, 2).Range & "]"

                    MM.Content.InsertAfter Total
            ElseIf InStr(1, Tabelle.Cell(i, 1).Range.Text, "FILTER") Then
                    MM.Content.Paragraphs.Last.Range.Style = MM.Styles("Filter")

                    MM.Content.InsertAfter "Filter: " & Tabelle.Cell(i, 2).Range    
            ElseIf InStr(1, Tabelle.Cell(i, 1).Range.Text, "QUESTION") Then
                  MM.Content.Paragraphs.Last.Range.Style = MM.Styles("Question")

                  MM.Content.InsertAfter Tabelle.Cell(i, 2).Range
            End If
            MM.Content.Paragraphs.Last.Range.Style = MM.Styles("Remark")
        Next
    Next

    Selection.Range.Case = wdTitleSentence

End Sub

Ответы [ 2 ]

0 голосов
/ 13 марта 2019

Довольно многие из используемых переменных не объявлены в коде в вопросе.Это делает постановку проблем такой неопределенной.

При условии, что они должны содержать данные String, а не Word.Range, тогда проблема возникает из Tabelle.Cell(i, 2).Range Содержимое всей ячейки включает символы конца ячейки ANSI 13 и ANSI 7;ANSI 13 является знаком абзаца - это создает новую строку.Я использую функцию для обрезки содержимого ячейки, которую можно использовать следующим образом.

(Примечание. При запросе строкового содержимого диапазона в Word лучше использовать Range.Text, а не просто Range. VBAочень простителен и использует свойства по умолчанию для объектов (например, Text для диапазона), но иногда он может ошибаться, например, когда переменная явно не определена как String.)

 Topic = TrimCellText(Tabelle.Cell(i, 2).Range.Text)

Function TrimCellText(r As word.Range) As String
    Dim sLastChar As String
    Dim sCellText As String

    sCellText = r.Text
    sLastChar = Right(sCellText, 1)
    Do While sLastChar = Chr(7) Or sLastChar = Chr(13)
        sCellText = Left(sCellText, Len(sCellText) - 1)
        sLastChar = Right(sCellText, 1)
    Loop
    TrimCellText = sCellText
End Function
0 голосов
/ 13 марта 2019

Прежде чем жаловаться, вам следует ознакомиться с правилами размещения сообщений на этом форуме.

Взглянув на код выше, вы последовательно добавляете текст в конец документа, указанного в MM, поскольку ссылаетесь на свойство Content.,По этой причине применяется следующий абзац.

Однако, если диапазон заканчивается знаком абзаца, который также является концом документа, Microsoft Word вставляет текст перед конечным знаком абзаца, а несоздание нового абзаца в конце документа.

Так что я чувствую вашу боль.Когда я пытаюсь вставить текст, такой как «Hello World», используя ActiveDocument.Content.InsertAfter «Hello World», он работает нормально.Таким образом, я могу только предположить, что текст, который вы получаете от Tabelle, имеет новую строку или некоторые другие невидимые символы, встроенные в начале текста ячейки.Я не могу проверить это, так как у меня нет копии вашего исходного документа.Что вы видите, когда включаете форматирование?(Нажмите на обратную букву «P» на вкладке абзаца и найдите текст ячейки, начинающийся с первой строки в ячейке, без явных символов «Zwielichtig» перед текстом, который вам действительно нужен.).

Ниже приведен вашкод, как я бы написал.

Опция Явная

Sub Schleife_VAR()
Dim Dok As Word.Document

Dim Tabelle As Table
Dim Cell As Range
'Dim counter As Integer
'Dim i As Integer
'Dim Number As Integer

Dim MM As Word.Document
'Dim j As Integer
Dim my_row                            As Word.Row
Dim my_cell1_text                     As String
Dim my_cell2_text                     As String
Dim Topic As String
Dim Total As String
'Set MM = Documents.Open("C:\Users) where is the rest?

    Set MM = ActiveDocument
    Set Dok = ThisDocument  ' Bad practise.  ThisDocument refers
                            ' to the Document holding the macro code.
                            ' Typically this is the Template on which the
                            ' Document is based. Your usage may be different.
    ActiveDocument.Content.InsertAfter "Hello World"
    For Each Tabelle In Dok.Tables

        'Number = Dok.Tables.Count

        'counter = Dok.Tables(Number).Rows.Count
        For Each my_row In Tabelle.Range.Rows
        'For i = 1 To counter

            my_cell1_text = my_row.Range.Cells(1).Range.Text
            my_cell2_text = my_row.Range.Cells(2).Range.Text

            Select Case my_cell1_text

                Case "TOPIC"
                    'If InStr(1, Tabelle.Cell(i, 1).Range.Text, "TOPIC") Then
                    ' Topic = Tabelle.Cell(i, 2).Range
                    Topic = my_cell2_text

                Case "VAR"
                    ' ElseIf InStr(1, Tabelle.Cell(i, 1).Range.Text, "VAR") Then
                    ' Total = Topic & " " & "[" + Tabelle.Cell(i, 2).Range & "]"
                    Total = Topic & " [" & my_cell2_text & "]"
                    MM.Content.InsertAfter Total

                Case "Filter"
                    ' ElseIf InStr(1, Tabelle.Cell(i, 1).Range.Text, "FILTER") Then
                    ' MM.Content.Paragraphs.Last.Range.Style = MM.Styles("Filter")
                    ' MM.Content.InsertAfter "Filter: " & Tabelle.Cell(i, 2).Range
                    MM.Content.InsertAfter "Filter: " & my_cell2_text
                    MM.Content.Paragraphs.Last.Range.Style = MM.Styles("Filter")


                Case "QUESTION"
                    ' ElseIf InStr(1, Tabelle.Cell(i, 1).Range.Text, "QUESTION") Then
                    ' MM.Content.Paragraphs.Last.Range.Style = MM.Styles("Question")
                    ' MM.Content.InsertAfter Tabelle.Cell(i, 2).Range
                    MM.Content.InsertAfter my_cell2_text
                    MM.Content.Paragraphs.Last.Range.Style = MM.Styles("Question")

                Case Else

                    ' Do nothing ?

            End Select

            MM.Content.Paragraphs.Last.Range.Style = MM.Styles("Remark")

        Next

    Next

' There is no selection made in this method so I don't know to what the next line is referring.
Selection.Range.Case = wdTitleSentence
End Sub

Ниже приведена функция, которая удаляет любые хитрые символы из строки.Я использую его для санации имен файлов.

Public Function Sanitise(ByVal this_string As String) As String

    Dim my_regex               As VBScript_RegExp_55.RegExp

    Set my_regex = New VBScript_RegExp_55.RegExp
    my_regex.Global = True
    my_regex.MultiLine = True
    my_regex.Pattern = "[^\\\w:\.]"

    Sanitise = my_regex.Replace(this_string, vbNullString)

End Function

Что вы можете использовать, чтобы сделать

my_cell2_text= Sanitise(my_row.Range.Cells(2).Range.Text)

, чтобы посмотреть, излечит ли это вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...