2014-09-23 44 views
-1

我想在MS Word 2010中编号列表中的项目洗牌。这个问题的背景是,我的妻子是一位英语老师,她使用Word进行测试。每当她进行测试时,她还会通过更改编号列表中项目的顺序来制作第二个版本。Word 2010 BA洗牌编号列表

我期待之一:

  • 变化编号列表中的项目,我选择使用鼠标,即顺序选择编号列表,按下一个按钮/快捷方式,并将列表洗牌 或
  • 更改测试中所有编号列表的顺序,即宏查找新编号列表的开头,选择列表中的所有项目,更改项目顺序,然后移至下一个编号列表。

所有列表在使用代码后应保持相同的格式(即起始编号)。

我尝试了第一个实例,但没有成功确定我选择的开始和结束行号。

例子:

原文:

=====开始:======

问题1回答什么是正确的?

  1. 回答
  2. 应答b
  3. 答案C

问题2回答什么是正确的?

  1. 答案d
  2. 回答Ë
  3. 回答˚F

问题3回答什么是正确的?

  1. 回答ģ
  2. 回答ħ
  3. 回答Ĵ

======结束========

宏应该创建这样的:

======开始========

问题1什么答案是正确的?

  1. 答案C
  2. 回答
  3. 应答b

问题2回答什么是正确的?

  1. 回答˚F
  2. 回答Ë
  3. 答案d

问题3回答什么是正确的?

  1. 解答^ h
  2. 回答Ĵ
  3. 答摹

====结束======

+0

''我正在寻找一个宏“'我会推荐一个自由职业者的网站,你可以支付给公平的市场价格的人。 SO是**不是**代码写入服务。 '给我一个c0dez'永远不是话题。另外;请告诉我们您已经尝试了什么,相关代码以及您遇到的具体**问题。阅读[如何创建一个最小,完整和可验证的示例](http://stackoverflow.com/help/mcve)并查看[help center](http://stackoverflow.com/help)在这。然后[编辑](http://stackoverflow.com/posts/25989326/edit)你的问题,并提供所有必要的细节。 – RossC 2014-09-23 08:37:43

回答

0

因为你面对的只有3个列表项,它很容易。只需交换这两个项目中的任何一个。下面的代码也是一样的。

对于超过3个项目,您可能需要重复交换更多行的逻辑。但是你应该从这段代码中得到关于如何去解决它的基本想法。

Sub Shuffle() 
    Dim li As List, rng As Range, random As Integer 

    Randomize 
    For Each li In ThisDocument.Lists 
     ' get either 1 or 2. We will swap this with the 3rd item 
     random = CInt(Rnd + 1) 

     ' add a new paragraph as temporary place holder. This is so that we can keep the paragraph with its formatting intact. 
     Set rng = li.Range.Paragraphs.Add.Range 
     rng.FormattedText = li.Range.Paragraphs(random).Range.FormattedText 

     ' swap the items 
     li.Range.Paragraphs(random).Range.FormattedText = li.Range.Paragraphs(3).Range.FormattedText 
     li.Range.Paragraphs(3).Range.FormattedText = rng.FormattedText 

     ' remove the temporary paragraph we added 
     li.Range.Paragraphs.Last.Range.Delete 
    Next 
End Sub 
+1

嗨Pradeep,非常感谢这段代码。它的作用像一个魅力,除了每个任务不知道的项目数量是未知的。我在你的代码中使用了li.CountNumberedItems来解决这个问题。 – 2014-09-24 09:00:57

0

我稍微普拉迪普库马尔修改了代码,这就像一个魅力,即使有数目不详的每编号列表,以便它可以在normal.dot模板被纳入项目:

Sub Shuffle() 

Dim li As List, rng As Range, random As Integer, nbr As Integer 
Application.ScreenUpdating = False 
Randomize 
For Each li In ActiveDocument.Lists 
    nbr = li.CountNumberedItems 
    ' Run along all items in list and swap with a random one from the same list 
    For a_counter = 1 To nbr 
     ' Make sure the item is not swapped with itself, that would fail  
     again: 
      random = CInt((nbr - 1) * Rnd + 1) 
     If random = a_counter Then GoTo again 

     ' add a new paragraph as temporary place holder. This is so that we can keep the paragraph with its formatting intact. 
     Set rng = li.Range.Paragraphs.Add.Range 
     rng.FormattedText = li.Range.Paragraphs(random).Range.FormattedText 

     ' swap the items 
     li.Range.Paragraphs(random).Range.FormattedText = li.Range.Paragraphs(a_counter).Range.FormattedText 
     li.Range.Paragraphs(a_counter).Range.FormattedText = li.Range.Paragraphs(nbr + 1).Range.FormattedText 

     ' remove the temporary paragraph we added 
     li.Range.Paragraphs(nbr + 1).Range.Delete 
    Next a_counter 
Next 
Application.ScreenUpdating = True 
End Sub