2

私は VBscript を使用する初心者であり、エラー コード -2147467259 ("-2147467259: このファイルは別のアプリケーションまたは別のユーザーによって使用されています") が常に表示される理由がわかりません (エラー メッセージがはドイツ語です)。VBscript を使用して MS Word 2007 のシリアル レターから PDF ファイルを生成しようとしています。.docx ファイルから生成する PDF ファイルは 28.000 以上あります。たぶん、この大きな数がスクリプトが失敗する理由かもしれませんが、そうは思いません;)。

私が使用している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」の後に実行するスリープ メソッドを実装しました。最初は効果があるように見えましたが、3 回実行した後は、決定するのにわずかな改善しかありません...

アイデアはありますか?

(私の英語が理解できないほど悪くなかったといいのですが...)

4

2 に答える 2

1

タスクを次のように分割します。

  1. 27.000 の .doc(x) 文字を生成します (フォールバック: たとえば 1.000 のバッチで実行します。Word でそれができない場合は、ゲイツ氏に対して有効な主張をすることになります)
  2. 27.000 の .doc(x) 文字を .pdf に変換 (フォールバック: Word の代わりに専用ツールを使用)

これらのサブタスクのコードは、既存のループから派生させることができます (複雑さを軽減します)。追加の条件 - ターゲット ファイルが存在する場合は処理しない - は難しくありません。バッチで作業する場合、各ステップの後に少なくとも一部が完了しています。

于 2013-07-17T14:49:44.547 に答える
1

スクリプトにこれらの問題があった理由を突き止めました。「ActiveWindows」の終了を妨げたのはウイルス対策スキャナーでした。エラーはそれに応じて不規則に発生したため、これは理にかなっています。これで、スクリプトは 28.000 文字すべてを処理できるようになりました。

それでおしまい!

于 2013-07-22T05:54:09.257 に答える