我已经就如何使用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
答案 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
替换。如果这是外部编码,变量可用于存储信息,变量将包含发送数据的参数的数据。
我希望这段代码可以帮助我,帮助我。再次感谢所有向我提供想法的人。