修改宏,将DOS文档的行内脚注转换为MS Word页面底部的脚注



我需要帮助将1980年代DOS文字处理器文档转换为Microsoft word 2016文档。DOS文字处理程序Final word使用文本中的特殊字符组合来格式化文本。

Word打开这些文档。文本作为文本读取,格式字符被翻译为扩展的Ascii字符,如下所示:

历史研究仍然以一种与社会学研究截然不同的逻辑进行和判断。相反,研究历史的社会学家与历史学家有着截然不同的方法论取向。ÀÆÏÏÔûVictoria E.班尼特,《理论的应用》。"历史社会学的概念与比较",ÀÉûComparative社会与历史研究。ý, ÀÂû22ý, 1980.ý。除了更有意识地关注量化之外,就历史社会科学家的观点而言,今天所写的历史与50年前所写的历史似乎没有什么不同。

例如,斜体文本包含在扩展的Ascii字符串ÀÉû和ý之间,而斜体文本使用字符ÀÂû和ý。脚注以扩展的Ascii字符串ÀÆÏÏÔû开始,以前面加句点(.)的字符ý结束。

我写了下面的VBA宏,它将扩展的Ascii字符串封装在行内脚注中转换为页面底部的Word脚注:

子FinalWordFootnotes ()'' FinalWordFootnotes宏

Selection.Find.ClearFormatting

With Selection.Find
.Text = "ÀÆÏÏÔû*.ý"  '<---In-line footnote enclosed in extended Ascii character stings
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = True

While Selection.Find.Execute

ActiveDocument.Footnotes.Add Range:=Selection.Range, Text:=Selection.Text

Wend
End With
End Sub

(注意:正在搜索的文本是扩展的Ascii字符串ÀÆÏÏÔû和..之间的任何文本。ý例如:ÀÆÏÏÔûVictoria E.贝内特的《理论的应用》。"历史社会学的概念与比较",ÀÉûComparative社会与历史研究。ý, ÀÂû22ý, 1980.ý.)

不幸的是,这个宏在文本中留下了Ascii封装的脚注。它创建的页面底部脚注还包括扩展的Ascii字符串。

因此,我需要修改我的宏,使它也:

  1. 在页面脚注的Word底部创建内联脚注,不包含扩展的Ascii字符串。
  2. 一旦创建了行内脚注,删除用于创建它的行内/文本脚注,包括其扩展的Ascii字符。

当我在大约二十年前用Excel VBA编程时,我基本上已经忘记了它,而且我从来没有写过Word VBA宏。那么,对于我如何在这方面修改我的宏的任何建议和建议,我将不胜感激。

关于如何在运行此宏之前使用阿拉伯数字自动格式化我的文档到页面脚注底部的建议也将受到赞赏。目前,我正在使用Word参考-插入脚注菜单创建一个脚注,然后再运行宏。

提前感谢您的帮助、建议和建议。

我能感受到你的痛苦。这实际上是一项相当棘手的任务,因为原始文档使用'ý'作为任何格式/脚注运行的闭包。这意味着对整个脚注的通配符搜索不能确定找到的'ý'是脚注的闭包还是其他格式。因此,我认为您必须先处理格式部分,然后再将格式化的文本剪切并粘贴到脚注中。

下面的代码应该可以帮助您。你可能有"脚注文本"风格的问题,所以你可能需要额外的代码来减少字体大小等。我将把它作为op的练习。

Option Explicit
Sub ttest()
DoBold ActiveDocument
DoItalic ActiveDocument
DoFootnotes ActiveDocument

End Sub

Public Sub DoItalic(ByVal ipDoc As Word.Document)
With ipDoc.StoryRanges(wdMainTextStory)

With .Find

.ClearFormatting
.Text = "(ÀÉû)(*)(.)(ý)"  ' THis gives founf fields of 1,2,3,4 (ÀÉû)(*)(.)(ý)
.Forward = True
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = True

.Replacement.ClearFormatting
.Replacement.Font.Italic = True
.Replacement.Text = "23"
.Wrap = wdFindContinue ' for a formatting change we can process every ocurrent automatically

.Execute Replace:=wdReplaceAll

End With

End With
End Sub
Public Sub DoBold(ByVal ipDoc As Word.Document)
With ipDoc.StoryRanges(wdMainTextStory)

With .Find

.ClearFormatting
.Text = "(ÀÂû)(*)(ý)"
.Forward = True
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = True

.Replacement.ClearFormatting
.Replacement.Font.Bold = True
.Replacement.Text = "2"
.Wrap = wdFindContinue

.Execute Replace:=wdReplaceAll

End With

End With
End Sub
Public Sub DoFootnotes(ByVal ipDoc As Word.Document)
With ipDoc.StoryRanges(wdMainTextStory)

With .Find

.ClearFormatting
.Text = "(ÀÆÏÏÔû)(*)(.)(ý)"  ' THis gives found fields of 1,2,3,4 (ÀÉû)(*)(.)(ý)
.Forward = True
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = True

.Replacement.ClearFormatting
.Replacement.Text = "23"
.Wrap = wdFindContinue ' for a formatting change we can process every ocurrent automatically

End With

' The conditions for the find have been set up. No need to repeat the above
' do repeat single instance find until we have dealt with all instances

Do While .Find.Execute(Replace:=wdReplaceOne)  ' the replace removes the extended asci
' Capture the formatted text
.Cut

' Create a new footnote and paste formatted text
.Footnotes.Add(Range:=.Duplicate).Range.PasteAndFormat wdFormatOriginalFormatting

Loop

End With

End Sub

最新更新