首页 > 解决方案 > 在word中选择和格式化粘贴的文章

问题描述

我有很多场合必须从网页复制文章,粘贴到word并以某种方式格式化。我有这个代码来自动粘贴和格式化。但是,它只能工作一次,并且以后不会更改粘贴文章的字体。

Sub Macro1()

    Dim artic As Word.Range
    Set artic = Selection.Range
         'keep bold word bold and avoid paragraphs to cluster into one 
    artic.PasteAndFormat (wdFormatOriginalFormatting)
         'paste and select pasted article
    artic.Select
    artic.Font.Name = "Calibri"
    artic.Font.Size = 10.5
    artic.Font.Italic = False
    artic.ParagraphFormat.Alignment = wdAlignParagraphLeft

End Sub

标签: vbams-word

解决方案


如果您在 处设置断点,artic.Font.Name = "Calibri"以便代码在artic.Select您看到该Paste方法不包含已粘贴的内容后停止。一般artic会在粘贴内容的开头。

这意味着代码需要能够定位粘贴之前选择的位置之后的位置。它还取决于粘贴是否出现在文档的末尾。

以下示例代码在我的测试中对我有用。它使用两个Ranges:一个用于粘贴内容的位置,另一个用于粘贴后的结束位置。

(回应对 Word 对象模型的更多说明):将Range对象想象为一个选择,不同之处在于可以有多个 Range 对象,但只有一个 Selection。操作 aRange时,考虑使用键盘缩小或扩展它通常会有所帮助。按向左或向右箭头键会将选择“折叠”到插入点;按住 Shift 并按下这些键将扩大/缩小选择;在单击文档中的其他位置时按住 Shift 也会这样做。考虑设置Range.StartRange.End作为最后一个的等价物。范围的起点或终点被任意设置到文档中的另一个位置。

在 Range 下面代码中的第一个情况下,IfRange 被缩小/折叠到它的起点(想想左箭头键),然后向右移动一个字符(想想右箭头键)。这使它超出了新材料的粘贴位置,因此将粘贴点的末端延伸到此范围的起点将拾取两者之间的所有内容。

Sub TestPasteAndSelect()
    Dim artic As Word.Range, rng As Word.Range
    Dim bNotAtEnd As Boolean

    Set artic = Selection.Range
    Set rng = artic.Duplicate
    rng.End = ActiveDocument.content.End
    If rng.Characters.Count > 1 Then
        'selection is not at end of document
        rng.Collapse wdCollapseStart
        rng.MoveStart wdCharacter, 1
        bNotAtEnd = True
    End If
         'keep bold word bold and avoid paragraphs to cluster into one
    artic.PasteAndFormat (wdFormatOriginalFormatting)
         'paste and select pasted article

    'artic.Select
    'rng.Select
    If bNotAtEnd Then
        artic.End = rng.Start
    Else
        Set artic = rng.Duplicate
    End If
    artic.Font.Name = "Calibri"
    artic.Font.Size = 10.5
    artic.Font.Italic = False
    artic.ParagraphFormat.Alignment = wdAlignParagraphLeft
End Sub

推荐阅读