在选择中随机播放子弹项目

时间:2018-06-03 14:38:52

标签: vba ms-word word-vba

我试图实现非常简单的事情。要选择项目符号列表中的项目,请运行宏并随机地对这些项目进行洗牌。我从未在MS-Word中使用过VBA,所以我从非常小的步骤开始,但即使是那些似乎很难遵循。我的策略是一次插入一个项目。每个新添加的段落的文本将是选择中随机选择的项目的文本。当添加的段落数等于所选项目数时,我开始删除选择中的原始项目。

这是我的初稿。它并没有完全复制我的策略,但我需要有关基础的答案才能继续。

Sub test()
Dim pars As Paragraphs
Dim rng As Range

' The selection is items from a bullet list (4 items).
Set pars = Selection.Paragraphs

' I have to do that if I don't want to overwrite the last element, though it is never filled later.. why?
pars.Add

' Simulate some shuffling here..
pars.Add.Range.FormattedText = pars(2).Range.FormattedText
pars.Add.Range.FormattedText = pars(1).Range.FormattedText
pars.Add.Range.FormattedText = pars(3).Range.FormattedText
pars.Add.Range.FormattedText = pars(4).Range.FormattedText

' The total number of paragraphs should be 8..
MsgBox pars.Count

' Now remove the top 4 paragraphs to keep just the last ones I added..
For i = 1 To 4
    pars(1).Range.Delete
Next i

' I should get a message with 4 in it, instead I'm getting 1.. why??
MsgBox pars.Count

End Sub

我的问题是:添加段落的流程是什么?如何删除段落?

1 个答案:

答案 0 :(得分:1)

您对使用Range对象的直觉很好,即使您的代码实际上并未使用它。而不是使用Selection.Paragraphs设置Selection.Range到范围 - 范围将包含段落。这是原作,您稍后会删除。

声明第二个Range作为新段落的目标,使用Range.Duplicate属性制作原始Range的“副本”。 “崩溃”到它的终点。这样,当您添加段落时,它们将“粘贴”到原始范围的末尾。

善于Range.FormattedText用于“复制”这些段落。同样,在每次添加后折叠目标Range,以避免替换在循环的上一次迭代中添加的内容。

最后,删除原始范围。

Sub ShuffleBullets1()
    Dim pars As word.Paragraphs
    Dim rngNewPars As word.Range
    Dim rngOldPars As word.Range
    Dim i As Long

    Set rngOldPars = Selection.Range
    Set rngNewPars = rngOldPars.Duplicate
    rngNewPars.Collapse wdCollapseEnd
    Set pars = rngOldPars.Paragraphs
    For i = pars.Count To 1 Step -1
        rngNewPars.FormattedText = pars(i).Range.FormattedText
        rngNewPars.Collapse wdCollapseEnd
    Next
    rngOldPars.Delete
End Sub