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 :

Application d'une macro sur plusieurs feuilles


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Application d'une macro sur plusieurs feuilles
    Bonjour à vous,

    J'ai un classeur Excel contenant une cinquantaine de feuilles, sur lesquels je dois effectuer les mêmes opérations à chaque mise à jour, j'ai donc découvert les macros ! Le soucis est que le macro ne s'applique qu'à la feuille active. En cherchant un peu j'ai trouvé des solutions utilisant des lignes de code, mais le soucis est que je ne maîtrise pas du tout ce langage.

    Je pense que la problème vient du fait que j'ai utiliser l'enregistrement de macro au lieu de codé directement, dans le code résultant de l'enregistrement, je vois apparaître les noms des personnes sur lesquels j'ai demandé d'appliquer le traitement et vu que les noms ne sont pas les mêmes sur toutes les feuilles, forcément y a un moment où ça va coincer.

    Malheureusement, je ne peux pas vous mettre le fichier en PJ car il contient des données personelles, mais voici comment il est structuré :
    - 44 feuilles contenant les informations à traiter
    - 11 colonnes par tableau : N° Clé - Nom - Colonne 1 - Prénom - colonne 2 - Intensité - Seuil - S. Alerte - Date - Heure - Service (tous les tableaux ont exactement la même structure)
    - Chaque tableau s'appel : "Machine_XX", allant de 01 à 44
    - Le nombre de ligne varie
    - La colonne "Service" peut prendre 4 valeurs différentes : "TS" - "Expédition" - "Réception" - "SF Colis", chaque feuille n'est affecté qu'à un seul service (toutes les lignes du tableau Machine_10 ont pour valeur "Expédition" dans la colonne "Service")

    Et voici le traitement que j'aimerais réaliser :
    - Supprimer les doublons absolu (qui ont exactement les mêmes informations dans toutes les colonnes du tableau)
    - Supprimer (ou filtrer) toutes les lignes ayant une "Intensité" inférieure strictement à 7
    - Supprimer (ou filtrer) les lignes ayant pour "Nom" : "INCONNU"

    Et le top du top serait de copier l'intégralité des tableaux et de les coller dans la feuille récapitulatif de leur service
    Un exemple pour que ce soit plus claire : copier l'intégralité du tableau "Machine_10" qui a pour service "Expédition" et le coller dans la feuille "Analyse Expédition" et idem avec les autres tableau et les autres services.

    Voilà, voilà, j'espère que j'ai été assez claire, sinon n'hésitez pas s'il faut d'autres informations.
    Ca me soulagera d'une tâche relativement fastidieuse ! Réaliser 4 tâches, aussi minimes soient elles, sur 44 feuilles, c'est très long et lourd à faire Sachant en plus qu'il doit exister un moyen de tous réaliser en appuyant simplement sur un petit bouton.

    Merci d'avance à tous ceux qui m'aideront
    Et meilleurs vœux à tous pour cette année 2015 !
    Voici le code résultant de l'enregistrement de ma macro :

    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
    Sub Traitement()
    '
    ' Traitement Macro
    '
        Dim ws As Worksheet
     
        Range("A2").Select
        ActiveSheet.Range("$A$1:$K$281").RemoveDuplicates Columns:=Array(1, 2, 3, 4, 5, 6, _
            7, 8, 9, 10, 11), Header:=xlYes
        ActiveSheet.ListObjects("Machine_10").Range.AutoFilter Field:=6, Criteria1:= _
            ">=7", Operator:=xlAnd
        ActiveWorkbook.Worksheets("10 - EXP").ListObjects("Machine_10").Sort.SortFields. _
            Clear
        ActiveWorkbook.Worksheets("10 - EXP").ListObjects("Machine_10").Sort.SortFields. _
            Add Key:=Range("B1:B95"), SortOn:=xlSortOnValues, Order:=xlAscending, _
            DataOption:=xlSortNormal
        With ActiveWorkbook.Worksheets("10 - EXP").ListObjects("Machine_10").Sort
            .Header = xlYes
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
        ActiveSheet.ListObjects("Machine_10").Range.AutoFilter Field:=2, Criteria1:= _
            Array("DUCHMOL", "MACHIN", "TRUC", "BIDULE"), _
            Operator:=xlFilterValues
     
    End Sub
    Et voici le code que j'ai essayé, en vain, d'appliquer pour que cela s'applique sur toutes mes feuilles :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub Traitement()
    [...]
        Dim ws As Worksheet
     
        Application.ScreenUpdating = False
        For Each ws In ActiveWorkbook.Worksheets  
    [...]
    Next
    End Sub

  2. #2
    Membre expert Avatar de QuestVba
    Homme Profil pro
    Enseignant
    Inscrit en
    Juillet 2012
    Messages
    2 477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2012
    Messages : 2 477
    Points : 3 865
    Points
    3 865
    Par défaut
    Bonjour,

    Pour la boucle sur toutes les feuilles de ton classeur. Il te manquait le Ws avec le Next

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    'Déclare la variable objet Worksheet 
    Dim Ws As Worksheet 
     
    'Boucle sur toutes les feuille de calcul du classeur. Les onglets graphiques ne sont pas pris 
    'en compte. 
    'ThisWorkbook correspond à l'objet classeur contenant la macro 
    For Each Ws In ThisWorkbook.Worksheets 
        ...
    Next Ws

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    J'ai ajouté ces lignes au code généré par l'enregistreur, et quand je l’exécute j'ai un message d'erreur :
    "Erreur d'exécution '9' : l'indice n'appartient pas à la sélection"

    Et quand je clique sur "Débogage", il surligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveSheet.ListObjects("Machine_10").Range.AutoFilter Filed:=6, Criteria1 _ :=">=7", Operaor:=xlAnd
    Cela ne vient-il pas du fait que l'exécution se fait uniquement sur "Machine_10" et non pas sur "Machine_x" avec x allant de 01 à 44 ? Ne faudrait-il pas rajouter une boucle "For" ? Même chose avec le :=Array("Machin", "Truc", "Bidule", "Chouette"), cela sélectionne des noms en particulier et donc il ne les retrouve pas dans les tableaux suivants.

    Voici le code en question :
    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
    Sub Traitement()
    '
    ' Traitement Macro
    '
     
    Dim Ws As Worksheet
     
    For Each Ws In ThisWorkbook.Worksheets
     
        Range("K2").Select
        Selection.AutoFill Destination:=Range("K2:K95")
        Range("K2:K95").Select
        ActiveSheet.Range("$A$1:$K$95").RemoveDuplicates Columns:=Array(1, 2, 3, 4, 5, 6, 7 _
            , 8, 9, 10, 11), Header:=xlYes
        ActiveSheet.ListObjects("Machine_10").Range.AutoFilter Field:=6, Criteria1 _
            :=">=7", Operator:=xlAnd
        ActiveSheet.ListObjects("Machine_10").Range.AutoFilter Field:=2, Criteria1 _
            :=Array("Machin", "Truc", "Bidule", "Chouette"), _
            Operator:=xlFilterValues
    Next Ws
    End Sub

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

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 898
    Points : 8 529
    Points
    8 529
    Par défaut
    Salut

    Voila un code de base à modifier selon tes besoins

    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
    Sub Traitement()
    '
    ' Traitement Macro
    '
     
    Dim Ws As Worksheet
    Dim iMachine As Integer
     
    For Each Ws In ThisWorkbook.Worksheets
        'Range("K2").Select 'pas besoin de selectionner pour travailler sur une cellule
        'il faut faire référence à la feuille sur laquelle tu travailles (ici Ws)
        'Soit en répétant à chaque fois Ws devant range
        'Ws.range("K2").autofil ....
        'Soit en utilisant une structure With (voir l'aide)
        With Ws
            .Range("K2").AutoFill Destination:=.Range("K2:K95")
            'Range("K2:K95").Select
            'ActiveSheet
            .Range("A1:K95").RemoveDuplicates Columns:=Array(1, 2, 3, 4, 5, 6, 7 _
                , 8, 9, 10, 11), Header:=xlYes
            'ActiveSheet
            'On boucle sur les machine
            For iMachine = 1 To 10 ' à toi de mettre les bonnes valeur
                'On compléte la référence de base du with pour pointer la bonne machine
                With .ListObjects("Machine_" & CStr(iMachine)) 'attention si les numéro de machine sont codé sur 2 chiffres, il faudra adapter le code, voir "Format" dans l'aide VBA
                    .Range.AutoFilter Field:=6, Criteria1 _
                        :=">=7", Operator:=xlAnd
                    .Range.AutoFilter Field:=2, Criteria1 _
                        :=Array("Machin", "Truc", "Bidule", "Chouette"), _
                        Operator:=xlFilterValues
                End With
            Next
        End With
    Next Ws
    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-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
  2. [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
  3. Installer une macro sur plusieurs postes
    Par titeZ dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 28/02/2008, 15h27
  4. [VBA-E] Comment appliquer une macro sur plusieurs cellules
    Par jeanpierreco dans le forum Macros et VBA Excel
    Réponses: 16
    Dernier message: 25/01/2007, 10h54
  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