2016-11-07 97 views
0

我在这里就如何使用Excel开发VBScript和VBA应用程序提供了大量的建议,但现在我已经面临一个新的挑战:开发VBScript/VBA应用程序为Word。用VBScript或VBA操作Microsoft Word中的内容

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

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

我需要能够找到其中的一封正式信函,名称和地址会输入的日期以及今天的日期,以及我的姓名缩写作为签名。

我以为我可能能够在Internet上找到用于Word的VBScript/VBA编程,就像我为Excel所做的一样,但是看起来像Word一样不受欢迎。如果任何人有任何片段让我开始,或者一个非常好的链接到互联网上的网站,我可以自己做编码,这将不胜感激。

UPDATE

这是我与目前使用的代码:

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是两个不同的东西,但我希望我可以使用壳牌找到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 
+0

也许在word的搜索功能中使用通配符/奇怪的正则表达式? – Jbjstam

+0

我不知道如何使用正则表达式来找到我需要输入数据的位置,然后确保它不会抵消对齐。虽然,我确实看到如何使用正则表达式替换并用所需的文本替换空格。这是你的意思吗? – Lou

回答

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 
+0

谢谢z32a7ul。我一直在搞乱4个小时的代码,我想到的是我的原始代码的“更新”中显示的内容。我需要使用Word中创建的模板来处理文本的位置,我需要输入的文本也将处于固定位置。 – Lou

+0

据我了解你在更新部分的问题,也许你会覆盖下一段落中的段落符号,试着修改End-20和End-18参数(如果你不想覆盖任何东西,插入后,那么这些数字应该是相同的)。 – z32a7ul

+0

如果使用外部脚本,而不是将其写入VBA编辑器,那么使用后期​​绑定替换所有早期绑定,将其复制到文本文件,并且它应该可以工作。 – z32a7ul

2

我大约6个月前在一个类似的船。我在Excel中完成了VBA,但被要求在Word中做更多。关于Word VBA的一点是,与Excel文档相比,需要自动化Word文档的原因要少得多。从我所收集的信息来看,大多数情况都涉及到创建法律文件

我已经走了很长的路,我确实有很多网站书签,我会深入挖掘你..但这是一个在Word中使用VBA的快速入门。 ​​

但是一个指针:考虑文档布局是否会被构造或者不被构造(在你的问题中我不清楚)。如果布局要结构化,在哪里你知道一切都在哪里,你可能想要使用书签。否则,您可以考虑z32a7ul指示的段落方法。

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

当然,因为我还在学习,所以请带上一点盐。对于它的价值,我也面临着在Mac平台上实现这一切的额外挑战。

+0

这听起来像我可能的大道需要下去。是的,布局是固定的或结构化的。如果有办法在Word文档中切换坐标(类似于Excel电子表格中的单元格),那么我可以更有效地设置我的代码。 – Lou

+0

不幸的是,现在你已经指定它需要成为一个外部脚本,VBA就没有了。在这种情况下,我不确定你的最佳解决方案。 –

+0

嗯,不完全是。如果我能在VBA中找到一些很好的例子,那么如果我在那里找不到任何东西的话,我很擅长将它们转换成VBScript。 – Lou

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

我希望这段代码能够帮助其他人,尽可能帮助他人。再次感谢所有向我提供让我想到这里的想法的人。