Bonjour à tous,
Je suis actuellement en train de d'écrire une macro qui permet d'ajouter une nouvelle feuille. Cette macro est réalisée dans un fichier XLAM afin d'améliorer la maintenabilité du code. Mon code s'arrête sans message d'erreur au moment ou li exécute la ligne ".Worksheets("Blank_Template (2)").Name = "PART " & lastNumber & "A""
Le code est divisé en plusieurs sous routine
nb : le mots ACTIVE_WORKBOOK est une variable global qui contient l'objet "classeur" sur lequel on travaille elle est transmise comme suis :
Code dans le fichier excel normal (.xlsm)
Et le code dans le XLA :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 Sub Button_Add_table Dim book as workbook set book = Workbooks(ActiveWorkbook.name) Call MacroTemplateTS.Add_Table(book) end Sub
Code qui affecte la variable global
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 Sub Add_Table(book As Workbook, sht As Worksheet) 'OK Set ACTIVE_WORKBOOK = book Call add_new_table End Sub
D'abord la sous routine "principale"
elle appelle la sous routine Sort_Workbook
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 Sub add_new_table() 'OK Dim lastNumber As Integer Call Sort_WorkBook With ACTIVE_WORKBOOK lastNumber = ExtractingNumber(.Worksheets(.Worksheets.Count - 3).Name) lastNumber = lastNumber + 1 .Worksheets("Blank_Template").Visible = True .Worksheets("Blank_Template").Copy after:=.Worksheets(.Worksheets.Count - 3) .Worksheets("Blank_Template (2)").Name = "PART " & lastNumber & "A" <---------------- Ligne où le code plante .Worksheets("Blank_Template").Visible = False End With End Sub
Qui appelle elle même deux sous routine
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 Sub Sort_WorkBook() 'OK Call Sort_Alphabetically Call Order_Table_Number End Sub
et
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 Sub Sort_Alphabetically() 'OK Dim i, j As Integer Call Store_Hide_Table Call Check_ChangeLog i = 2 'pass the Change_Log sheet With ACTIVE_WORKBOOK While .Worksheets(i).Name Like "PART *" j = i + 1 While .Worksheets(j).Name Like "PART *" If .Worksheets(i).Name > .Worksheets(j).Name Then .Worksheets(j).Move before:=.Worksheets(i) End If j = j + 1 Wend i = i + 1 Wend End With End Sub
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 Sub Order_Table_Number() 'OK Dim referenceNumber As Integer Dim referenceLetter As String Dim newSheetName As String Dim sheetLetter As String Dim sheetNumber As Integer Dim i As Integer referenceNumber = 1 referenceLetter = "A" i = 2 With ACTIVE_WORKBOOK While .Worksheets(i).Name Like "PART *" sheetNumber = ExtractingNumber(.Worksheets(i).Name) If .Worksheets(i + 1).Name Like "PART *" Then newSheetName = "PART " & referenceNumber & referenceLetter 'Check the next table to determine the right reference letter and reference number If referenceNumber <> ExtractingNumber(.Worksheets(i + 1).Name) And ExtractingNumber(.Worksheets(i + 1).Name) <> ExtractingNumber(.Worksheets(i).Name) Then referenceNumber = referenceNumber + 1 referenceLetter = "A" Else ' Same variant Select Case (referenceLetter) Case Is = "A" referenceLetter = "B" Case Is = "B" referenceLetter = "C" Case Else referenceLetter = "D" End Select End If Else 'Last table newSheetName = "PART " & referenceNumber & referenceLetter End If .Worksheets(i).Name = newSheetName i = i + 1 Wend End With End Sub
et enfin il y a quelque autre méthodes qui sont appelée de temps en temps
Voila mon code est un peu long mais je ne vois pas d'ou peut venir l'erreur donc je préfère en mettre trop plutôt que trop peu
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 Sub Store_Hide_Table() 'OK With ACTIVE_WORKBOOK If ExistingTable("Blank_Change_Log") = True Then .Worksheets("Blank_Change_Log").Visible = True .Worksheets("Blank_Change_Log").Move after:=.Worksheets(.Worksheets.Count) .Worksheets("Blank_Change_Log").Visible = False Else MsgBox "The reference ""Blank_Change_Log"" table doesn't exist anymore." End If If ExistingTable("Reference_Sheet") = True Then .Worksheets("Reference_Sheet").Visible = True .Worksheets("Reference_Sheet").Move after:=.Worksheets(.Worksheets.Count) .Worksheets("Reference_Sheet").Visible = False Else MsgBox "The reference ""Reference_Sheet"" table doesn't exist anymore." End If If ExistingTable("Blank_Template") = True Then .Worksheets("Blank_Template").Visible = True .Worksheets("Blank_Template").Move after:=.Worksheets(.Worksheets.Count) .Worksheets("Blank_Template").Visible = False Else MsgBox "The reference ""Blank_Template"" table doesn't exist anymore." End If End With End Sub Sub Check_ChangeLog() 'OK With ACTIVE_WORKBOOK If ExistingTable("Change_Log") = True Then .Worksheets("Change_Log").Move before:=.Worksheets(1) Else .Worksheets("Blank_Change_Log").Visible = True .Worksheets("Blank_Change_Log").Copy before:=.Worksheets(1) .Worksheets("Blank_Change_Log (2)").Name = "Change_Log" .Worksheets("Blank_Change_Log").Visible = False End If End With End Sub Function ExistingTable(checktable As String) As Boolean 'OK On Error GoTo mistake Dim table As Worksheet ExistingTable = False For Each table In ACTIVE_WORKBOOK.Worksheets If table.Name = checktable Then ExistingTable = True Exit Function End If Next table Exit Function mistake: MsgBox "Error..." ExistingTable = CVErr(xlErrNA) End Function Function ExtractingNumber(sheetName As String) As Integer 'OK sheetName = Replace(sheetName, "PART ", "") If Len(sheetName) = 2 Then sheetName = Left(sheetName, Len(sheetName) - 1) Else sheetName = Left(sheetName, Len(sheetName) - 2) End If ExtractingNumber = CInt(sheetName) End Function Function ExtractingLetter(sheetName As String) As String 'OK ExtractingLetter = Right(sheetName, 1) End Function
Partager