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 :

Macro regrouper Excel


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 9
    Points : 5
    Points
    5
    Par défaut Macro regrouper Excel
    Bonjour a tous,

    J'ai le code ci dessous qui me sert a regrouper plusieurs fichiers excel dans un seul fichier avec 1 par Onglet. Toutefois je souhaiterai nommer l'onglet cible avec le nom du fichier et pas en aléatoire comme c'est le cas dans ce code.
    Je suis sur que les fichiers a importer n'ont pas le même nom, donc pas de risque de plantage a ce niveau.

    En vous remerciant par avance,


    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
    Sub test()
     
    'On crée une variable 'wbFusion' de type Classeur Excel
    Dim wbFusion As Workbook
    'On l'associe au classeur à partir duquel tu lances la macro
    Set wbFusion = ThisWorkbook
     
    'On crée une variable wbCible qui va correspondre tour à tour aux classeur à importer
    Dim wbCible As Workbook
    Dim shCible As Worksheet
     
    'Afin de lui affecter des fichiers, l'utilisateur va les sélectionner via une boîte de dialogue
    'NOTA : le With XXXXXXXXX évite de répéter plein de fois XXXXXXXXX lorsque l'on parle de la même chose ;)
    With Application.FileDialog(msoFileDialogFilePicker)
        .Title = "Choisissez le(s) classeur(s) à importer"
        .Filters.Add "Classeur Excel", "*.xls,*.xls?" 'on filtre par tous les fichiers .xls et xls? avec '?' signifiant "1 caractère"
        .ButtonName = "Importer ce(s) classeur(s)"
        .AllowMultiSelect = True 'on autorise la sélection multiple
        .Show 'on affiche la fenêtre, on attend le retour de l'utilisateur pour continuer
     
        'on a réglé la boîte de dialogue, maintenant il faut traiter les données de l'utilisateur :
        'si l'utilisateur n'a pas sélectionné de fichier, on met un message d'erreur
        If .SelectedItems.Count = 0 Then
            MsgBox "Veuillez sélectionner au moins un fichier", vbExclamation, "Erreur"
        'Sinon, on traite :
        Else
            For i = 1 To .SelectedItems.Count
                'On ouvre chaque classeur un par un
                Set wbCible = Workbooks.Open(.SelectedItems(i))
                CouleurOnglet = RGB(Rnd * 255, Rnd * 255, Rnd * 255) 'on va mettre toutes les pages de ce classeur importées avec l'onglet de la même couleur
                CompteurClasseur = CompteurClasseur + 1 'on incrémente un compteur, facultatif
                'Pour chaque feuille du wbCible :
                For Each shCible In wbCible.Sheets
                    shCible.Tab.Color = CouleurOnglet
                    shCible.Name = Int(Rnd * 99999) 'nom aléatoire pour être certain qu'il n'y ait pas de doublon plantant la macro
                    shCible.Copy after:=wbFusion.Sheets(wbFusion.Sheets.Count) 'on la copie à la fin de wbFusion
                    CompteurFeuille = CompteurFeuille + 1 'on incrémente un compteur, facultatif
                Next shCible
                'On ferme le classeur sans enregistrer (on a changé le nom des pages avant copie)
                wbCible.Close SaveChanges:=False
            'On passe au classeur suivant
            Next i
            'Facultatif, à l'aide des compteurs, on indique à l'utilisateur que tout s'est bien passé
            MsgBox CompteurFeuille & " feuilles ont bien été importées, provenant de " & CompteurClasseur & " classeurs Excel.", vbInformation, "Import réussi"
        End If
    End With
     
    End Sub

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 753
    Points : 28 603
    Points
    28 603
    Billets dans le blog
    53
    Par défaut
    Bonjour,

    Je te conseille vivement de scinder ta procédure en prévoyant une fonction ou une procédure Sub qui ne fera que la copie des données d'une liste source vers une plage cible.
    Cette fonction aura par exemple trois arguments. Les deux premiers de type Range ou ListObject et le troisième optionnel et de type Boolean indiquant si la cible commence au début ou doit se placer à la suite des autres données déjà présentes.

    Ainsi tu pourra faire l'équivalent d'un copier/coller qu'elle que soit l'endroit où est la source et celui où se trouve la cible.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Bonsoir Philippe. merci pour ce retour. mais étant novice en Vba, je le vois mal recréer tout le code. surtout que celui la fonctionne, au détail du nom de l'onglet que je souhaite modifier.

  4. #4
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    Bonjour,

    pour répondre à ta question, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    shCible.Name = wbCible & "_" & CompteurFeuille
    ajouter l'initialisation du compteur de feuille si tu veux qu'elle recommence à 1 pour chaque classeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CompteurFeuille=1 ' init ajoutée
    For Each shCible In wbCible.Sheets
    eric

    PS : je viens de voir que CompteurFeuille sert au message final, utilise une autre variable si tu le conserves.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Bonjour Eric.

    Merci pour ton retour.
    Je ne souhaites pas de d'ajout d'un numéro dans le nom de l'onglet mais conserver uniquement le nom du fichier importé (fichier client)

    J'ai essayé shCible.Name = wbCible mais ça ne fonctionne pas

    En modifiant le code suite a ton indication
    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
    Sub test()
     
    'On crée une variable 'wbFusion' de type Classeur Excel
    Dim wbFusion As Workbook
    'On l'associe au classeur à partir duquel tu lances la macro
    Set wbFusion = ThisWorkbook
     
    'On crée une variable wbCible qui va correspondre tour à tour aux classeur à importer
    Dim wbCible As Workbook
    Dim shCible As Worksheet
     
    'Afin de lui affecter des fichiers, l'utilisateur va les sélectionner via une boîte de dialogue
    'NOTA : le With XXXXXXXXX évite de répéter plein de fois XXXXXXXXX lorsque l'on parle de la même chose ;)
    With Application.FileDialog(msoFileDialogFilePicker)
        .Title = "Choisissez le(s) classeur(s) à importer"
        .Filters.Add "Classeur Excel", "*.xls,*.xls?,*xlsx" 'on filtre par tous les fichiers .xls et xls? avec '?' signifiant "1 caractère"
        .ButtonName = "Importer ce(s) classeur(s)"
        .AllowMultiSelect = True 'on autorise la sélection multiple
        .Show 'on affiche la fenêtre, on attend le retour de l'utilisateur pour continuer
     
        'on a réglé la boîte de dialogue, maintenant il faut traiter les données de l'utilisateur :
        'si l'utilisateur n'a pas sélectionné de fichier, on met un message d'erreur
        If .SelectedItems.Count = 0 Then
            MsgBox "Veuillez sélectionner au moins un fichier", vbExclamation, "Erreur"
        'Sinon, on traite :
        Else
            For i = 1 To .SelectedItems.Count
                'On ouvre chaque classeur un par un
                Set wbCible = Workbooks.Open(.SelectedItems(i))
                CouleurOnglet = RGB(Rnd * 255, Rnd * 255, Rnd * 255) 'on va mettre toutes les pages de ce classeur importées avec l'onglet de la même couleur
                CompteurClasseur = CompteurClasseur + 1 'on incrémente un compteur, facultatif
                CompteurFeuille = 1 'xxx
     
                CompteurTest = 1 'xxx
                'Pour chaque feuille du wbCible :
                For Each shCible In wbCible.Sheets
                    shCible.Tab.Color = CouleurOnglet
                    shCible.Name = wbCible & "_" & CompteurFeuille  'nom de la feuille
                    shCible.Copy after:=wbFusion.Sheets(wbFusion.Sheets.Count) 'on la copie à la fin de wbFusion
                    CompteurFeuille = CompteurFeuille + 1 'on incrémente un compteur, facultatif
                    CompteurTest = CompteurTest + 1 'xxx
     
                Next shCible
                'On ferme le classeur sans enregistrer (on a changé le nom des pages avant copie)
                wbCible.Close SaveChanges:=False
            'On passe au classeur suivant
            Next i
            'Facultatif, à l'aide des compteurs, on indique à l'utilisateur que tout s'est bien passé
            MsgBox CompteurTest & " feuilles ont bien été importées, provenant de " & CompteurClasseur & " classeurs Excel.", vbInformation, "Import réussi"
        End If
    End With
     
    End Sub
    J'ai le message d'erreur suivant:
    Erreur d'execution '438':
    Propriété ou méthode non gérée par cet objet

    En te remerciant pour ton retour

  6. #6
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 753
    Points : 28 603
    Points
    28 603
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    J'ai essayémais ne fonctionne pas
    Plutôt que ne pas fonctionner, tu as certainement dû avoir un message d'erreur.
    On ne mélange pas des propriétés et des objets en plus la propriété d'un objet feuille avec l'objet Classeur.

    Si tu veux conserver le nom du classeur ce sera (si je me réfère au préfixe de tes variables objets) wbCible.Name que tu renvoies à une variable de type String comme par exemple
    wbName est une variable typée String
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  7. #7
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    Bonjour,

    si tu importes plusieurs feuilles comment veux-tu leur donner le même nom ?
    Impossible en plus d'être illogique.
    eric

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par eriiic Voir le message
    Bonjour,

    si tu importes plusieurs feuilles comment veux-tu leur donner le même nom ?
    Impossible en plus d'être illogique.
    eric
    Bonjour Eric,

    J'ai du mal m'exprimer. Je souhaite nommer l'onglet cible avec le nom du fichier d'origine.

    Je vais essayer les dernières modifications envoyés sur la discussion et je vous tiens au courant

    Merci

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par Philippe Tulliez Voir le message
    Bonjour,

    Plutôt que ne pas fonctionner, tu as certainement dû avoir un message d'erreur.
    On ne mélange pas des propriétés et des objets en plus la propriété d'un objet feuille avec l'objet Classeur.

    Si tu veux conserver le nom du classeur ce sera (si je me réfère au préfixe de tes variables objets) wbCible.Name que tu renvoies à une variable de type String comme par exemple
    wbName est une variable typée String
    Re-Bonjour Philippe, Eric,

    C'est parfait. Le code a été modifié et fonctionne.

    Merci pour le coupe de main

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Graphe et Macro et Excel et VBA
    Par life is magic dans le forum Macros et VBA Excel
    Réponses: 20
    Dernier message: 18/11/2005, 17h24
  2. Activation des macros sous Excel
    Par Igloobel dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 10/10/2005, 11h44
  3. macro sous excel
    Par julien13200 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 21/02/2005, 15h49
  4. Macro dans excel permettant de voir si un fichier est ouvert
    Par VirginieGE dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 12/08/2004, 07h51
  5. [VBA-E] macro conversion excel vers csv
    Par baboune dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 15/07/2004, 09h23

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