在此先感谢您提供给我的任何帮助.
我正在尝试创建一个VB应用程序,它将打开现有的Word文档,进行一些更改并使用新文件名保存它.对文档进行更改很容易.保存文档似乎应该同样容易,但有一个严重的问题.当我尝试保存文档时,将打开另存为对话框.这应该是自动化的,因此不起作用.我尝试了一大堆变体:
Sub Main()
Dim oWord As Word.Application
Dim oDoc As Word.Document
Dim fileName As String
Dim templateName As String
Dim newFileName As String
'Start Word and open the document template.
oWord = CreateObject("Word.Application")
oWord.Visible = False
oWord.DisplayAlerts = Word.WdAlertLevel.wdAlertsNone
templateName = "C:\tmp\template.dotx"
fileName = "C:\tmp\document.docx"
newFileName = "C:\tmp\new document.docx"
oDoc = oWord.Documents.Add(templateName)
'oDoc = oWord.Documents.Open(fileName) I have tried both using a template and opening a docx file.
<make changes>
oDoc.SaveAs2(newFileName)
oWord.Documents.Close(Word.WdSaveOptions.wdDoNotSaveChanges)
oWord.Application.Quit()
oWord = Nothing
End Sub
它总是停在这里:
oDoc.SaveAs2
并打开另存为对话框.我需要找到一种方法来抑制另存为对话框或编辑word文件的新方法.到目前为止我发现的关于该问题的所有内容要么没有得到解决/更新,要么与Word插件有关.我没有任何人说过引起问题的插件.为了安全起见,我禁用了所有单词插件.
如果有人解决它或采用不同的方法,我将不胜感激.我并不是坚持使用VB的想法.我走这条路的唯一原因是因为我认为它为我提供了编辑图表和格式化文档的最佳库.
谢谢,史蒂夫
最佳答案 我发现了这个问题.答案在于我在对文档进行更改的部分中所做的工作.这些更改的一部分是更新文档中的图表中的数据.我有类似的东西:
For Each oShape As Word.InlineShape In oDoc.InlineShapes
If oShape.HasChart And oShape.Range.Bookmarks.Item(1).Name = "ChartName" Then
Console.WriteLine("Updating ChartName")
Dim oWorkbook As Excel.Workbook
oWorkbook = oShape.Chart.ChartData.Workbook
oWorkbook.Worksheets(1).Range("B2").FormulaR1C1 = "9"
oWorkbook.Worksheets(1).Range("B3").FormulaR1C1 = "5"
oWorkbook.Worksheets(1).Range("B4").FormulaR1C1 = "1"
oWorkbook.Application.Quit()
End If
Next
我改成了:
For Each oShape As Word.InlineShape In oDoc.InlineShapes
If oShape.HasChart And oShape.Range.Bookmarks.Item(1).Name = "ChartName" Then
Console.WriteLine("Updating ChartName")
Dim oWorkbook As Excel.Workbook
oWorkbook = oShape.Chart.ChartData.Workbook
oWorkbook.Worksheets(1).Range("B2").FormulaR1C1 = "9"
oWorkbook.Worksheets(1).Range("B3").FormulaR1C1 = "5"
oWorkbook.Worksheets(1).Range("B4").FormulaR1C1 = "1"
oShape.Chart.Refresh()
oWorkbook.Close(True)
End If
Next
现在它有效