首页 > 解决方案 > Word VBA Selection.TypeText 和 Selection.InsertParagraph 以错误的顺序插入文本

问题描述

我正在尝试使用该Selection.TypeText功能从 Excel 文件中打印某些列。不幸的是,下面的代码首先打印所有结果,然后打印所有段落。我想要结果:

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

标签: vbaexcelloopsms-wordselection

解决方案


而不是使用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)是一个段落标记,因此插入它会创建一个新段落。

结果

截屏


推荐阅读