Word VBA Selection.TypeText и Selection.InsertParagraph вставка текста в неправильном порядке - PullRequest
0 голосов
/ 27 июня 2018

Я пытаюсь распечатать определенные столбцы из файла Excel с помощью функции Selection.TypeText. К сожалению, следующий код сначала печатает все результаты, а после этого все параграфы. Я хочу результат:

result (tab) result (tab) result (tab) result (tab) result (paragraph)

Порядок результатов правильный, но макрос переходит к концу данных, чтобы вставить абзац, а затем «переходит назад», чтобы заполнить дополнительные данные.

noInt и noData - две переменные, которые заранее заполнены и работают.

For i = 2 To noInt
    For k = 2 To noData
        If exWb.Sheets("Table1").Cells(k, 1) = exWb.Sheets("Table2").Cells(i, 1) Then
            For j = 5 to 9
                Selection.TypeText exWb.Sheets("Table1").Cells(k, j) & vbTab
            Next j
       Selection.InsertParagraph
       End If
    Next k
Next i

1 Ответ

0 голосов
/ 27 июня 2018

Вместо использования Selection используйте Range. Затем вы можете надежно добавить текст, используя Range.InsertAfter. Ниже приведены примеры в Word VBA; Я не могу поместить их в ваш контекст Excel, так как у меня нет всех деталей.

MCVE вашего кода (не работает)

Option Explicit
Option Base 0

' A function just to display i, k, and j in a comprehensible manner
Public Function ijk(i As Long, j As Long, k As Long)
    ijk = "[I: " & CStr(i) & "; K: " & CStr(k) & "; J: " & CStr(j) & "]"
End Function

Public Sub NotWorking()
    Dim noInt As Long
    noInt = 3

    Dim noData As Long
    noData = 4

    Dim i As Long, k As Long, j As Long

    For i = 2 To noInt
        For k = 2 To noData
            For j = 5 To 9
                Selection.TypeText ijk(i, j, k) & vbTab
            Next j
            Selection.InsertParagraph
        Next k
    Next i
End Sub

Рабочая версия

Заменить Sub NotWorking выше на это:

Public Sub Working()
    Dim noInt As Long
    noInt = 3

    Dim noData As Long
    noData = 4

    Dim i As Long, k As Long, j As Long

    ' *** Create a Range to refer to wherever the Selection is now
    Dim rDest As Range
    Set rDest = Selection.Range.Duplicate

    For i = 2 To noInt
        For k = 2 To noData
            For j = 5 To 9
                rDest.InsertAfter ijk(i, j, k) & vbTab    ' ***
            Next j
            rDest.InsertAfter Chr(13)                     ' ***
        Next k
    Next i
End Sub

Chr(13) - маркер абзаца, поэтому при его вставке создается новый абзац.

Результаты

screenshot

...