我试图实现非常简单的事情。要选择项目符号列表中的项目,请运行宏并随机地对这些项目进行洗牌。我从未在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
我的问题是:添加段落的流程是什么?如何删除段落?
答案 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