IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

copier feuille dans autre classeur


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    manager
    Inscrit en
    Août 2021
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : manager

    Informations forums :
    Inscription : Août 2021
    Messages : 10
    Par défaut copier feuille dans autre classeur
    bonjour,

    Dans une macro j'ai le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Dim  nom_fichier, fichier_source as string
     
    Windows(nom_fichier & ".xlsm").open
    Windows(nom_fichier & ".xlsm").Visible = False ' *** l'erreur est ici, si je mais True la macro fonctionne******
     
    Application.DisplayAlerts = False
     
    Workbooks(nom_fichier & ".xlsm").Sheets("historique").Delete
     
    Workbooks(fichier_source).Sheets("historique").Copy After:=Workbooks(nom_fichier & ".xlsm").Sheets("12")
    Workbooks(nom_fichier & ".xlsm").Close SaveChanges:=True
    Le but si vous avez compris est de supprimer une feuille dans un classeur puis de copier une feuille depuis le fichier source vers une autre fichier (la condition étant de ne pas afficher le fichier destinataire).
    un message d'erreur apparait avec :
    la copie a échouée
    par contre, si : Windows(nom_fichier & ".xlsm").Visible = True, cela fonctionne

    Mais la condition reste que le fichier doit être invisible

    merci de votre aide

    Cordialement

  2. #2
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    Salut

    Dans un tel cas, je pense que je procéderais ainsi (à adapter au besoin).
    Le but est de limiter au maximum les risque de plantage du code. Si le code plante en utilisation, l'utilisateur se retrouve devant une page VBA avec du code, ce qui n'est pas terrible. Il y a des tutoriels pour réaliser de vraie gestion d'erreur, le code suivant fait une gestion à minima mais qui limite très fortement les risques.

    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
    '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
    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

Discussions similaires

  1. [XL-2010] Macro Parcourir pour ouvrir classeur / copier données dans autre classeur
    Par rom22950 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 06/08/2014, 16h54
  2. [XL-2010] Raccourci clavier déplacer ou copier feuille dans même classeur
    Par Nessie37 dans le forum Conception
    Réponses: 6
    Dernier message: 10/06/2011, 22h03
  3. [XL-2003] copier des feuilles dans nouveau classeur
    Par JohnNC115 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 27/01/2011, 09h25
  4. [AC-2003] Copier/Inserer une feuille dans un classeur Excel depuis ACCESS
    Par moilou2 dans le forum VBA Access
    Réponses: 1
    Dernier message: 25/08/2009, 15h45
  5. Copier une feuille dans un classeur nouvellement créé
    Par jonathanoudelet dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 19/11/2008, 11h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo