【问题标题】:VBA output contents of Array to Word documentVBA将Array的内容输出到Word文档
【发布时间】:2016-09-25 18:04:36
【问题描述】:

所以我需要做的是使用 InputBox 填充一个数组,然后在一个数组中,按字母顺序对其进行排序,然后将其输出到当前的 word 文档。我几乎完成了它,问题是它只是将最后一个单词输出到文档中。我猜我的循环是错误的,但我找不到 VBA 文档来执行此操作以挽救我的生命。谢谢

Option Explicit

这是声明数组的主子

Sub Main()

Dim ListArr() As String

ListArr = Get_Input_List()

Call Bubble_Sort_Ascending(ListArr)

Call Output_List_To_Document(ListArr)

End Sub

获取输入并填充数组的函数

Function Get_Input_List() As String()

Dim list As String

list = InputBox("Please enter words to sort separated with a comma and no spaces", "Words")
Get_Input_List = Split(list, ",")

End Function

按字母顺序对数组进行排序

Sub Bubble_Sort_Ascending(listNewArray() As String)

Dim SrtTemp As Variant
Dim inputWord As Variant
Dim i As Long
Dim j As Long

'Alphabetize Sheet Names in Array List
For i = LBound(listNewArray) To UBound(listNewArray)
     For j = i To UBound(listNewArray)
         If listNewArray(i) > listNewArray(j) Then
             SrtTemp = listNewArray(j)
             listNewArray(j) = listNewArray(i)
             listNewArray(i) = SrtTemp
         End If
     Next j
 Next i


End Sub

这是问题所在,我无法将整个数组输出到 word 文档。我找到了大量关于如何在 Excel 电子表格中执行此操作的文档,但几乎没有任何文字。

Sub Output_List_To_Document(newListArray() As String)

Dim inputWord As Variant
Dim i As Long
Dim j As Long

For i = LBound(newListArray) To UBound(newListArray)
     For j = i To UBound(newListArray)
        For Each inputWord In newListArray
            ActiveDocument.Range = inputWord & vbCrLf
        Next
    Next j
Next i

End Sub

【问题讨论】:

  • Output_List_To_Document 有三个嵌套循环。这是故意的吗?你内心的For Each 应该足够了。另外,可以考虑使用Join函数,以vbCrLf为分隔符构建一个完整的字符串,然后就可以一次性追加整个数组了。

标签: arrays vba ms-word


【解决方案1】:

您每次循环都会覆盖ActiveDocument.Range。如果要追加到它的末尾,则需要将范围折叠到它的结束位置:

Sub Output_List_To_Document(newListArray() As String)
    Dim inputWord As Variant
    Dim i As Long
    Dim j As Long

    Dim insertPos As Range
    Set insertPos = ActiveDocument.Range

    For i = LBound(newListArray) To UBound(newListArray)
         For j = i To UBound(newListArray)
            For Each inputWord In newListArray
                insertPos.Collapse wdCollapseEnd
                insertPos = inputWord & vbCrLf
            Next
        Next j
    Next i
End Sub

注意 - 不清楚为什么要使用 3 个嵌套循环遍历数组。如果您只需要每个单词写一次,我怀疑您真的在寻找更像这样的东西:

Sub Output_List_To_Document(newListArray() As String)
    Dim insertPos As Range
    Set insertPos = ActiveDocument.Range

    Dim inputWord As Variant
    For Each inputWord In newListArray
        insertPos.Collapse wdCollapseEnd 'Value 0, Can ignore writing it as well
        insertPos = inputWord & vbCrLf
    Next
End Sub

【讨论】:

    最近更新 更多