VBA:格式化 MS Word 文本

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/19959869/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-12 00:25:36  来源:igfitidea点击:

VBA: Format MS Word text

excelvbaexcel-vbams-wordword-vba

提问by user2965077

I am trying to format text of multiple words. So far, the code below will only allow me to format the font of one word. What do I need to add / delete in order to have as many words as I input be formatted?

我正在尝试格式化多个单词的文本。到目前为止,下面的代码只允许我格式化一个单词的字体。我需要添加/删除什么才能格式化输入的单词?

Cheers!

干杯!

Sub FnFindAndFormat()

    Dim objWord
    Dim objDoc
    Dim intParaCount
    Dim objParagraph
    Set objWord = CreateObject("Word.Application")
    Set objDoc = objWord.Documents.Open("C:\USERPATH")
    objWord.Visible = True
    intParaCount = objDoc.Paragraphs.Count

    Set objParagraph = objDoc.Paragraphs(1).range
    objParagraph.Find.Text = "deal"

    Do
        objParagraph.Find.Execute
        If objParagraph.Find.Found Then
            objParagraph.Font.Name = "Times New Roman"
            objParagraph.Font.Size = 20
            objParagraph.Font.Bold = True
            objParagraph.Font.Color = RGB(200, 200, 0)
        End If


    Loop While objParagraph.Find.Found

End Sub

回答by Siddharth Rout

Let's say your word document looks like this

假设您的 Word 文档如下所示

enter image description here

在此处输入图片说明

Since I am not sure whether you are doing this from Word-VBAor from some other application like say Excel-VBAso I am including both methods.

由于我不确定您是Word-VBA从其他应用程序执行此操作还是从其他应用程序执行此操作,Excel-VBA因此我将这两种方法都包括在内。

Now if you are doing this from Word-VBAthen you do not need to LateBind with it. Use this simple code.

现在,如果您Word-VBA从那时起执行此操作,则不需要使用它 LateBind。使用这个简单的代码。

Option Explicit

Sub Sample()
    Dim oDoc As Document
    Dim MyAr() As String, strToFind As String
    Dim i As Long

    '~~> This holds your search words
    strToFind = "deal,contract, sign, award"

    '~~> Create an array of text to be found
    MyAr = Split(strToFind, ",")

    '~~> Open the relevant word document
    Set oDoc = Documents.Open("C:\Sample.docx")

    '~~> Loop through the array to get the seacrh text
    For i = LBound(MyAr) To UBound(MyAr)
        With Selection.Find
            .ClearFormatting
            .Text = MyAr(i)
            .Replacement.Text = ""
            .Forward = True
            .Wrap = wdFindContinue
            .Execute

            '~~> Change the attributes
            Do Until .Found = False
                With Selection.Font
                    .Name = "Times New Roman"
                    .Size = 20
                    .Bold = True
                    .Color = RGB(200, 200, 0)
                End With
                Selection.Find.Execute
            Loop
        End With
    Next i
End Sub

However if you are doing from say Excel-VBAthen use this

但是,如果您从 sayExcel-VBA开始,请使用它

Const wdFindContinue = 1

Sub FnFindAndFormat()
    Dim objWord As Object, objDoc As Object, Rng As Object
    Dim MyAr() As String, strToFind As String
    Dim i As Long

    '~~> This holds your search words
    strToFind = "deal,contract, sign, award"

    '~~> Create an array of text to be found
    MyAr = Split(strToFind, ",")

    Set objWord = CreateObject("Word.Application")
    '~~> Open the relevant word document
    Set objDoc = objWord.Documents.Open("C:\Sample.docx")

    objWord.Visible = True

    Set Rng = objWord.Selection

    '~~> Loop through the array to get the seacrh text
    For i = LBound(MyAr) To UBound(MyAr)
        With Rng.Find
            .ClearFormatting
            .Text = MyAr(i)
            .Replacement.Text = ""
            .Forward = True
            .Wrap = wdFindContinue
            .Execute

            Set Rng = objWord.Selection

            '~~> Change the attributes
            Do Until .Found = False
                With Rng.Font
                    .Name = "Times New Roman"
                    .Size = 20
                    .Bold = True
                    .Color = RGB(200, 200, 0)
                End With
                Rng.Find.Execute
            Loop
        End With
    Next i
End Sub

OUTPUT

输出

enter image description here

在此处输入图片说明

回答by Vyachez

Works like a charm for me:

对我来说就像一个魅力:

Public Sub Find_some_text()

'setting objects
Dim objWord
Dim objDoc
Dim objSelection

Set objWord = CreateObject("Word.Application")
Set objDoc = objWord.Documents.Open("H:\Test.docx")

'set visibility
objWord.Visible = True

'set array of words to format
words_list = Array("Findme_1", "Findme_2", "etc")

'formatting text
For Each w In words_list
    Set Frange = objDoc.Range
    Frange.Find.Text = w
    Do
      Frange.Find.Execute
      If Frange.Find.Found Then
         Frange.Font.Name = "Times New Roman"
         Frange.Font.Size = 20
         Frange.Font.Bold = True
         Frange.Font.Color = RGB(200, 200, 0)
      End If
    Loop While Frange.Find.Found
Next

'de-set visibility
objWord.Visible = False

'saving (optional)
objDoc.Save

End Sub

回答by macropod

This code:

这段代码:

For Each w In words_list
    Set Frange = objDoc.Range
    Frange.Find.Text = w
    Do
      Frange.Find.Execute
      If Frange.Find.Found Then
         Frange.Font.Name = "Times New Roman"
         Frange.Font.Size = 20
         Frange.Font.Bold = True
         Frange.Font.Color = RGB(200, 200, 0)
      End If
    Loop While Frange.Find.Found
Next

is inefficient. Try:

效率低下。尝试:

With objDoc.Range.Find
  .ClearFormatting
  With .Replacement
    .ClearFormatting
    .Text = "^&"
    With .Font
      .Name = "Times New Roman"
      .Size = 20
      .Bold = True
      .Color = RGB(200, 200, 0)
    End With
  End With
  .Format = True
  .Forward = True
  .Wrap = 1 'wdFindContinue
  For Each w In words_list
    .Text = w
    .Execute Replace:=2 'wdReplaceAll
  Next
End With