Voici mon problème: j'ai créé deux macros dans Excel 2010, une qui va exporter dans des fichiers Word les commentaires du classeur Excel ouvert, une autre qui les réimporte par la suite. Les deux macros fonctionnent très bien quand je les appelle depuis la fenêtre Macros, ou encore directement dans VBE.
Là où ça casse, c'est depuis qu'il m'a pris l'idée extravagante de créer un onglet personnalisé, et des boutons personnalisés, le tout dans un complément Excel. Avec Custom UI Editor, pas de problème, j'ai pu faire tout ça sans souci, et j'ai bien mon nouvel onglet à l'ouverture d'Excel, avec les boutons que j'ai créés, et cliquer dessus lance bien mes macros. Sauf que: elles ne font plus ce qu'elles sont censé faire.
Pour l'instant, j'ai vu cela avec la deuxième macro (celle qui réimporte les commentaires), je n'ai pas testé la première dans ces conditions. Mais le fait est là: la moitié des instructions de la macro sont purement et simplement ignorées. 90% des commentaires à importer ne le sont pas, sans aucune explication pourquoi certains le sont, j'ai fait des tests en ajoutant des boucles de "freinage", elles sont ignorées, tout comme les sleeps, j'ai mis en place un log, il n'est pas enregistré... Et si je lance la macro directement, pas de souci, tout se passe normalement.
Donc ma question: quelle est donc la différence fondamentale entre un appel de macro direct (par la fenêtre Macros ou VBE) et par un bouton personnalisé dans un complément, qui fait qu'une macro fonctionne dans le premier cas, et pas dans l'autre? Surtout que je n'ai aucun message d'erreur, rien, juste ma macro qui fait rien ou presque...
A tout hasard, je mets mon code ci-dessous, mais je ne pense pas que le problème soit là, je pencherais plutôt sur un paramètre qui m'échappe.
--------
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
100
101
102
103 Sub ImportCommentsFromWord(control As IRibbonControl) Dim xComment As Comment Dim xSheet As Worksheet Dim wApp As Object 'Opens Word if not already open On Error Resume Next Set wApp = GetObject(, "Word.Application") If Err.Number <> 0 Then Err.Clear Set wApp = CreateObject("Word.Application") End If wApp.Visible = False For Each xSheet In ActiveWorkbook.Worksheets 'Activates each sheet one after another xSheet.Activate sName = xSheet.Name expname = Application.ActiveWorkbook.Path + "\" + sName + ".docx" 'Checks if there are comments in active sheet For Each xComment In xSheet.Comments CommsInSheet = 1 Next If CommsInSheet = 1 Then 'Opens the translated document to import comments into the sheet wApp.Documents.Open (expname) wApp.Selection.ClearFormatting wApp.Selection.Find.MatchWildcards = False wApp.Selection.WholeStory wApp.Selection.MoveLeft FileEnd = 0 logcoms = logcoms + expname + Chr(10) 'Imports comments until end of file is reached While FileEnd = 0 'Locates the next cell number wApp.Selection.ExtendMode = True wApp.Selection.MoveRight With wApp.Selection.Find .Text = "^l" End With wApp.Selection.Find.Execute DestCell = Mid(wApp.Selection.Text, 2, Len(wApp.Selection.Text) - 2) 'Locates the corresponding comment wApp.Selection.ExtendMode = False wApp.Selection.MoveRight wApp.Selection.ExtendMode = True With wApp.Selection.Find .Text = "^l" End With wApp.Selection.Find.Execute wApp.Selection.ExtendMode = False DestComm = Left(wApp.Selection.Text, Len(wApp.Selection.Text) - 1) 'Cleans the formatting of the comment wApp.Selection.MoveRight wApp.Selection.MoveLeft wApp.Documents.Add DocumentType:=0 wApp.Selection.Text = DestComm With wApp.Selection.Find .Text = "^p" .Replacement.Text = Chr(10) End With wApp.Selection.Find.Execute Replace:=wdReplaceAll wApp.Selection.WholeStory DestComm = Left(wApp.Selection.Text, Len(wApp.Selection.Text) - 1) wApp.ActiveDocument.Close savechanges:=False 'Tests if it was the last comment If Right(DestComm, 11) = "END_OF_FILE" Then DestComm = Left(DestComm, Len(DestComm) - 11) FileEnd = 1 End If 'Imports the comment xSheet.Range(DestCell).Comment.Text Text:=DestComm logcoms = logcoms + DestCell + Chr(10) + DestComm + Chr(10) Wend 'Closes the Word document wApp.ActiveDocument.Close savechanges:=False End If CommsInSheet = 0 Next wApp.Documents.Add wApp.Selection = logcoms wApp.ActiveDocument.SaveAs Filename:=Application.ActiveWorkbook.Path + ".txt", Format:=wdFormatText wApp.Visible = True Set wApp = Nothing End Sub
Edit: modifié le titre pour être plus clair
Partager