我有一个 Microsoft Word 文档,其中有 600 多行编号/项目符号行(即段落)。是这样的:
- 从前一个沉闷的午夜,当我思考时,虚弱而疲倦,¶
- 在许多古怪而奇特的被遗忘的传说中——¶
- 当我点点头,几乎要打瞌睡时,突然传来敲击声,¶
- 就像有人轻轻敲打——敲打我的房间门。 ¶
- “有人来访,”我喃喃自语,“敲我的房门——¶
- 只有这个,仅此而已。”¶
资料来源:Edgar Allan Poe的 The Raven ,复制自Project Gutenberg。
......或者它可能被子弹; 我可以很容易地在这两种格式之间切换。
我想将它重新格式化为一篇文章——而不是 600 行——删除数字或项目符号,并在每行(按当前格式)上附加一个脚注(以数字作为上标)。是这样的:
曾几何时,一个沉闷的午夜,当我思考时,虚弱而疲倦,1 在许多被遗忘的古怪和好奇的知识中 - 2 当我点点头,几乎打瞌睡时,突然有敲击声,3 就像有人轻轻敲击 -敲我房间的门。4 “有人来访,”我喃喃自语,“敲我的房门—— 5 只有这个,仅此而已。” 6 ¶
________________________
1
2
3
4
5
6
脚注应该是空白的,以便我稍后编写脚注文本。脚注编号可以按顺序分配,而不考虑段落上的当前编号——但您可以假设段落 按顺序正确编号,没有跳过或重复的编号,或其他特殊情况。
插入以下 VBA 例程。然后,单击文件的开头并运行例程。
请参阅如何在 MS Office 中添加 VBA? 有关如何执行此操作的一般指导。
上面的部分代码实际上是由 Microsoft Word 自动生成的。我不完全理解每一行,我怀疑其中一些可以被忽略。以下是我可以解释的一些内容:
.MatchWildcards = True
和.Text = "[!^13]^13"
。这些定义了要在文本中查找的内容。通配符模式为您提供更多功能。在通配符模式下,^13
表示段落分隔符。这通常是通过按 生成的Enter,在 Word 的“显示隐藏字符”模式下,显示为 ¶。[! character(s) ]
匹配除 和 之间的字符之一以外的任何[!
字符]
。So[!^13]
匹配段落分隔符以外的任何字符。将它们放在一起并[!^13]^13
匹配一个以普通字符开头的段落标记——换句话说,一个非空段落的结尾。.Wrap = wdFindStop
. 当您到达文档末尾时,停止(不要从头继续)。.StartingNumber = 1
. 我想这意味着创建的第一个脚注将是#1,第二个要创建的脚注将是#2,依此类推。(脚注编号不会基于现有的段落编号。)Do While True
——运行一个“无限”循环。.Find.Execute
— 找到下一个段落标记。If Not .Find.Found Then Exit Do
— 如果找不到,则跳出循环。.MoveLeft Unit:=wdCharacter, Count:=1
— 移动到段落最后一个字符的左侧。我希望这将是一个标点符号(例如.
,,!
或?
)。.Range.ListFormat.RemoveNumbers NumberType:=wdNumberParagraph
— 将段落格式化为正常格式,而不是编号或项目符号。这可能真的只对第一段是必要的,但将它留在循环中并在每次迭代时执行它并没有什么坏处。.MoveRight Unit:=wdCharacter, Count:=1
— 移动到段落最后一个字符(可能是标点符号)的右侧。.Footnotes.Add Range:=.Range, Reference:="", Text:=""
— 插入一个没有文字的脚注。.MoveRight Unit:=wdCharacter, Count:=1
— 移动到脚注编号的右侧。.TypeText Text:=" "
— 在脚注编号后加一个空格。(您可能想将其更改为两个空格。).Delete Unit:=wdCharacter, Count:=1
——删除段落标记。我在这个输入上运行了上面的代码:
得到这个结果:
注意:执行每个段落需要超过一秒的时间。对于 600 段的文档,需要十多分钟。在运行宏时,屏幕可能会冻结,并且 Word 可能会显示为“无响应”。因此,如果您打开了其他 Word 窗口,您可能想要关闭它们,或者至少保存它们。然后要有耐心。