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 :

Eviter de répéter "Worksheet()" pour définir la feuille de travail [XL-2003]


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
    Analyste d'exploitation
    Inscrit en
    Septembre 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste d'exploitation

    Informations forums :
    Inscription : Septembre 2007
    Messages : 59
    Par défaut Eviter de répéter "Worksheet()" pour définir la feuille de travail
    Bonjour le forum,

    Le sujet : Je veux créer un fichier Excel qui ne contient qu'un bouton macro. La macro doit traiter d'autres fichiers Excel et produire un fichier de résultat. Tous ces fichiers se trouveront dans un autre répertoire que celui de ma macro.

    Le problème : Alors que je charge sans problème des feuilles des fichiers sources dans mon fichier de résultat, au moment de travailler sur ce dernier, il semble qu'Excel considère que le fichier de travail est... celui de la macro

    Le 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
    'Je fixe le répertoire des fichiers sources qui doit être celui de travail travail
    Set Repertoire = Application.FileDialog(msoFileDialogFolderPicker)
        Repertoire.Show
     
        Chemin = Repertoire.SelectedItems(1) & "\"
     
    'Je vise dans une première variable mon fichier résultat qui sera celui qui commence par "NAT"   
        FichierNat = Dir(Chemin & "\NAT*.*")
     
    'Je vise dans une autre variable mon premier fichier source
        FichierDep = Dir(Chemin & "\*.xls")
        i = 1
     
    'J'ouvre mon fichier de travail 
       Workbooks.Open Filename:=FichierNat
     
    'Pour chaque fichier source du répertoire, je copie sa première feuille que j'ajoute à mon fichier résultat
        Do
            If FichierDep <> FichierNat Then
                Workbooks.Open Filename:=Chemin & FichierDep
                Sheets(1).Copy Before:=Workbooks(FichierNat).Sheets(i)
                Windows(FichierDep).Activate
                ActiveWindow.Close
                i = i + 1
     
            End If
     
    'J'avance au prochain fichier source
            FichierDep = Dir()
     
    'La boucle s'arrête au dernier fichier source
        Loop Until FichierDep = ""
     
    'La commande sélectionne bien toutes les feuilles de mon fichier résultat
    ActiveWorkbook.Sheets.Select
     
    'WTF?? Je me retrouve sur le fichier de la macro! : /
    Range("G4:G35").Copy Range("N4")
    Précision : Ca marche si je fais une boucle en utilisant "Worksheet(i)" avant chaque commande (ex : Worksheet(i)Range("G4:G35").Copy Range("N4")).
    Mais je voulais éviter de faire une boucle (il me semblait que traiter globalement les feuilles était plus rapide mais à discuter) et, sinon, je voulais éviter de répéter tout le temps "Worksheet(i)"

    Merci d'avance pour votre aide

  2. #2
    Membre éprouvé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2012
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2012
    Messages : 94
    Par défaut
    Excel, par défaut, considère travailler dans la feuille active du fichier où se trouve la macro (ou dans la feuille où est déclarée la macro). Si tu souhaites travailler sur d'autres feuilles, il faudra les indiquer avec worksheets(..), soit par leur index, soit par leur nom.

    En l'occurence dans ton code tu ne sembles devoir le préciser qu'une fois, mais dans le cas où il faudrait répéter souvent worksheets(..) (ou n'importe quel objet), tu peux utiliser le bloc With :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    with Worksheets(i)
        .Range("G4:G35").Copy .Range("N4")
        ...
    end with
    Toutes méthodes ou variables précédées d'un point seront considérées comme appartenant à worksheets(i) (attention, changer la valeur de i dans le with ne changera pas la feuille de travail, il faut sortir du bloc).

  3. #3
    Invité
    Invité(e)
    Par défaut Bonjour test ça
    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
    Dim XlsSource As Workbook
    Dim XlsCible As Workbook
    'Je fixe le répertoire des fichiers sources qui doit être celui de travail travail
    Set Repertoire = Application.FileDialog(msoFileDialogFolderPicker)
        Repertoire.Show
     
        Chemin = Repertoire.SelectedItems(1) & "\"
     
    'Je vise dans une première variable mon fichier résultat qui sera celui qui commence par "NAT"
        FichierNat = Dir(Chemin & "\NAT*.*")
     
    'Je vise dans une autre variable mon premier fichier source
        FichierDep = Dir(Chemin & "\*.xls")
        I = 1
     
    'J'ouvre mon fichier de travail
       Set XlsCible = Workbooks.Open(FichierNat)
     
    'Pour chaque fichier source du répertoire, je copie sa première feuille que j'ajoute à mon fichier résultat
        Do
            If FichierDep <> FichierNat Then
               Set XlsSource = Workbooks.Open(Chemin & FichierDep)
               XlsSource.Sheets(1).Copy Before:=XlsCible.Sheets(I)
               XlsSource.Close
                I = I + 1
     
            End If
     
    'J'avance au prochain fichier source
            FichierDep = Dir()
     
    'La boucle s'arrête au dernier fichier source
        Loop Until FichierDep = ""
     Dim S As Long
     For S = 1 To XlsCible.Sheets.Count
    'WTF?? Je me retrouve sur le fichier de la macro! : /
         XlsCible.Sheets(S).Range("G4:G35").Copy XlsCible.Sheets(S).Range("N4")
    Next
    Dernière modification par Invité ; 24/05/2013 à 13h50.

  4. #4
    Membre averti
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Septembre 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste d'exploitation

    Informations forums :
    Inscription : Septembre 2007
    Messages : 59
    Par défaut
    Merci pour vos réponses!

    Juste une remarque pour rdurupt : Ta solution change-t-elle fondamentalement quelque chose par rapport à celle de Soraphiroth? Il s'agit toujours d'une boucle et il faudra dans les 2 cas lister les actions à faire pour chaque feuille? (par opposition à faire une sélection globale des feuilles et appliquer chaque instruction au groupe)

    Ce que tu m'as donné marche mais je me retrouve confronté au même problème qui consiste à devoir réutiliser "XlsCible.Sheets(S)" à tout crin pour chacune de mes instructions, sauf à ce que je n'ai pas saisi

    Je teste in extenso la solution "With", merci Soraphiroth

  5. #5
    Invité
    Invité(e)
    Par défaut
    Déjà, l’objet XlsCible t’évite une ambigüité entre le classeur résultat et le classeur où se trouve ta macro !
    D’autre part, à moins que j’ai mal compris tu veux copier pour chaque onglet, le contenu de
    Range("G4:G35") dans Range("N4") du même onglet ? et là je ne voie pas comment faire autrement.

    Ta solution change-t-elle fondamentalement quelque chose par rapport à celle de Soraphiroth?
    Non sauf que tu es sur d’être sur le classeur de résultat !

  6. #6
    Membre averti
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Septembre 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste d'exploitation

    Informations forums :
    Inscription : Septembre 2007
    Messages : 59
    Par défaut
    Merci pour la précision

    Après beaucoup de tâtonnements, j'ai réussi à passer le cap. Merci à tous!

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

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