【问题标题】:Manipulating content in Microsoft Word with VBScript or VBA使用 VBScript 或 VBA 在 Microsoft Word 中处理内容
【发布时间】:2016-11-07 13:44:14
【问题描述】:

我来这里是为了获得有关如何使用 Excel 开发 VBScript 和 VBA 应用程序的大量建议,但现在我面临着一个新挑战:为 Word 开发 VBScript/VBA 应用程序。

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

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

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

我想我可以像在 Excel 中一样在 Internet 上找到 Word 的 VBScript/VBA 编程,但似乎使用 Word 并没有那么流行。如果任何人有任何 sn-ps 让我开始,或者一个非常好的链接到互联网上的一个网站,我可以自己进行编码,将不胜感激。

更新

这是我目前正在使用的代码:

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

我忘了提到这必须作为外部脚本工作。这意味着,如果我要打开记事本并创建一个脚本来填写 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

【问题讨论】:

  • 也许在单词的搜索功能中使用了通配符/奇怪的正则表达式?
  • 我不确定如何使用正则表达式来查找我需要输入数据的位置,然后确保它不会偏移对齐。虽然,我确实看到了如何使用正则表达式替换并用所需的文本替换空格。你是这个意思吗?

标签: vba vbscript ms-word


【解决方案1】:

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

我已经走了很长一段路,我确实有许多网站已添加书签,我会为您进一步挖掘。但这个网站是在 Word 中使用 VBA 的快速入门。 http://word.mvps.org/faqs/MacrosVBA/VBABasicsIn15Mins.htm

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

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

当然,因为我还在学习,所以对此持保留态度。对于它的价值,我还面临着让这一切都在 Mac 平台上运行的额外挑战。

【讨论】:

  • 这听起来像是一条我可能需要走下去的大道。是的,布局是固定的或结构化的。如果有一种方法可以在 Word 文档中切换坐标(类似于 Excel 电子表格中的单元格),那么我可以更有效地设置我的代码。
  • 不幸的是,既然您已经指定它需要是一个外部脚本,VBA 就出来了。在这种情况下,我不确定您的最佳解决方案。
  • 嗯,不完全是。如果我能在 VBA 中找到一些好的示例,如果我在那里找不到任何东西,我会非常擅长将它们转换为 VBScript。
【解决方案2】:

作为起点:

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

【讨论】:

  • 感谢 z32a7ul。我已经搞砸了 4 个小时的代码,我想出的是我原始代码的“更新”中显示的内容。我需要使用在 Word 中创建的模板,其中文本的位置是固定的,我需要输入的文本也将在固定的位置。
  • 据我了解你在更新部分的问题,也许你覆盖了下一段中的段落符号或标签,尝试修改 End-20 和 End-18 参数(如果你不想要覆盖任何东西,只在之后插入,那么这些数字应该是相同的)。
  • 如果是外部脚本,不如在 VBA 编辑器中编写,然后用后期绑定替换所有早期绑定,将其复制到文本文件,它应该可以工作。
  • 我试图理解数学在做什么。我在您的示例中看到您有 End-3、End-3,然后下一行有 End-2、End-3,然后又回到 End-3、End-3。我所知道的,我所做的,数学副本“2016 年 11 月 7 日”。至于它是怎么做到的,我不知道。我还在学习。如果我知道如何防止覆盖下一段中的段落符号或制表符,那可能会解决我的问题。
  • Range 有两个参数:开始和结束,提供 End-20 和 End-18(这里的 End 是 Range 的一个属性而不是参数)表示从最后一个前 20 个字符到最后一个前 18 个字符必须替换为您在引号内写的任何内容。如果要从头数,可以写Begin+x。
【解决方案3】:

首先,我要感谢所有回复的人。你帮助指导我找到我的解决方案。下面是我想出的代码,用于查找输入正式信件的姓名和地址的位置,以及今天的日期,以及我作为签名的首字母。

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。如果这是外部编码,则变量可用于存储信息,并且变量将包含来自发送数据的参数的数据。

我希望这段代码能像它帮助我一样帮助其他人。再次感谢所有为我提供想法的人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-08
    • 1970-01-01
    • 1970-01-01
    • 2012-04-03
    • 2017-12-27
    • 1970-01-01
    • 2020-10-15
    • 1970-01-01
    相关资源
    最近更新 更多