Bonjour à tous !
Après pas mal de temps passé à comprendre les grands principes des macros, je me suis lancé pour automatiser des rapports.
J'ai donc écrit une macro qui fait une suite de tâches sur une base de données :
- copier/coller de données relatives à un client dans le rapport correspondant au client
- rafraîchissement du rapport contenant les nouvelles données
- sauvegarde du rapport dans un répertoire
- fermeture du rapport
Cette macro est exécutée pour une liste de clients, j'ai donc fait une boucle afin que l'opération soit répétée pour tous mes clients.
Ma base de données primaire est dans le fichier "Base traitée.xlsm", mes rapports portent le nom de "nom du client.xlsm" (ex : ALPHA.xlsm)
Le code est ci-dessous. J'ai limité la boucle aux 2 premiers clients "ALPHA" et "BETA" pour alléger la durée des tests.
Code :
- Sub separation_base_client()
- Dim i, j As Integer
- Dim strFichier As String
- Dim Chemin As String
- Dim nb_clients As Integer
- Chemin = "C:\Users\923006\Google Drive\Rapports"
- nb_clients = Workbooks("Base traitée" ).Worksheets("Liste Clients" ).Cells(Rows.Count, 1).End(xlUp).Row
-
- For j = 2 To 3 Step 1
- 'nb_clients
- strFichier = Workbooks("Base traitée" ).Worksheets("Liste clients" ).Range("A" & j).Value
- Workbooks.Open Filename:=Chemin & "\" & strFichier & ".xlsm"
- Workbooks("Base traitée.xlsm" ).Worksheets(1).Activate
-
- ' Boucle de recherche par ligne sur la colonne B
- For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
- With Workbooks("Base traitée.xlsm" ).Worksheets(1).Activate
- If Cells(i, 2).Value = strFichier Then
- Rows(i).Select ' Selection de la ligne
- Selection.Copy 'copie de la selection
- Workbooks(strFichier & ".xlsm" ).Worksheets(1).Activate 'changement de feuille
- Rows(2).Select 'Selection de la deuxième ligne
- Selection.Insert Shift:=xlDown 'Insertion de la selection copier
- End If
- End With
- Next i
-
- Workbooks(strFichier & ".xlsm" ).Worksheets(2).Activate
- Application.Run (strFichier & ".xlsm!Rafraichir" )
- Workbooks(strFichier & ".xlsm" ).Worksheets(2).Activate
- Application.Run (strFichier & ".xlsm!SaveAs" )
- Workbooks(strFichier & ".xlsm" ).Worksheets(2).Activate
- Workbooks(strFichier & ".xlsm" ).Close False
-
- Next j
- End Sub
|
Je suis conscient que la méthode choisie n'est peut-être pas la plus simple, ni la plus économe en ressources, cela dit j'aimerais aller au bout de cette idée avant d'essayer de la simplifier.
J'ai 2 problèmes avec ce code :
1 - Lorsque j'exécute la macro avec une boucle sur 'j= 2 to 3', elle fonctionne entièrement pour le premier client, puis s'arrête malgré l'instruction "Next j" en fin de boucle.
2 - Lorsque j'exécute la macro à partir du 2ème client "BETA" (j=3), elle fonctionne jusqu'à bloquer sur l'instruction " Application.Run (strFichier & ".xlsm"!Rafraichir) " et me renvoie le message d'erreur suivant : Erreur d'exécution 1004 - Impossible d'exécuter la macro, il est possible qu'elle ne soit pas disponible dans ce classeur ou que toutes les macros soient désactivées.
Cette instruction est censée faire appel à une autre macro contenu dans le classeur du client, qui s'exécute normalement lorsqu'elle est lancée depuis le classeur dans lequel elle est stockée. Phénomène intéressant : lorsque je change l'instruction Application.Run (strFichier & ".xlsm"!Rafraichir) en Application.Run ("BETA.xlsm"!Rafraichir), ça ne fonctionne pas non plus. Par contre, lorsque je remplace le nom du client par "ALPHA.xlsm", mon premier rapport client dans lequel j'ai écrit la macro d'origine, ça fonctionne.
Voilà, je ne sais pas si cela est très clair, je lance un petit appel à l'aide (je sens que je suis près du but).
Merci d'avance pour vos réponses.
shamduf