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 :

une macro travaillant sur plusieurs feuilles, est ce possible?


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 14
    Points : 6
    Points
    6
    Par défaut une macro travaillant sur plusieurs feuilles, est ce possible?
    Bonjour à tous!
    je cherche a savoir si on peut travailler sur plusieurs feuille excel (d'un meme classeur) dans une meme macro.

    La reponse semble evidente mais pourtant je rencontre des difficultées.
    la première ayant commencée par une simple macro:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    sub clean_all()
    worksheets(1).clearContents
    worksheets(2).clearContents
    end sub
    le code ci-dessus ne marche pas.

    il semblerai que l'on doive activer une feuille avant d'y travailler, est ce que c'est vrai? parceque cela leve de nouveaux problemes...
    (flash lors de l'exécution de la macro liée à l'affichage instantannée de chaque feuille accédée par elle par exemple...)

    et si on devait activer une feuille avant d'y travailler cela alourdirai le code en :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    sub clean_all()
    worksheets(1).Activate
    worksheets(1).clearContents
    worksheets(2).Activate
    worksheets(2).clearContents
    'et au pire, il faut pouvoir reactiver l'ancienne feuille sur laquelle on travallait:
    worksheets(feuille precedente).Activate
    end sub
    il doit forcement y avoir une solution?
    Merci!

  2. #2
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub Test()
    Dim Ws As Worksheet
     
    Application.ScreenUpdating = False
    For Each Ws In ThisWorkbook.Worksheets
        If Ws.Name <> "Feuil1" Then Ws.UsedRange.ClearContents
    Next Ws
    End Sub
    Permet d'effacer le contenu de toutes les feuilles du classeur sauf celle nommée Feuil1
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  3. #3
    Membre émérite
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 814
    Points : 2 949
    Points
    2 949
    Billets dans le blog
    10
    Par défaut
    Bonjour,
    Pour "travailler" sur une feuille autre que la feuille active, il convient d'utiliser un bloc "With End With". Comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    With Worksheets(1)
        .Cells.ClearContents
    End With
    Dans ton exemple, cela donnerait un code comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    With Worksheets(1)
        .Cells.ClearContents
    End With
    With Worksheets(2)
        .Cells.ClearContents
    End With
    Cependant, comme tu l'as fait remarquer, ce code peux vite devenir lourd. Supposons que tu doives supprimer les données sur 10 pages, nous aurions 30 lignes de code... Ou alors utilisons une boucle sur un Array :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim Wsh As Worksheet
     
    For Each Wsh In Worksheets(Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10))
        With Wsh
            .Cells.ClearContents
        End With
    Next
    Remarque : l'Array fonctionne aussi bien et est plus explicite avec les noms des feuilles :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For Each Wsh In Worksheets(Array("Feuil1", "Feuil2", "Feuil3", "Feuil4", "Bilan"))
    Cordialement,
    Franck

  4. #4
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Pour "travailler" sur une feuille autre que la feuille active, il convient d'utiliser un bloc "With End With". Comme ceci :
    Pas forcément. le With ..End With permet d'exécuter un ensemble d'instructions appliquées à un seul objet sans à chaque fois répéter dans le code cet objet.

    Dans ton code, puisque tu as une seule instruction, le With/ End With ajoute des lignes au codes sans plus. Alors que ceci est suffisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheets(1).Cells.ClearContents
    Sinon, pour neoconcept2, la méthode ClearContents est appliquée à un range et non à une worksheet.
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    bonjour, à vous et merci pour vos reponses,

    mercatog, merci pour ta reponse. mais c'est exacement ce que je cherchai à eviter le fait de supprimer le rafraichissement de l'ecran... c'est masquer un probleme avec un autre non?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheets(1).Cells.ClearContents
    cette ligne de code est exactement ce qui me pose probleme!
    toute seul biensur qu'elle fonctionne mais associée à la seconde ca ne marche plus.

    Sinon, pour neoconcept2, la méthode ClearContents est appliquée à un range et non à une worksheet.
    y a t il une difference? (à part le coté selectif biensur) et cela à t il une impact sur mon probleme?

    pijaku, ta reponse semble etre celle que j'attendais, je ne peux pas la tester pour le moment car je suis en cour d'installation de nouveau materiel dans mon lieux de travail et l'ordi sur lequel le projet se trouve ne sera pas dispo avant quelque heures (là je suis sur imac)

    merci à vous! le temps de tester vos idées et je pourrai marquer le probleme comme resolu.

    A charge de revanche!

  6. #6
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    1. Tes explications ne sont pas claires
    2. N’oublie pas d'utiliser F1 pour voir l'aide
    3. Relis les propositions
    4. Encore un exemple (Les commentaires sur le code à lire absolument)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub Clean_All()
     
    Application.ScreenUpdating = False               'Désactive le rafraichissement de l'écran en cours d'exécution de la macro
    'Worksheets(1).ClearContents Fausse parce que ClearContents doit être appliqué à un objet Range et ici on essaire de l'appliquer à la feuille
    Worksheets(1).UsedRange.ClearContents            'On efface le contenu de la plage utilisée de la première feuille
    Worksheets(2).UsedRange.ClearContents
    End Sub
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    bonjour à tous.

    merci pour la precision mercatog

    j'ai tester avec un with et ca ne marche toujours pas.
    l'erreur au passage etant "erreur d'execution: '1004'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub clear_grid()
    With Sheets(1).Range(Cells(1, 1), Cells(Taille, Taille))
        .Cells.ClearContents
    End With
    End Sub
     
    Sub clear_back_grid()
     
    With Sheets(2).Range(Cells(1, 1), Cells(Taille, Taille))
            .Cells.ClearContents
    End With
    End Sub
    j'ai meme essayer ca... (je me doutais bien que ca servirai à rien)

    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
    Sub clear_grid()
    With Sheets(1)
        With .Range(Cells(1, 1), Cells(Taille, Taille))
            .Cells.ClearContents
        End With
    End With
    End Sub
     
    Sub clear_back_grid()
     
    With Sheets(2)
        With .Range(Cells(1, 1), Cells(Taille, Taille))
            .Cells.ClearContents
        End With
    End With
    End Sub
    mercatog

    1. Tes explications ne sont pas claires
    2. N’oublie pas d'utiliser F1 pour voir l'aide
    3. Relis les propositions
    4. Encore un exemple (Les commentaires sur le code à lire absolument)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Sub Clean_All()
     
    Application.ScreenUpdating = False               'Désactive le rafraichissement de l'écran en cours d'exécution de la macro
    'Worksheets(1).ClearContents Fausse parce que ClearContents doit être appliqué à un objet Range et ici on essaire de l'appliquer à la feuille
    Worksheets(1).UsedRange.ClearContents            'On efface le contenu de la plage utilisée de la première feuille
    Worksheets(2).UsedRange.ClearContents
    End Sub
    mercatog,
    je cherche à effacer deux pages avec une macro, je ne peux pas etre plus clair que ca.

    Par contre,cette macro fonctionne!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    sub clear_grid()
    Worksheets(1).UsedRange.ClearContents 
    Worksheets(2).UsedRange.ClearContents
    end sub

    mercatog, sais tu pourquoi ceci ne marche pas?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    sub clear_grid()
    Worksheets(1).Cells.ClearContents
    Worksheets(2).Cells.ClearContents
    end sub
    Aussi pourquoi le with ne marche pas?

    PS: Passer par un autre chemin sans comprendre pourquoi le premier ne marche pas est assez frustrant.

    Merci a vous!
    Cordialement.

  8. #8
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    'Efface toutes les cellules de la 1ère et 2ème feuille
    Sub clear_grid()
     
    Worksheets(1).Cells.ClearContents
    Worksheets(2).Cells.ClearContents
    End Sub
     
    'Efface les plages utilisées  de la 1ère et 2ème feuille
    Sub clear_grid()
     
    Worksheets(1).UsedRange.ClearContents
    Worksheets(2).UsedRange.ClearContents
    End Sub
    Pour moi, ces 2 codes fonctionnent, le 2ème est plus optimal
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    desolé!! je me suis embrouillé.
    tu as raison ces macros fonctionnent.

    je voulai ecrire ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Sub clear_grid()
    Worksheets(1).Range(Cells(1, 1), Cells(9,9)).ClearContents
    Worksheets(2).Range(Cells(1, 1), Cells(9,9)).ClearContents
    End Sub
    message d'erreur:
    "Erreur d'execution '1004':
    Erreur défini par l'application ou par l'objet"

  10. #10
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Utilise l'un des codes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub clear_grid()
     
    Worksheets(1).Range(Worksheets(1).Cells(1, 1), Worksheets(1).Cells(9, 9)).ClearContents
    Worksheets(2).Range(Worksheets(2).Cells(1, 1), Worksheets(1).Cells(9, 9)).ClearContents
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub clear_grid()
     
    With Worksheets(1)
        .Range(.Cells(1, 1), .Cells(9, 9)).ClearContents
    End With
     
    With Worksheets(2)
        .Range(.Cells(1, 1), .Cells(9, 9)).ClearContents
    End With
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub clear_grid()
     
    Worksheets(1).Range("A1:I9").ClearContents
    Worksheets(2).Range("A1:I9").ClearContents
    End Sub
    Ton erreur vient du fait que Cells n'avaient pas leur feuille mère.
    Remarque les points avec l'utilisation de With
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    mercatog merci....

    ca fonctionne et je comprend ton explication.
    cela montre parcontre quelque chose que je n'aurai jamais soupsonner:
    c'est qu'on ne peut pas conciderer dans VBA la notion d'heritage de propriete d'une classe vers une sous classe?

    je pensai que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheets(1).".................."
    donnait heritage du fait que l'on travail sur le worksheets 1 aux sous classes suivantes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Range(cells(X,Y),cells(Z,T)) 'Z>=X et T>=Y
    En tout cas merci encore.

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

Discussions similaires

  1. [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
  2. [XL-2007] creer une macro pour sommer plusieurs feuilles
    Par Joelol dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 11/11/2010, 10h34
  3. [XL-2000] Macro "recherchev" sur plusieurs feuilles
    Par wyzer dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 02/06/2010, 14h07
  4. [Utilisation] Un projet sur plusieurs svn, est-ce possible ?
    Par kolbek dans le forum Subversion
    Réponses: 1
    Dernier message: 08/12/2009, 20h43
  5. une macro executé sur plusieurs BD?
    Par zalalus dans le forum VBA Access
    Réponses: 10
    Dernier message: 04/08/2009, 09h27

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