Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 在选定项中洗牌项目符号_Vba_Ms Word - Fatal编程技术网

Vba 在选定项中洗牌项目符号

Vba 在选定项中洗牌项目符号,vba,ms-word,Vba,Ms Word,我正在努力实现一些非常简单的事情。要选择项目符号列表中的项目,请运行宏并随机洗牌这些项目。我从未在MS Word中使用VBA,所以我从非常小的步骤开始,但即使是这些步骤似乎也很难遵循。我的策略是一次插入一个项目。每个新添加的段落的文本将是从选择中随机选择的项目的文本。当添加的段落数等于选择的项目数时,我开始删除选择中的原始项目 这是我的初稿。它并没有完美地复制我的策略,但我需要关于基本问题的答案才能继续 Sub test() Dim pars As Paragraphs Dim rng As R

我正在努力实现一些非常简单的事情。要选择项目符号列表中的项目,请运行宏并随机洗牌这些项目。我从未在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

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

您使用范围对象的本能是好的,即使您的代码实际上没有使用它。将Selection.Range设置为范围,而不是使用Selection.parages-该范围将包含段落。这是原件,稍后将删除

使用Range.Duplicate属性将第二个范围声明为新段落的目标,以复制原始范围。将其折叠到终点。这样,当您添加段落时,它们将附加到原始范围的末尾

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
很好地使用Range.FormattedText复制段落。同样,在每次添加后折叠目标范围,以避免替换在循环的上一次迭代中添加的内容

最后,删除原始范围

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

这里有两个网站提供了一些关于删除段落的信息:,谢谢@Cindy。当我测试你的代码时,我得到一个错误,不能在这两个范围之间复制内容。这发生在循环内的第一行。有什么线索吗?你选了什么?在我的测试中,我在文档中写了四个项目符号段落并选择了它们。没有桌子或类似的东西…和我试过的一样。4个项目符号,我选择它们,运行宏并得到错误。我在MS Word 2007和2013中试过,同样的问题。我刚刚再次测试了Word 2010,它运行时没有问题。啊-确保选择不是文档的结尾。你需要在你想洗牌的项目符号后面至少有一段。谢谢你,辛迪!最后,当列表不是文档的结尾时,它起作用了!: