2013-07-17 3 views
2

Je suis un débutant dans l'utilisation et VBscript Je ne comprends pas pourquoi je reçois toujours le code d'erreur -2147467259 (« -2147467259: Ce fichier est utilisé par une autre application ou un autre utilisateur ») (Ceci est ma propre traduction car le message d'erreur est en allemand). J'essaie de générer des fichiers PDF à partir d'une lettre de série dans MS Word 2007 via VBScript. Il y a plus de 28.000 fichiers PDF à générer à partir du fichier .docx. Peut-être que cela pourrait être que ce grand nombre pourrait être la raison pour laquelle le script échoue mais je ne l'espère pas;).Erreur d'exécution -2147467259 au cours PDF génération

Voici le code VB J'utilise:

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 

La chose que je peux » comprendre est que le script avorte à des moments différents avec différents nombres de fichiers PDF créés. Parfois, il s'arrête après ~ 800 fichiers, parfois après ~ 7.000 et ainsi de suite. On ne sent pas que ça a marché une fois! Attention, j'essaie de générer 28.000 fichiers.

De plus, je dois dire que la Parole utilise un fichier .csv (7 Mo) exportée à partir d'une base de données.

Y at-il quelque chose que je peux faire?

J'ai remarqué que si je ferme la « ActiveWindow » Je suis capable de créer beaucoup plus fichier PDF que sans fermer cette fenêtre. Sans fermeture, il y a un nombre limité de fichiers PDF générés (je dois le tester à nouveau car je ne me souviens plus de ce nombre - quelque chose comme 2.000 ?!). Lors de la dernière tentative, j'ai implémenté une méthode de sommeil que j'ai exécutée après 'ActiveWindow.Fermez Faux'. A la première fois, il a semblé aider, mais au bout de trois fois il n'y a que peu d'amélioration pour déterminer ...

Demandez à quelqu'un une idée?

(J'espère que mon anglais était pas trop mal que que l'on ne peut pas le comprendre ...)

Répondre

1

Je trouve la raison pour laquelle le script avait ces problèmes: le scanner était anti-virus qui a empêché la fermeture des « ActiveWindows ». Cela a du sens puisque l'erreur s'est produite en conséquence irrégulière. Maintenant, le script peut gérer toutes les 28.000 lettres!

C'est tout!

1

Je partagerait la tâche en:

  1. générer 27.000 .doc (x) lettres (fallback: faire en lots de dire 1.000, si Word ne peut pas faire cela, vous aurez une réclamation valide contre M. Gates)
  2. convertir 27.000 .doc (x) lettres .pdf (fallback: utiliser outil spécialisé au lieu de Word)

Le code de ces sous-tâches peut être dérivé de votre boucle existante (ce qui la rend moins complexe); la condition supplémentaire - ne pas traiter si le fichier cible existe - ne devrait pas être trop difficile. Si vous travaillez par lots, vous avez au moins une partie après chaque étape.

+0

C'est aussi entre-temps ma pensée. Mais quelqu'un peut-il deviner quel peut être le problème? Est-ce juste Word qui ne peut pas gérer la macro (j'ai oublié de dire que ce script ci-dessus est une macro - je pense que ce n'est pas grave) avec cette masse de données? Cependant, je pense que Word devrait déjà être conçu pour traiter au moins 1000 à 2000 lettres. Même cela ne rend pas le programme même partiellement. J'ai donc pensé à un problème dans mon script ... – Patrick