【问题标题】:Shuffle Bullet Items in Selection随机播放选择中的项目符号
【发布时间】:2018-06-04 22:54:50
【问题描述】:

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

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

【问题讨论】:

  • 这里有两个网站提供了一些关于删除段落的信息:one, two

标签: vba ms-word


【解决方案1】:

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

声明第二个 Range 作为新段落的目标,使用 Range.Duplicate 属性制作原始 Range 的“副本”。 “折叠”到它的终点。这样,当您添加段落时,它们会“附加”到原始 Range 的末尾。

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

最后,删除原来的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

【讨论】:

  • 谢谢@Cindy。当我测试您的代码时,我收到错误“无法在这两个范围之间复制内容”。这发生在循环内的第一行。有什么线索吗?
  • 你选择了什么?对于我的测试,我在文档中写了四个项目符号段落并选择了它们。没有桌子或类似的东西......
  • 和我试过的一样。 4 个项目符号,我选择它们,运行宏并得到错误。我在 MS-Word 2007 和 2013 中尝试过,同样的问题。
  • 我刚刚再次测试(Word 2010),它运行没有问题。啊 - 确保选择不是文档的结尾。您需要在要随机播放的项目符号之后至少有一个段落。
  • 谢谢辛迪!当列表不是文档的结尾时,它终于起作用了! :)
猜你喜欢
  • 2014-09-09
  • 2014-03-31
  • 2018-08-11
  • 1970-01-01
  • 1970-01-01
  • 2014-04-02
  • 2021-05-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多