Bonjour tout le monde,

Dans un dossier, j'ai 100 documents word à mettre à jour. Ces 100 documents commençent tous par un certain code (ex. B0124)

Sur un fichier excel, j'ai un tableau dont les valeurs changent en fonction du code qu'on entre dans une cellule spécifique.

Je dois, pour chacun des 100 codes, mettre à jour le tableau, copier ce tableau, ouvrir le fichier word correspondant , et coller le tableau à un endroit spécifique dans le document word (entre deux bookmarks..).

Cette opération est à répéter 100 fois (pour chacun des 100 rapports). Le code a pour but d'automatiser ce procédé.

Mon code fonctionne très bien. Le seul problème est que la macro buge systématiquement au bout du 8ème rapport qu'elle traite (un débug sur une ligne de code qui passe très bien avant..).

La solution passagère que j'avais à cela était d'ouvrir le gestionnaire des taches et de fermer le processus Word à chaque bug.
Ensuite je relance la macro et cela fonctionne.

Au début je croyais que le problème était lié au fait que le presse papier accumulait des données au fur et à mesure que la macro tournait, et que celui-ci devait être vidé. J'ai donc intégré, à la fin de la boucle, un code pour vider le presse papier.

Résultat: la macro buge toujours après le 8ème rapport, mais l'erreur est différente, au lieu de me faire un débug sur une ligne de code, j'ai une fenêtre windows qui s'ouvre me disant que les ressources d'Excel ne permettent pas de continuer.

Maintenant, je suis à cours d'idées pour que la macro puisse tourner d'une seule traite sur les 100 rapports.
Je suis étonné que les ressources de mon ordi soient limitées, car j'ai un 2.8 GHZ avec 1 GB de RAM, et le disque dur a encore 80% d'espace libre.

Merci de votre aide précieuse, j'apprécierai toutes les pistes pour parvenir à éviter ce bug. Je ne sais pas si c'est la manière dont j'ai écrit le code qui peut être allegée, où s'il y a une astuce que je ne connais pas.

Mon code est le suivant:

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
Sub Automation()
 
Dim wdApp As Word.Application, wdDoc As Word.Document
 
For N = 1 To 100
 
Application.GoTo Reference:="Reference"
 
ActiveCell.Offset(N, 0).Copy 
 
Application.GoTo Reference:="CodeHotelValo"
 
ActiveCell.Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Application.CutCopyMode = False
 
Application.GoTo Reference:="Reference"
 
ActiveCell.Offset(N, -1).Copy 
 
Sheets("Liste Automation").Select
 
Range("E3").Select    
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
 
Application.CutCopyMode = False
 
On Error Resume Next
Set wdApp = GetObject(, "Word.Application")
If Err.Number <> 0 Then 
Set wdApp = CreateObject("Word.Application")
End If
On Error GoTo 0
wdApp.Visible = False
 
NomFichier = Sheets("Liste Automation").Range("E3").Value
 
Set wdDoc = wdApp.Documents.Open("C:\Documents and Settings\436992\Desktop\MACRO TEST\" & NomFichier)
 
Sheets("Reporting Valuation Table").Range("A1:P70").Copy
 
wdDoc.Range(ActiveDocument.Bookmarks("BM3").Range.Start, wdDoc.Bookmarks("BM4").Range.End).PasteSpecial DataType:=wdPasteBitmap
 
Sheets("Reporting P&L Table").Range("B4:R27").Copy
 
wdDoc.Range(ActiveDocument.Bookmarks("BM1").Range.Start, wdDoc.Bookmarks("BM2").Range.End).PasteSpecial DataType:=wdPasteBitmap
 
'Vider le presse papier
Application.Run _
        "'BETA VERSION NVLLE MACRO.xls'!ccc"
 
wdDoc.Save
wdDoc.Close
 
Next N
 
End Sub
Sur la feuille "liste automation" se trouvent tous les nom de fichiers word à mettre à jour, de la ligne 1 à 100.

Ce fichiers sont du format NOMDECODE - TEXTETEXTE.doc, où NOMDECODE est par exemple B0125.

Pour votre info, le code suivant est la macro "ccc" que j'appelle en fin de boucle pour vider le presse papier windows:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Option Explicit
Public Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
Public Declare Function EmptyClipboard Lib "user32" () As Long
Public Declare Function CloseClipboard Lib "user32" () As Long
 
Public Function ClearClipboard()
    OpenClipboard (0&)
    EmptyClipboard
    CloseClipboard
End Function
 
Sub ccc()
    Call ClearClipboard
End Sub