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
| 'A placer en début de module
Option Explicit
'cette option oblige à déclarer toutes les variables,
'VBa contrôle donc les noms et évite d'avoir des variables mal orthographiée
'Par exemple "nom_source" au lieu de "fichier_Source" plus bas dans le code
'Une bonne pratique est également de mettre au moins une majuscule dans les noms de variables
'Comme ça à la saisie du code, on voit de suite si celle-ci est reconnu par VBA au retour à la ligne
'En VBA il faut définir le type de chaque variable, même si plusieurs sont de même type
'Dim NomFichier_Destination As String, NomFichier_Source As String
'Je propose de créer un fonction mais le code reste valable sans faire ceci
Function Transfer_Historique(NomFichier_Destination As String, NomFichier_Source As String) As Boolean
Dim WbDestination As Workbook
Dim Wsh12 As Worksheet, WshSource_Historique As Worksheet
'On bloque temporairement la gestion d'erreur
'En cas d'erreur sur une ligne, la ligne suivante est exécutée (à manier avec délicatesse)
On Error Resume Next
'On ouvre le fichier de destination et on le pointe dans une variable
Set WbDestination = Workbooks.Open(NomFichier_Destination & ".xlsm")
'On pointe la feuille 12 dans destination
Set Wsh12 = WbDestination.Worksheets("12")
'Si le fichier source est le fichier qui contient la macro, on peut utiliser directement ThisWorkBook
'Ou même directement le nom de la feuille historique
'Sinon
'On pointe la feuille historique du fichier source
Set WshSource_Historique = Workbooks(NomFichier_Source & ".xlsm").Worksheets("historique")
'On réactive la gestion d'erreur
On Error GoTo 0
'On vérifie qu'un fichier a été trouvé et ouvert
'Et on vérifie qu'aucune des variables n'est "vide"
If Not (WshSource_Historique Is Nothing Or Wsh12 Is Nothing Or WbDestination Is Nothing) Then
'On bloque l'affichage
Application.ScreenUpdating = False
'On bloque les remonter d'information
Application.DisplayAlerts = False
'On supprime la feuille historique
'On désactive temporairement la gestion d'erreur au cas ou la feuille historique n'existerait pas dans le fichier
On Error Resume Next
WbDestination.Sheets("historique").Delete
On Error GoTo 0
'On copie la feuille historique
WshSource_Historique.Copy After:=WbDestination.Sheets("12")
'On ferme Destination en enregistrant
WbDestination.Close SaveChanges:=True
'On désactive les blocage
Application.DisplayAlerts = True
Application.ScreenUpdating = True
'On signale que la function a réussi
Transfer_Historique = True
Else
'Une des variable ne pointe rien (soit destination n'existe pas,
'soit la feuille 12 n'existe pas dans destination
'soit la feuille historique n'existe pas dans source
'...
'On peut par exemple afficher un message
MsgBox "Un élément est abscent : " & vbCrLf & _
"Fichier destination => " & IIf(WbDestination Is Nothing, "Abscent", "Présent") & vbCrLf & _
"Feuille ""12"" dans Destination => " & IIf(Wsh12 Is Nothing, "Abscente", "Présente") & vbCrLf & _
"Feuille Historique dans Source => " & IIf(WshSource_Historique Is Nothing, "Abscente", "Présente"), vbCritical, "Copie impossible"
'On signale que la function a échoué
Transfer_Historique = False '(ligne facultative puisque Transfer_Historique est initialisée à false)
End If
End Function
'Exemple d'utilisation
Sub test()
Dim strNomSource As String, strNomDestination As String
'.... déroulé du code ou seront définies strNomSource et strNomDestination
If Transfer_Historique(strNomDestination, strNomSource) Then
'Le transfert c'est bien passé
Else
'Le transfert n'a pas eu lieu
End If
End Sub |
Partager