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:
Sur la feuille "liste automation" se trouvent tous les nom de fichiers word à mettre à jour, de la ligne 1 à 100.
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
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
Partager