使用VBScript或VBA操作Microsoft Word中的内容

时间:2016-11-07 13:44:15

标签: vba vbscript ms-word

我已经就如何使用Excel开发VBScript和VBA应用程序提供了大量建议,但现在我遇到了一个新的挑战:为Word开发VBScript / VBA应用程序。

我知道,在Excel中,如果我想在单元格B3中键入"my name",我会输入:

Range("B3").Value = "my name"

我需要能够找到输入正式信函的姓名和地址的位置,以及今天的日期和我的姓名首字母。

我以为我可以像在Excel上那样在互联网上找到Word的VBScript / VBA编程,但似乎使用Word并不是很受欢迎。如果有人有任何片段让我开始,或者是一个非常好的链接到互联网上我可以自己编码的网站,我们将不胜感激。

更新

以下是我目前正在处理的代码:

Public Sub WordVbaDemo()
  Dim doc As Document: Set doc = ActiveDocument ' Or any other document
  DateText = doc.Range(doc.Paragraphs(1).Range.End - 20, doc.Paragraphs(1).Range.End - 18).Text
End Sub`

我需要使用代码来处理正确的日期是正确的正式信函:

                                                               Date: November 7th, 2016

我上面的代码将在"日期:"之后复制日期文本。原始模板没有预先填写的日期。如果我输入一个,会员:"字段看起来像这样偏移:

                                                               Date: November 7th, 2016
                                                   Member:

我正在寻找一种方法来输入文字而不会破坏对齐。

更新2

我忘了提到它必须作为外部脚本工作。这意味着,如果我要打开NotePad并创建一个可以填写Word文档中的字母的脚本,那么它应该如何工作。我为此道歉...超越自我,忘记了细节。

更新3

我使用从我用来查找任何打开的Internet Explorer窗口的代码派生的以下代码。我知道IE和Word是两个不同的东西,但我希望我可以使用Shell找到Word文档并能够操作内容。

Dim WinDoc, Window, TitleFound
Dim WShell, objShell

Function Check_Document()
    On Error Resume Next
        Set WShell = CreateObject("WScript.Shell")
        Set objShell = CreateObject("Shell.Application")
    On Error GoTo 0

    Window = "non-member template.docx" 'Tried this without the .docx and failed

    TitleFound = False

    For Each WinDoc In objShell.Windows()
        If Err.Number = 0 Then
             If InStr(WinDoc.Document.Title, (Window)) Then
                Set objWord = WinDoc
                TitleFound = True
                Exit For
             End If
          End If
    Next

    If TitleFound = False Then
        MsgBox "Word doc not found"
    Else
        MsgBox "Found Word doc!!"
    End If

End Function

3 个答案:

答案 0 :(得分:2)

大约6个月前我在一艘类似的船上。我在Excel中完成了VBA,但被要求在Word中做更多。关于Word VBA的事情是,与Excel文档相比,自动化Word文档的理由要少得多。根据我的收集,大多数情况涉及创建法律文件。

我已经走了很长一段路,而且我确实有很多标记为网站的网站,我会为你深入研究......但这个是在Word中使用VBA的快速入门。 http://word.mvps.org/faqs/MacrosVBA/VBABasicsIn15Mins.htm

但是有一个指针:考虑文档布局是否结构化。(在你的问题中我不清楚)。如果布局将是结构化的,您可以准确地知道所有内容的去向,您可能希望使用书签。否则,您可以考虑z32a7ul指示的段落方法。

我的项目使用UserForms作为输入。这有时是一个真正的挑战,但通过使用带有书签的Userforms,我能够允许用户在userForms中来回导航以及重新运行宏(假设他们没有删除所需的书签)。

当然,因为我还在学习,所以要花一点时间。对于它的价值,我还有一个额外的挑战,即在Mac平台上完成所有工作。

答案 1 :(得分:1)

作为一个起点:

Public Sub WordVbaDemo()
    Dim doc As Document: Set doc = ActiveDocument ' Or any other document
    ' doc.Paragraphs(2).Range.Text = "Error if the document is empty (there is no second paragraph)."
    doc.Paragraphs(1).Range.Text = "First paragraph overwritten." & vbCrLf
    doc.Paragraphs(2).Range.Text = "Now I can write to Paragraph 2." & vbCrLf
    doc.Paragraphs.Add(doc.Paragraphs(2).Range).Range.Text = "Inserted between Paragraph 1 and 2." & vbCrLf
    doc.Range(doc.Paragraphs(3).Range.End - 3, doc.Paragraphs(3).Range.End - 2).Font.StrikeThrough = True
    doc.Range(doc.Paragraphs(3).Range.End - 2, doc.Paragraphs(3).Range.End - 2).Text = 3
    doc.Range(doc.Paragraphs(3).Range.End - 3, doc.Paragraphs(3).Range.End - 2).Font.StrikeThrough = False
    With doc.Tables.Add(doc.Range(doc.Range.End - 1), 2, 2)
        .Cell(1, 1).Range.Text = "Header1"
        .Cell(1, 2).Range.Text = "Header2"
        .Cell(2, 1).Range.Text = "Value1"
        .Cell(2, 2).Range.Text = "Value2"
        Dim varBorder As Variant: For Each varBorder In Array(wdBorderTop, wdBorderBottom, wdBorderLeft, wdBorderRight, wdBorderVertical, wdBorderHorizontal)
            .Borders(varBorder).LineStyle = wdLineStyleSingle
        Next varBorder
        .Rows(1).Shading.BackgroundPatternColor = RGB(123, 45, 67)
        .Rows(1).Range.Font.Color = wdColorLime
    End With
End Sub

答案 2 :(得分:1)

首先,我要感谢所有回复的人。您帮我指导了我的解决方案。下面是我提出的代码,用于确定输入正式信函的名称和地址的位置,以及今天的日期,以及我作为签名的首字母。

Function Check_Document()
    On Error Resume Next
        Set objWord = CreateObject("Word.Application")
    On Error GoTo 0

    objWord.Visible = True
    Set objDoc = objWord.Documents.Open("C:\Users\lpeder6\Desktop\myDoc.docx")

    Set objRange = objDoc.Bookmarks("TodaysDate").Range
    objRange.Text = "November 11th, 2016"
    Set objRange = objDoc.Bookmarks("Name").Range
    objRange.Text = "John Smith"
    Set objRange = objDoc.Bookmarks("Address").Range
    objRange.Text = "123 N. Anywhere Ave."
    Set objRange = objDoc.Bookmarks("City").Range
    objRange.Text = "Northwoods" & ", "
    Set objRange = objDoc.Bookmarks("State").Range
    objRange.Text = "MN"
    Set objRange = objDoc.Bookmarks("Zip").Range
    objRange.Text = "55555"
    Set objRange = objDoc.Bookmarks("Init").Range
    objRange.Text = "JS"
End Function

书签在文档中预设,因此代码可以查找。这些字段中的任何内容都会被objRange.Text替换。如果这是外部编码,变量可用于存储信息,变量将包含发送数据的参数的数据。

我希望这段代码可以帮助我,帮助我。再次感谢所有向我提供想法的人。