【问题标题】:refresh word document刷新word文档
【发布时间】:2020-07-27 02:07:51
【问题描述】:

我有一个 VBA 脚本,我在网上找到了将多个 Word datasets 保存为 PDF 格式的 "Serienbrief"(我认为它在英语中称为bulkletter)。 word文档由各种Mergefields以及多个Excel条形图组成,仍然连接到对应的Excel文件。

问题:

当我将datasets 保存为pdf 时,mergefields 会随着dataset 的变化而变化。

但是,图表始终具有第一个 dataset 的值。我可以通过在更改 dataset 后手动刷新 Word 文档来将图表更新为正确的值,但我需要自动化该过程。

我在寻找什么:

我需要扩展下面的脚本,它会在每次保存新的pdf(基本上是cntrl+A,然后是F9)之前刷新文档(因此也刷新条形图)。

我尝试过的:

我在这里Word VBA to refresh embedded Excel chart发现了一个类似的问题,但答案对我没有帮助,也是因为我不确定在脚本中的哪里实现它。

您可以在下面找到我目前使用的脚本,它工作得很好,除了缺少刷新部分。

感谢任何帮助!

Sub Serienbrief()
' set variables
Dim iBrief As Integer, sBrief As String
Dim AppShell As Object
Dim BrowseDir As Variant
Dim Path As String
' catch any errors
On Error GoTo ErrorHandling

' determine path
Set AppShell = CreateObject("Shell.Application")
Set BrowseDir = AppShell.BrowseForFolder(0, "Speicherort für Serienbriefe auswählen", 0, 16)

If BrowseDir = "Desktop" Then
Path = CreateObject("WScript.Shell").SpecialFolders("Desktop")
Else
Path = BrowseDir.items().Item().Path
End If

If Path = "" Then GoTo ErrorHandling

Path = Path & "\Serienbrief-" & Format(Now, "dd.mm.yyyy-hh.mm.ss") & "\"
MkDir Path

On Error GoTo ErrorHandling

' hide application for better performance
MsgBox "Serienbriefe werden exportiert. Dieser Vorganag kann einige Minuten dauern - Microsoft Word wird während dieser Zeit ausgeblendet", vbOKOnly + vbInformation
Application.Visible = False

' create bulkletter and export as pdf
With ActiveDocument.MailMerge
.DataSource.ActiveRecord = 1
Do
.Destination = wdSendToNewDocument
.SuppressBlankLines = True



With .DataSource
.FirstRecord = .ActiveRecord
.LastRecord = .ActiveRecord
sBrief = Path & .DataFields("IDSCHOOL").Value & ".pdf"
End With
.Execute Pause:=False
ThisDocument.InlineShapes(1).LinkFormat.BreakLink

If .DataSource.DataFields("IDSCHOOL").Value > "" Then
ActiveDocument.SaveAs FileName:=sBrief, FileFormat:=wdFormatPDF
End If
ActiveDocument.Close False

If .DataSource.ActiveRecord < .DataSource.RecordCount Then
.DataSource.ActiveRecord = wdNextRecord
Else
Exit Do
End If
Loop
End With

' error handling
ErrorHandling:
Application.Visible = True

If Err.Number = 76 Then
MsgBox "Der ausgewählte Speicherort ist ungültig", vbOKOnly + vbCritical
ElseIf Err.Number = 5852 Then
MsgBox "Das Dokument ist kein Serienbrief"
ElseIf Err.Number = 4198 Then
MsgBox "Der ausgewählte Speicherort ist ungültig", vbOKOnly + vbCritical
ElseIf Err.Number = 91 Then
MsgBox "Exportieren von Serienbriefen abgebrochen", vbOKOnly + vbExclamation
ElseIf Err.Number > 0 Then
MsgBox "Unbekannter Fehler: " & Err.Number & " - Bitte Makro erneut ausführen.", vbOKOnly + vbCritical
Else
MsgBox "Serienbriefe erfolgreich exportiert", vbOKOnly + vbInformation
End If

End Sub

【问题讨论】:

  • 可以分享一下文件吗?
  • 好的,截图就够了还是要整个文档?

标签: vba ms-word


【解决方案1】:

变化:

ThisDocument.InlineShapes(1).LinkFormat.BreakLink

到:

ActiveDocument.InlineShapes(1).LinkFormat.Update
ActiveDocument.InlineShapes(1).LinkFormat.BreakLink

【讨论】:

  • 感谢您的回答。我更改了代码,合并字段更改了,但不幸的是图表保持不变(第一个数据集的值)。 ActiveDocument.InlineShapes(1).LinkFormat.BreakLink 行是否放置在正确的行上(参见 OP)?
  • 因为该行出现在 '.Execute Pause:=False' 之后,所以是的。不过,在更基本的层面上,我在您的代码中看不到任何告诉 Word 在哪里查找图表数据的内容。简单地执行邮件合并并不能解决这个问题。
  • 我基本上采用了一个名为 ID 的 Mailmerge 字段,它是一个数据集的标识符。我将此 ID 从 Word 文档复制到 Excel 文件,然后使用 vlookup 收集图形数据并将该图形复制回 Word 文档。因此,每当我更改 word 中的数据集时,带有图形的 excel 文件都会更改数据(因为 vlookup),因此图形也会更改。所以我认为如果我在每个数据集之后集成一个刷新页面的代码,图表会自动改变。
  • 我在您发布的代码中看不到任何内容。无论如何,ThisDocument.InlineShapes(1).LinkFormat.BreakLink 会在第一条记录合并后立即断开链接,从而阻止任何进一步的更新。这就是为什么 ActiveDocument.InlineShapes(1).LinkFormat.BreakLink after 合并 - 并且 after 查找和链接已更新 - 是必需的。只是为了确保链接更新发生,最好强制它发生。请参阅修改后的答案。
猜你喜欢
  • 2014-06-08
  • 1970-01-01
  • 2012-12-07
  • 1970-01-01
  • 1970-01-01
  • 2012-02-06
  • 1970-01-01
  • 2022-08-12
  • 1970-01-01
相关资源
最近更新 更多