Bonjour à tous,

Je possède la procédure suivante :

Code VB : 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
Sub copie_données()
 
Dim chemf As String
Dim nomf As String
 
'Sélection du fichier contenant  les données
chemf = Application.GetOpenFilename("Fichiers Excel, *.xlsx", , "Sélectionnez le fichier de données", "Importer")
 
Application.ScreenUpdating = False
 
'Ouverture du fichier et récupération des variables
Workbooks.Open (chemf)
nomf = ActiveWorkbook.Name
pos = InStr(ActiveWorkbook.Name, ".xls")
chem = Left(nomf, pos - 1)
 
'Copie des données dans le classeur "Suivi base horaire" et fermeture/suppression du fichier de données
Workbooks("Suivi base horaire.xlsm").Sheets("Données").Range("A1:Z5000") = Workbooks(nomf).Sheets("sheet1").Range("A1:Z5000").Value
Workbooks(nomf).Close
Kill chemf
 
'Sauvegarde du classeur à la place du fichier de données, avec le même nom que ce dernier
ActiveWorkbook.SaveAs Filename:="M:\Administration\Secrétariat RH\LOGICIELS RH\CHARLES\KELIO\Suivi base horaire\2017\" & chem & ".xlsm"
Application.ScreenUpdating = True
 
ActiveSheet.Range("D8").Font.ColorIndex = 10
 
End Sub

Elle me permet en substance de récupérer des données d'un fichier dans un classeur modèle, puis d'enregistrer ce classeur modèle à la place du fichier de données. Ainsi je conserve intact mon classeur modèle, et j'ai une copie des données puisque la manipulation doit être effectuée chaque semaine.

Cela fonctionne très bien. Cependant, j'ai ensuite le code suivant :

Code VB : 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
    Dim Ws As Worksheet
 
    For i = 1 To Nbresp
        cFeuil = Worksheets("Modèle").Cells(i, 1).Value
 
            Set Ws = ThisWorkbook.Worksheets(cFeuil)
            With ThisWorkbook
                With .VBProject.VBComponents(Ws.CodeName).CodeModule 'Copie l'onglet sans les macro de la feuille
                    .AddFromString "Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)" & vbLf & _
                                   "If Not Application.Intersect(Target, Range(""A1"")) Is Nothing Then" & vbLf & _
                                   "Worksheets(""Modèle"").Activate" & vbLf & _
                                   "End If" & vbLf & _
                                   "End Sub"
                End With
            End With
    Next

Qui me permet d'insérer du code vba dans chaque page du classeur (une vingtaine au total). Ces pages sont créées en vba juste avant dans la même procédure.

Ce code me renvoi une erreur d'exécution 9 : Cet indice n'appartient pas à la sélection sur cette ligne :

Code VB : Sélectionner tout - Visualiser dans une fenêtre à part
With .VBProject.VBComponents(Ws.CodeName).CodeModule 'Copie l'onglet sans les macro de la feuille

Pourtant en posant un espion sur mes variables, elles contiennent les bonnes données.

De plus, lorsque je ferme le classeur nouvellement créé grâce au vba puis que je l'ouvre à nouveau, à ce moment là la procédure s'exécute correctement.

Erratum : La première fois que je lance la procédure elle plante, mais si je la relance ensuite elle fonctionne. :/

C'est comme si le fait d'enregistrer sous en vba et de lancer la seconde procédure directement après provoquait un conflit dans mes vba projects.

Mais là je sèche un peu pour comprendre pourquoi.

Merci d'avance pour toute aide sur la question,

Sardaucar