我有一个 Microsoft Word 文档,其中有 600 多行带编号/项目符号的行(即段落)。如下所示:
- 有一天,一个阴沉的午夜,我疲惫不堪地沉思着,¶
- 在许多被遗忘的古怪而又令人好奇的传说中——¶
- 正当我打瞌睡,点头的时候,突然传来一阵敲击声。¶
- 就像有人在轻轻地敲我的房门一样。¶
- “有客人来访,”我嘀咕道,“正在敲我的房门——
- 仅此而已。"¶
来源:乌鸦埃德加·爱伦·坡 (Edgar Allan Poe) 著,摘自古腾堡计划。
...或者它可以是项目符号;我可以很容易地在这两种格式之间切换。
我想将其重新格式化为一篇文章(而不是 600 行),删除数字或项目符号,并在每行后面附加一个脚注(以数字作为上标)(按照当前格式)。如下所示:
一个阴沉的午夜,我疲惫不堪,沉思着,1 翻阅着许多被遗忘的奇异而又令人好奇的传说—— 2 当我打瞌睡,几乎要睡着的时候,突然传来一阵敲门声,3 好像有人轻轻地敲着——敲着我房门。4 “有客人来访,”我喃喃自语,“敲着我房门—— 5 仅此而已。” 6 ¶
______________________________________
1
2
3
4
5
6
脚注应为空白,以便我稍后撰写脚注文本。脚注编号可以按顺序分配,而不考虑段落上的当前编号——但您可以假设段落 是按正确的顺序编号,没有跳过或重复的数字或其他特殊情况。
答案1
插入以下 VBA 例程。然后单击文件开头并运行该例程。
Sub Reformat()
With Selection
With .Find
.ClearFormatting
.MatchWildcards = True
.Text = "[!^13]^13"
.Forward = True
.Wrap = wdFindStop
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchAllWordForms = False
.MatchSoundsLike = False
End With
With .FootnoteOptions
.Location = wdBottomOfPage
.NumberingRule = wdRestartContinuous
.StartingNumber = 1
.NumberStyle = wdNoteNumberStyleArabic
.LayoutColumns = 0
End With
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
Loop
End With
End Sub
看如何在 MS Office 中添加 VBA? 以获得关于如何做到这一点的一般指导。
上述代码的一部分实际上是由 Microsoft Word 自动生成的。我并不完全理解每一行,我怀疑其中有些可以省略。以下是我可以解释的几行:
.MatchWildcards = True
和.Text = "[!^13]^13"
。这些定义了在文本中查找的内容。通配符模式为您提供了更多功能。在通配符模式下,^13
表示段落分隔符。这通常通过按 生成Enter,在 Word 的“显示隐藏字符”模式下,显示为 ¶。[! character(s) ]
[!
匹配除 和之间的任何字符之外的任何字符]
。因此[!^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 窗口,您可能需要关闭它们,或者至少保存它们。然后耐心等待。