IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Word Discussion :

Word-VBA rate parfois des commandes [Toutes versions]


Sujet :

VBA Word

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2010
    Messages : 9
    Points : 7
    Points
    7
    Par défaut Word-VBA rate parfois des commandes
    Bonjour à tous,

    J'utilise Word au départ d'Excel pour sortir des pages de garde contenant entre autre des codes barre.

    La mise en forme de cette page n'est pas simple même si elle ne contient qu'une dizaine de paragraphe. Je dois utiliser beaucoup de commande de formatage de font (size, name, Scaling, spacing, bold, underline...).

    Si je n'imprime qu'une page à la fois tout fonctionne bien dans 99,9% du temps et je peux m'en contenter.

    Le problème devient plus épineux si j'enchaîne de grande quantité de création de pages. Au bout d'un moment, la page que je construis n'est plus formaté convenablement, le texte reste en taille 96, celle du code barre, comme si les commandes remettant le texte en taille 10 étaient ignorés. Et donc ce qui devrait être une seule feuille s'étale sur plusieurs pages.

    Hier, j'ai voulu sortir 500 pages!
    Pour ne pas bourrer l'imprimante, je travaille avec deux instances de word, je construis les pages une par une et je les ajoute à un fichier devant au final comprendre les 500 pages.
    Le problème est qu'après une quarantaine de pages le système qui jusque là fonctionnait bien se dérégle, comme expliqué plus haut.

    J'ai essayer de freiner l'exécution en introduisant des "sleep" à divers endroits du code mais cela n'a pas eu d'effet. J'ai aussi pensé au "DoEvents" mais je ne pense pas qu'il serve dans ce genre de situation.

    J'ai finalement résolu le problème en interrompant manuellement mon code VBA toutes les 20-30 pages, et en le relançant quelques secondes après. J'ai fini par avoir un fichier final correct, mais quel boulot! Parfois ayant raté l'interruption, j'ai bien dû supprimer des pages erronés dans le fichier final, modifier mes paramètres de boucle et recommencer le traitement à partir de là.

    Cet outil est destiné à être utilisé quotidiennement mais je ne peux décemment pas le donner en l'état à un utilisateur lambda en lui expliquant comment interrompre le code et le relancer!

    Désolé pour cette longue explication mais ce n'est un problème facile à expliquer vu qu'il n'est pas systèmatique.

    Quelqu'un a-t-il une idée pour m'aider à m'en sortir? Comment dire à Word de prendre son temps?

    D'avance, merci.

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2010
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Bonjour à tous,

    Je vois que mon problème n'inspire personne.
    Je comprends bien qu'un comportement informatique difficile à reproduire n'est pas facile à solutionner.
    Si j'exécute mon code en pas à pas tout fonctionne bien. Ce n'est qu'avec l'accumulation des exécutions qu'apparaît le déréglement des formatages.

    Je pense que le problème apparait dans la partie en gras.

    Pour essayer de vous aider à me fournir une réponse voici mon code un peu allégé (j'ai supprimé les paragraphes de 3 à 7 ainsi que leur formatage):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    Public Function ImpressionCodeBarre() As String
    ' Procédure qui crée le document Word contenant le code barre dans wDoc puis l'ajoute au document AllVif qui est un document définit globalement
    Dim Wapp as word.application
    Dim wDoc As Word.Document
    
    'en vrai j'ouvre wApp et wDoc une seule fois, j'ai mis les commandes de création pour la cohérence du code
    On Error Resume Next
    Set Wapp = New Word.Application
    Wapp.Visible = True
    Set wDoc = Wapp.Documents.Add         'Crée un document de travail
    With wDoc
       .Activate
       .Font.Name = "Arial"
       .Font.Size = 12
    End With
    
    With wDoc.Content
       ' ***** Remplissage du document *****
       .Delete 'Vide tous ce qui pourrait géner.
       .InsertAfter ThisWorkbook.Worksheets("BarCode").Cells(1, 1)  'Code barre (para1)
       .InsertParagraphAfter
       .InsertAfter ThisWorkbook.Worksheets("BarCode").Cells(2, 1)  'Texte sous le code barre (para2)
       .InsertParagraphAfter
       .InsertAfter ThisWorkbook.Worksheets("BarCode").Cells(8, 1)  'Matricule encodeur (para7)
       .InsertParagraphAfter
       .InsertAfter "##BCS##" & Space(60) & ThisWorkbook.Sheets("BarCode").Cells(9, 1)  'Code barre ACC (para8)
       .InsertParagraphAfter
       .InsertAfter " " & ThisWorkbook.Worksheets("BarCode").Cells(10, 1) 'texte ACC (para9)
       Wapp.Selection.HomeKey
    
       ' ***** Formatage des différentes lignes *****
       With .Paragraphs(1).Range  ' Formatage code barre du haut
          .ParagraphFormat.SpaceBefore = 0
          .ParagraphFormat.Alignment = wdAlignParagraphCenter
          .Font.Size = 96
          .Font.Scaling = 38
          .Font.Name = "Free 3 of 9"
          .Select
       End With
       With Wapp.Selection
          .MoveStart unit:=wdLine, Count:=1
          .MoveLeft unit:=wdCharacter, Count:=1, Extend:=wdExtend
          .Font.Size = 10
          .Font.Scaling = 100
          .Font.Name = "Arial" 'Le <Enter> final du § ne doit pas être en code barre
       End With
       
       With .Paragraphs(2).Range  ' Formatage ligne sous le code barre
          .ParagraphFormat.SpaceBefore = 0
          .ParagraphFormat.LeftIndent = CentimetersToPoints(2)
          .ParagraphFormat.Alignment = wdAlignParagraphCenter
          .Font.Size = 10
          .Font.Spacing = 10
       End With
       With Wapp.Selection
          .WholeStory
          .Find.Execute findText:="##BCS##" 'Dans le paragraphe 8!
          Sleep 100
          .Font.Size = 18
          .Font.Bold = True
          .Font.Position = 21
          .WholeStory
          .Find.Execute findText:=ThisWorkbook.Worksheets(2).Cells(9, 1) '*CSI* ou *ACC*
          Sleep 100
          .Font.Name = "Free 3 of 9"
          .Font.Size = 96
          .Font.Scaling = 38
             
          'On sélectionne le <Enter> et on le formate en Arial
          Sleep 100
          .MoveStart unit:=wdLine, Count:=1
          .MoveLeft unit:=wdCharacter, Count:=1, Extend:=wdExtend
          .Font.Size = 10
          .Font.Scaling = 100
          .Font.Name = "Arial" 'Le <Enter> final du § ne doit pas être en code barre
          .MoveDown unit:=wdParagraph, Count:=2, Extend:=wdExtend
       End With
       With .Paragraphs(9).Range ' Formatage ligne ACC sous le code barre
          .ParagraphFormat.Alignment = wdAlignParagraphCenter
          .Font.Size = 10
          .Font.Spacing = 20
       End With
    End With
    
    'Ajout de la page ainsi crée dans AllVif qui reprend tous les codes barres déjà créés.
    With AllVif.Content
       .Collapse Direction:=wdCollapseEnd
       Set MyRange = wDoc.Range
       MyRange.WholeStory
       MyRange.Copy
       .Paste
       .Collapse Direction:=wdCollapseEnd
       .InsertBreak Type:=wdPageBreak
       .Collapse Direction:=wdCollapseEnd
    End With
    
    set wDoc=nothing
    set wApp= Nothing 'en réalité je n'ouvre qu'une fois wApp et wDoc, j'ai mis ces deux commandes pour la cohérence du code
    End Function
    Je peux bien entendu expliquer le code utilisé. Vu les suppressions faites dans le code (qui reste malgré tout touffu), il est probable qu'il ne soit plus fonctionnel en l'état.
    Mais je le donne pour voir si cela inspire quelqu'un qui aurait déjà eu un problème similaire.

    D'avance merci.

  3. #3
    Membre du Club Avatar de SCryptCypher
    Femme Profil pro
    MacGyver
    Inscrit en
    Novembre 2013
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : MacGyver

    Informations forums :
    Inscription : Novembre 2013
    Messages : 35
    Points : 64
    Points
    64
    Par défaut
    Bonjour,

    Voici une solution qui pourrait vous convenir. Il faudra cependant revoir votre façon de travailler.

    Vous générez de nombreux documents Word à la mise en page identique : je vous propose de travailler plutôt avec un Modèle Word (.dot) définissant cette mise en page.

    Créer un nouveau modèle Word. Aux endroits où vous devrez insérer le contenu de vos cellules par Macro, insérez un texte (un mot suffit). Sélectionner ce mot et insérer à cet emplacement un signet afin de pouvoir le désigner. Adapter le format (taille de caractère,...) de chaque emplacement selon vos besoins.
    Le formatage sera réglé manuellement depuis le modèle Word une fois pour toutes. En cas de modification, il suffit de modifier le modèle Word, sans devoir toucher à la Macro (à moins de nouveaux champs...).

    Du côté de Excel :
    Créer un nouveau document sur base de ce modèle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set wDoc = Wapp.Documents.Add("NomDeVotreModèle.dot") 
    Il reste à demander à Excel d'atteindre chaque signet (bookmark) et de les remplacer par le contenu d'une des cellules de votre fichier.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    wDoc.Bookmarks("NomDuSignet").Range.Text = ... (contenu de la cellule)
    Le signet (et donc le mot contenant ce dernier) sera entièrement remplacé par le contenu que vous aurez défini ici, et le format sera maintenu.

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2010
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Merci beaucoup pour votre proposition, je vais y réfléchir attentivement.

    J'ai déjà programmé des applications qui travaillent avec des bookmarks pour ajouter, dans des documents prédéfinis, des textes provenant de diverses sources. De fait, cela marche bien.

    J'utilise ma méthode dans une dizaine d'application différentes, à chaque fois que j'ai besoin d'un code-barre qui est en fait une page de garde pour séparer les dossiers en vue d'un scanning. La programmation que j'utilise pour le système des codes-barres étant bien antérieur à la programmation avec les bookmarks, je n'ai jamais pensé à changer ce qui jusque là me donnait satisfaction dans mes vieux programmes.
    L'avantage de la méthode que j'utilise actuellement est que le fichier Excel est totalement autonome.

    Ce n'est que dans le cas de production massives de pages de garde avec codes-barres que le système se prend un peu les pieds dans le tapis.
    Comme dit plus haut, je vais essayer votre proposition pour le cas qui m'occupe actuellement. Et dans un deuxième temps si cela marche mieux et que j'ai du courage, j'adapterais peut-être mes anciens programmes...

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2010
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Bonjour à tous,

    Depuis quelques jours, je fais tourner mon programme avec office 2013 et là cela se passe plutôt bien. Il lui arrive encore de se perdre en chemin mais c'est plutôt rare. J'ai déjà fait tourner une vingtaine de fichier et j'ai eu deux fois le problème mais beaucoup plus loin dans le traitement vers les pages 150-200 mais j'arrive aussi à traiter des fichiers contenant 250 pages sans problème.

    Bref cela reste un problème mystérieux et aléatoire...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 13
    Dernier message: 28/11/2006, 08h40
  2. [VBA-Excel]Récupérer des infos d'un document Word
    Par Kerweb dans le forum VBA Word
    Réponses: 5
    Dernier message: 16/10/2006, 16h27
  3. [VBA-WORD] je voudrais insérer des images automatiquement.
    Par SharkAngel dans le forum VBA Word
    Réponses: 1
    Dernier message: 21/09/2006, 11h24
  4. [VBA-E]Insérer des autotext dans Word à partir d'excel
    Par noordman dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 25/04/2006, 15h34
  5. [VBA-A]Copier des données d'Excel vers Word
    Par soad029 dans le forum VBA Word
    Réponses: 15
    Dernier message: 16/03/2006, 11h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo