2

我是使用 VBscript 的新手,我不明白为什么我总是得到错误代码 -2147467259(“-2147467259:此文件正在被另一个应用程序或另一个用户使用”)(这是我自己的翻译,因为错误消息是德语)。我正在尝试通过 VBscript 从 MS Word 2007 中的序列号生成 PDF 文件。.docx 文件可生成超过 28.000 个 PDF 文件。也许这个巨大的数字可能是脚本失败的原因,但我不希望如此;)。

这是我正在使用的 VB 代码:

Sub PDFErstellung()
    Dim sBrief As String
    Dim sVertreterVerzeichnis As String
    Dim sAusgabepfad As String
    Dim iAnzahl As Integer
    Dim sKundenName As String
    Dim sError As String
    Dim iModulo As Integer

    Application.Visible = False
    sAusgabepfad = "C:\temp\"

    On Error GoTo Fehler

    With ActiveDocument.MailMerge
        .DataSource.ActiveRecord = wdLastRecord
        iAnzahl = .DataSource.ActiveRecord
        .DataSource.ActiveRecord = wdFirstRecord
        Do
            .Destination = wdSendToNewDocument
            .SuppressBlankLines = True
            With .DataSource
                .FirstRecord = .ActiveRecord
                .LastRecord = .ActiveRecord
                sVertreterVerzeichnis = sAusgabepfad & .DataFields("VertreterNr").Value
                If Not IsDiskFolder(sVertreterVerzeichnis) Then
                    MkDir sVertreterVerzeichnis
                End If
                sKundenName = CleanFilename(Left(.DataFields("KundenName").Value, 20), "")
                sBrief = sVertreterVerzeichnis & "\" & .DataFields("VertreterNr").Value & "_" & _
                            .DataFields("KundenNr").Value & "_" & sKundenName & ".pdf"
            End With
            .Execute Pause:=False
            ActiveDocument.ExportAsFixedFormat OutputFileName:=sBrief _
                , ExportFormat:=wdExportFormatPDF, OpenAfterExport:=False, OptimizeFor:= _
                wdExportOptimizeForPrint, Range:=wdExportAllDocument, From:=1, To:=1, _
                Item:=wdExportDocumentContent, IncludeDocProps:=True, KeepIRM:=True, _
                CreateBookmarks:=wdExportCreateNoBookmarks, DocStructureTags:=True, _
                BitmapMissingFonts:=True, UseISO19005_1:=False            

            If InStr(1, ActiveWindow.Caption, "Serien") = 1 Then
                ActiveWindow.Close False
            End If

            If .DataSource.ActiveRecord < iAnzahl Then
                .DataSource.ActiveRecord = wdNextRecord
            Else
                Exit Do
            End If
        Loop
    End With
    Application.Quit savechanges:=wdDoNotSaveChanges     
End Sub

我无法理解的是,脚本在不同时间中止,创建的 PDF 文件数量不同。有时它在 ~800 个文件后停止,有时在 ~7.000 个文件后停止,依此类推。感觉一次都没有用过!请注意,我正在尝试生成 28.000 个文件。

此外,我不得不说 Word 正在使用从数据库导出的 .csv 文件 (7 MB)。

有什么我可以做的吗?

我注意到,如果我关闭“ActiveWindow”,我可以创建比不关闭此窗口更多的 PDF 文件。如果不关闭,生成的 PDF 文件数量有限(我必须再次测试它,因为我不记得这个数字 - 大约 2.000?!)。

在最后一次尝试中,我实现了一个在“ActiveWindow.Close False”之后执行的睡眠方法。第一次似乎有帮助,但经过三遍后,确定只有一点点改善......

有人有想法吗?

(我希望我的英语不要太差,因为那个人听不懂……)

4

2 回答 2

1

我找到了脚本出现这些问题的原因:是防病毒扫描程序阻止了“ActiveWindows”的关闭。这是有道理的,因为错误相应地发生不规则。现在脚本可以处理所有 28.000 个字母!

而已!

于 2013-07-22T05:54:09.257 回答
1

我会将任务拆分为:

  1. 生成 27.000 个 .doc(x) 字母(后备:分批执行,例如 1.000 个;如果 Word 不能这样做,您将对盖茨先生提出有效的索赔)
  2. 将 27.000 个 .doc(x) 字母转换为 .pdf(后备:使用专用工具而不是 Word)

这些子任务的代码可以从您现有的循环中派生(使其不那么复杂);附加条件 - 如果目标文件存在则不要处理 - 不应该太难。如果您分批工作,则在每个步骤之后至少完成一部分。

于 2013-07-17T14:49:44.547 回答