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 :

executer macro sur plusieurs feuilles


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Mai 2008
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 4
    Points : 1
    Points
    1
    Par défaut executer macro sur plusieurs feuilles
    bonjour, j'ai un souci et j'aurai besoin de votre aide...j'ai creer un macro pour importer dans un tableau les données de mes fichiers mais je n'arrive pas a trouver le code pour la boucle qui permettrai à la macro de s'executer sur chaque feuille numérotée 1, 2 ,3 ... du fichier 3413210.xls et de refaire l'ensemble de la macro sur chacun des fichiers (nommés 3413211, 3413212...) du répertoire. Une précision le nombre de feuilles varie en fonction du fichier (mais toujours au minimum l'onglet feuille 1) et les feuilles numérotées ne sont pas les seules dans le fichier (également feuilles menu, recap...)

    voici mon code :

    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
    Sub Macro1()
    ' ouvre le fichier exploitation
        Windows("3413210.xls").Activate
        Sheets("Menu").Select
     
        Cells(11, 38).Select
        region = Cells(11, 38).Value
        EXPLOIT = Cells(15, 38).Value
        MOIS = Cells(13, 38).Value
     
        RESORIG = Cells(18, 38).Value
        AJST = Cells(19, 38).Value
        EXTR = Cells(21, 38).Value
     
    '   Passer sur l'onglet de détail
        Sheets("1").Select
        NATURE = Cells(14, 2).Value
     
       ' Passe en revue toutes les lignes de saisie
     
       ' Condition si pas de désignation, aller onglet suivant
     
        ' Sinon stocker les variables
        ligne = 26
    For ligne = 26 To 51
    Cells(ligne, 2).Select
            TRAVREST = Cells(ligne, 2).Value
    If TRAVREST = 0 Then GoTo NOUVELLE_LIGNE
        'Cells(ligne, 1).Select
            POSTE = Cells(ligne, 1).Value
            TRAVREST = Cells(ligne, 2).Value
            AJSTRAV = Cells(ligne, 3).Value
            Index = Cells(ligne, 4).Value
            TRAVDEBUT = Cells(ligne, 5).Value
            TRAVPER = Cells(ligne, 6).Value
            TRAVPERSOUSTR = Cells(ligne, 7).Value
            TRAVFIN = Cells(ligne, 8).Value
            PROV = Cells(ligne, 10).Value
            PROVSANSOBJET = Cells(ligne, 14).Value
            REPRISE = Cells(ligne, 15).Value
     
            'For col = 1 To 15
            '    data(col - 1) = Cells(ligne, col)
            'Next
     
        '   Recopie les données dans la base DATA
            Windows("DATA.xls").Activate
            Sheets("Base de données").Select
     
     
            Cells(ligne - 24, 1).Value = region
            Cells(ligne - 24, 4).Value = EXPLOIT
            Cells(ligne - 24, 6).Value = MOIS
            Cells(ligne - 24, 9).Value = RESORIG
            Cells(ligne - 24, 10).Value = AJST
            Cells(ligne - 24, 11).Value = EXTR
            Cells(ligne - 24, 7).Value = NATURE
            Cells(ligne - 24, 8).Value = POSTE
            Cells(ligne - 24, 12).Value = TRAVREST
            Cells(ligne - 24, 13).Value = AJSTRAV
            Cells(ligne - 24, 14).Value = Index
            Cells(ligne - 24, 15).Value = TRAVDEBUT
            Cells(ligne - 24, 16).Value = TRAVPER
            Cells(ligne - 24, 17).Value = TRAVPERSOUSTR
            Cells(ligne - 24, 18).Value = TRAVFIN
            Cells(ligne - 24, 19).Value = PROV
            Cells(ligne - 24, 20).Value = PROVSANSOBJET
            Cells(ligne - 24, 21).Value = REPRISE
     
     
            Windows("3413210.xls").Activate
            Sheets("1").Select
    NOUVELLE_LIGNE:
    Next
    NOUVEL_ONGLET:
       Sheets("2").Select
     
     
    End Sub

    voila merci d'avance de votre aide!
    bonne journée

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Points : 2 443
    Points
    2 443
    Par défaut
    Salut lumiere1808 et le forum
    Question : tes feuilles à "scanner" commencent toutes par un chiffre ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Windows("3413210.xls").Activate
    avec uN tel code, tu n'ouvres aucun fichier : tu rends active la fenêtre contenant le fichier "3413210.xls" préalablement ouvert

    quand on scanne la feuille, on scrute les ligne de 26 à 51 => la sauvegarde sur la base de donnée ne peut être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cells(ligne - 24, 1).Value = region
    Sinon au prochain onglet, on reécrit sur ce qu'on vient de sauver. Donc, il faut une colonne de référence qu'on testera pour savoir la dernière ligne utilisée et on partira de la ligne suivante. Je propose la colonne L

    Les colonnes A, B, C, E restent vides, est-ce normal ?

    A+

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Mai 2008
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    bonjour Gorfael.. oui tout mes fichiers commencent par des chiffres.
    pour ouvrir mes fichiers quel code je dois utiliser? je dois mettre .open?
    pourrai tu me dire comment faire pour ne pas réecrire dessus? aussi je nai pas compris ce qu'il faut faire avec la colonne de réference L...dsl je pose trop de questions
    Non les colonnes a, b, c et e ne sont pas vides..elles contiendront par la suite les données provenant d'un autre fichier.
    merci de ton aide
    a+

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Points : 2 443
    Points
    2 443
    Par défaut
    Salut lumiere1808
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bonjour Gorfael.. oui tout mes fichiers commencent par des chiffres.
    Pour l'instant, je n'ai parlé que de feuilles et pas de fichiers.
    Avant de s'occuper des fichiers, je préfère traiter le problème de la boucle de recherche des infos dans chacune des feuille du classeur déjà ouvert, étant moins à l'aise sur le travail "extérieur" et d'autres auront peut-être plus d'idées.
    comment faire pour ne pas réecrire dessus? aussi je nai pas compris ce qu'il faut faire avec la colonne de réference L...dsl je pose trop de questions
    Comme disait Fucius qui était loin d'être con : avoir des lacune n'est pas grave, seul le fait de ne pas vouloir les combler l'est.

    Tu testes la valeur attribuée à la variable TRAVREST et si elle n'est pas égale à 0, on lance la sauvegarde.
    tu sauvegardes TRAVREST en colonne "L" => dans chacune des lignes copiées, la colonne L contient donc quelque chose pour chaque enregistrement (ligne) de la base de donnée.
    Pour ne pas recopier sur les lignes déjà remplies, on va regarder la dernière ligne de L qui contient une donnée : manuellement sur Excel, tu vas à la dernière ligne de L (L65536) et tu fais
    <Shift>+<flèche vers de haut du clavier de déplacement> : tu te retrouves sur la dernière cellule non vide de la colonne L.
    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
    89
    90
    91
    Sub Macro1()
    'Déclarations ===================================
    Dim Cl As Workbook
    Dim Cl_1 As Workbook
    Dim F As Worksheet
    Dim F_1 As Worksheet
    Dim Lig As Long
    Dim Lig_1 As Long
    Dim X As Integer
    'MEI ============================================
    'Recherche de la ligne destination --------------
    Set Cl = Workbooks("DATA.xls")
    'Mise en variable du classeur destination
    Set F = Cl.Sheets("Base de données")
    'mise ne variable de la feuille
    Lig = F.[L65536].End(xlUp).Row + 1
    'détermination de la ligne de destination
    'Classeur origine
    Set Cl_1 = Workbooks("3413210.xls")
    'Mise ne variable du classeur origine
    'Traitement =======================================
    For Each F_1 In Cl_1.Sheets
    'pour toutes les feuilles du classeur origine
        If F.Name Like "[0-9]*" Then
        'si le nom de la feuille commence par un chiffre, alors
            For Lig_1 = 26 To 51
            'pour les lignes de 26 à 51
                If Cells(Lig_1, "B") <> 0 Then
                'si B est différent de 0
                    'copie en-tête --------------------
                    With Cl_1.Sheets("Menu")
                    'définition d'un préfixe
                        Cl.F.Range("A" & Lig) = .Cells(11, "AL")    'RÉGION
    'revient à écrire : Cl.F.Range("A" & Lig) = Cl_1.Sheets("Menu").Cells(11, "AL")
                        Cl.F.Range("D" & Lig) = .Cells(15, "AL")    'EXPLOIT
                        Cl.F.Range("F" & Lig) = .Cells(13, "AL")    'MOIS
                        Cl.F.Range("I" & Lig) = .Cells(18, "AL")    'RESORIG
                        Cl.F.Range("J" & Lig) = .Cells(19, "AL")    'AJST
                        Cl.F.Range("K" & Lig) = .Cells(21, "AL")    'EXTR
                    End With
                    'définition des cellules origine/destination --------
                    For X = 1 To 12
                    'boucle pour parcourir toutes les cellules à copier
                        Select Case X
                            Case 1 'NATURE
                                Set Cel_1 = Cl_1.F_1.Cells(14, "B")
                                Set Cel = Cl.F.Cells(Lig, "G")
                            Case 2 'POSTE
                                Set Cel_1 = Cl_1.F_1.Cells(Lig_1, "A")
                                Set Cel = Cl.F.Cells(Lig, "H")
                            Case 3 'TRAVREST
                                Set Cel_1 = Cl_1.F_1.Cells(Lig_1, "B")
                                Set Cel = Cl.F.Cells(Lig, "L")
                            Case 4 'AJSTRAV
                                Set Cel_1 = Cl_1.F_1.Cells(Lig_1, "C")
                                Set Cel = Cl.F.Cells(Lig, "M")
                            Case 5 'INDEX
                                Set Cel_1 = Cl_1.F_1.Cells(Lig_1, "D")
                                Set Cel = Cl.F.Cells(Lig, "N")
                            Case 6 'TRAVDEBUT
                                Set Cel_1 = Cl_1.F_1.Cells(Lig_1, "E")
                                Set Cel = Cl.F.Cells(Lig, "O")
                            Case 7 'TRAVPER
                                Set Cel_1 = Cl_1.F_1.Cells(Lig_1, "F")
                                Set Cel = Cl.F.Cells(Lig, "P")
                            Case 8 'TRAVPERSOUSTR
                                Set Cel_1 = Cl_1.F_1.Cells(Lig_1, "G")
                                Set Cel = Cl.F.Cells(Lig, "Q")
                            Case 9 'TRAVFIN
                                Set Cel_1 = Cl_1.F_1.Cells(Lig_1, "H")
                                Set Cel = Cl.F.Cells(Lig, "R")
                            Case 10 'PROV
                                Set Cel_1 = Cl_1.F_1.Cells(Lig_1, "J")
                                Set Cel = Cl.F.Cells(Lig, "S")
                            Case 11 'PROVSANSOBJET
                                Set Cel_1 = Cl_1.F_1.Cells(Lig_1, "N")
                                Set Cel = Cl.F.Cells(Lig, "T")
                            Case 12 'REPRISE
                                Set Cel_1 = Cl_1.F_1.Cells(Lig_1, "O")
                                Set Cel = Cl.F.Cells(Lig, "U")
                        End Select
                        Cel = Cel_1
                        'valeur de destination = valeur d'origine
                    Next X
                Lig = Lig + 1
                'passage à la ligne destination suivante
                End If
            Next Lig_1
        End If
    Next F_1
    End Sub
    Je n'utilise pas l'affichage L1C1, alors je préfère utiliser les lettres, cells(x,38) étant moins facile à vérifier que Range("AL" & x) ou cells(x,"AL")
    Donc, comme j'ai la flemme de faire des fichiers de tests, je ne l'ai pas testé : à toi de le faire

    tu l'exécutes en mode pas-à-pas. Quand tu appuies sur F8, la ligne de code surlignée s'exécute et le surlignage passe à la ligne suivante
    tu peux voir le contenu des variables, soit en t'arrêtant dessus avec la souris(si les bulles d'aide sont activées) soit à l'aide de la fenêtre "Variables locales" (Menu Affichage>>fenêtre variables locales)

    une fois que la première feuille a été recopiée correctement, tu sais que cette partie du code est correcte, et tu peux accélérer en mettant un point d'arrêt sur le next F_1 => avec F8 tu passes à l'instruction suivante, avec F5 tu exécutes le code de la ligne surlignée au prochin point d'arrêt

    Si ça marche pour deux ou trois feuilles, tu enlèves le point d'arrêt et tu appuies sur F5 => le reste de la macro s'exécutera totalement.

    ça permet de valider le bon fonctionnement des macros, mais surtout de vérifier l'état des variables juste avant l'instruction qui déclenche une erreur, et de savoir si elles sont toutes avec la valeur attendue.

    il faut vérifier que les infos sont bien recopiées au bon endroit.
    que tu traites toutes les feuilles, toutes les lignes désirées.
    une fois que c'est bon, on s'attaque aux problème des changement du classeur origine : faire évoluer 3413210.xls dans une boucle (encore une).
    Mais c'est une autre histoire
    A+

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Mai 2008
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    salut Gorfael.. merci de ta réponse..j'ai tester le code mais il y a un msg d'erreur dés le début "erreur de compilation : reference de variable controle incorrecte dans next" en surlignant le "next F" (avant derniere ligne du code).
    aussi dsl pour la confusion.. en ce qui concerne les feuilles elles ne sont pas toutes numérotées.
    a+

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Points : 2 443
    Points
    2 443
    Par défaut
    Salut
    lumiere1808j'ai tester le code mais il y a un msg d'erreur dés le début "erreur de compilation : reference de variable controle incorrecte dans next" en surlignant le "next F" (avant derniere ligne du code).
    C'est parce que tu lis mal : c'est Next F_1 (non, je n'ai pas édité le code )
    en ce qui concerne les feuilles elles ne sont pas toutes numérotées.
    Comment on distingue celle qu'on doit sauvegarder des autres ? Toutes sauf Menu ? Une cellule à tester ?
    A+

  7. #7
    Nouveau Candidat au Club
    Inscrit en
    Mai 2008
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    re... oui jai vu c'est bien "next F_1" ..cela di ya toujours un probleme..la macro n'execute pas le traitement aprés "If F.Name Like "[0-9]*" Then" elle passe directement a "end if"
    pour les feuilles...on a 8 feuilles qui apparaissent dans chaque fichier et d'autres qui appraissent en fonction du fichier (les feuilles numérotées) , sur les 8 feuilles seules 3 sont affichées les autres restent masquées... elles portent des noms au format alphabétique (menu, tableau...).
    Sur l'ensemble des feuilles du fichier celles dont j'ai besoin sont les feuilles nommées numériquement et la feuille menu.
    voili voila!
    encore merci
    a+

  8. #8
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Points : 2 443
    Points
    2 443
    Par défaut
    Salut lumiere1808
    Ouais, ouais, à quoi ça me sert d'être bête si je ne le montre pas
    If F.Name Like "[0-9]*" Then
    si le nom de la feuille F commence par un chiffre => comme c'est la feuille.... "Base de donnée" , ça m'étonne pas trop que ça saute directement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If F_1.Name Like "[0-9]*" Then
    devrait résoudre ce problème.

    D'habitude je crées un fichier d'essai, mais là, j'ai quelques soucis de disponibilité...
    A+

Discussions similaires

  1. [XL-2007] Application d'une macro sur plusieurs feuilles
    Par cattivo dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 10/01/2015, 10h24
  2. [XL-2007] utiliser une macro sur plusieurs feuilles
    Par revans dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 23/06/2012, 14h20
  3. [XL-2007] Exécuter une macro sur plusieurs feuilles
    Par formabox dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 26/03/2012, 18h22
  4. Calcul en macro sur plusieurs feuilles
    Par fanfan89 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 23/02/2010, 13h56
  5. macro sur plusieurs feuilles
    Par lolo_bob2 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 19/06/2006, 16h51

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