微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决修改宏将 DOS 文档内嵌脚注转换为 MS Word 页面底部脚注

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

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

历史研究仍在进行,并以与社会学截然不同的逻辑进行判断。相反,研究历史的社会学家的方法论取向与历史学家截然不同。ÀÆÏÏÔûVictoria E. Bennett,“理论的使用。历史社会学中的概念和比较”,ÀÉûComparative Studies in Society and History.ý,Àû22ý,1980。除了更自觉地关注量化之外,就历史社会科学家的观点而言,今天所写的历史与五十年前所写的历史似乎没有什么不同。 >

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

我编写了以下 VBA 宏,将包含在行内脚注中的扩展 Ascii 字符串转换页面底部 Word 脚注:

Sub 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. Bennett,“The Uses of Theory. Concepts and Comparison in历史社会学”,ÀÉû社会和历史的比较研究。ý,Àû22ý,1980.ý。)

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

相应地,我需要修改我的宏,以便它也:

  1. 在没有扩展的 Ascii 字符串的情况下创建 Word 页面底部脚注的内嵌脚注。
  2. 创建内嵌脚注后,删除用于创建它的内嵌/文本内脚注,包括其扩展的 Ascii 字符。

大约二十年前,虽然我在 Excel VBA 中进行了大量编程,但我基本上已经忘记了它,而且我从未编写过 Word VBA 宏。 那么,对于我如何在这方面修改我的宏的任何建议和建议,我将不胜感激。

关于如何在运行此宏之前使用阿拉伯数字自动将文档格式化为页面底部脚注的建议也将不胜感激。目前我正在通过使用 Word References 创建脚注来做到这一点– 在运行宏之前插入脚注菜单

我预先感谢您提供的所有帮助、建议和建议。

解决方法

我感觉到你的痛苦。这实际上是一项非常棘手的任务,因为原始文档使用 'ý' 作为任何格式/脚注运行的闭包的方式。这意味着对整个脚注的通配符搜索无法确定找到的 'ý' 是脚注的闭包还是其他格式。因此,我认为您必须在将格式化文本剪切并粘贴到脚注之前处理格式化部分。

下面的代码应该可以帮助您。您可能会遇到“脚注文本”样式的问题,因此您可能需要额外的代码来减小字体大小等。我会将其留作 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 = "\2\3"
            .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,\4 (ÀÉû)(*)(.)(ý)
            .Forward = True
            .Format = False
            .MatchCase = False
            .MatchWholeWord = False
            .MatchAllWordForms = False
            .MatchSoundsLike = False
            .MatchWildcards = True
            
            .Replacement.ClearFormatting
            .Replacement.Text = "\2\3"
            .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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。