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 :

[VBA] Extraction de 12 cellules sur x feuilles d'un classeur sur une dernière feuille


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2017
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2017
    Messages : 15
    Points : 5
    Points
    5
    Par défaut [VBA] Extraction de 12 cellules sur x feuilles d'un classeur sur une dernière feuille
    Bonjour à tous

    Je viens demander à la communauté un petit coup de pouce
    Pour un travail scolaire de groupe, nous travaillons sur des compteurs d'heures.

    Nous avons besoin de travailler sur une macro pour nous automatiser une tâche :
    Nous avons besoin d'aide pour extraire sur chaque feuille d'un fichier Excel le nombre contenu dans 12 cellules (par feuilles) et les copier sur une dernière feuille "SYNTHESE"
    Il y à + de 100 feuilles alors a la main aie aie aie !

    Merci à vous pour l'aide et les conseils

  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 761
    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 761
    Points : 28 619
    Points
    28 619
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    extraire sur chaque feuille d'un fichier Excel le nombre contenu dans 12 cellules (par feuilles)
    Plus on est précis, plus on a de chance d'avoir une réponse rapide et pertinente.
    Pour les 12 cellules
    • combien de colonnes, de lignes
    • la première ligne contient-elle une ou plusieurs étiquettes de colonnes
    • à quelle adresse commence la première cellule et cette adresse est-elle la même dans chaque feuille
    • etc.
    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
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2017
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2017
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    Bonjour Philippe,
    Je vais tâcher de faire plus attention et d'être exhaustif.

    Pour les 12 cellules :
    Elles sont communes à toutes les feuilles : Colonne "R" en constante et ligne 34, 69, 97,132, 160, 188,223,251,279,314,342 et 370
    L'extraction est donc : sur toutes les feuilles extraire les cellules $R$34,69,97...


    Merci à vous

  4. #4
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Septembre 2013
    Messages
    783
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2013
    Messages : 783
    Points : 1 562
    Points
    1 562
    Par défaut
    Bonjour,

    Ce n'est pas forcément optimisé, mais vous pouvez adapter et essayer le code ci-dessous. Il y a peut-être plus efficace

    Sub Test: procédure appelante, on sauve le résultat dans ResAR (tableau)
    Extract_Data: on sort sous forme de tableau les valeurs des Range (spécifiées par l'argument SrcRngAd, ici "A3,A5,A7, A11") pour toutes les feuilles du classeur et on retourne ce tableau


    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
    Sub Test()
     
    Dim ResAR As Variant
     
        ResAR = Extract_Data("A3,A5,A7, A11")   'A remplacer par "R" en constante et ligne 34, 69, 97,132, 160, 188,223,251,279,314,342 et 370
     
    End Sub
    Function Extract_Data(SrcRngAd As String) As Variant
     
    Dim Wsh As Worksheet
    Dim SrcRng As Range, Cl As Range
    Dim ExtrAR As Variant
    Dim ClIndI As Integer, CntClI As Integer
     
     
    ' Initialisation
        'On dimensionne le tableau résultat en fonction du nombre de feuilles et d'adresses passées dans SrcRngAd
        ReDim ExtrAR(1 To ThisWorkbook.Worksheets.Count, 1 To UBound(Split(SrcRngAd, ",", , vbTextCompare), 1) + 1)
     
    ' Parcours toutes les sheets et sauve le résultat du SrcRng dans le tableau
        For Each Wsh In ThisWorkbook.Worksheets
     
            CntClI = 0
     
            Set SrcRng = Wsh.Range(SrcRngAd)
     
            For Each Cl In SrcRng.Cells
     
                CntClI = CntClI + 1
                ExtrAR(Wsh.Index, CntClI) = Cl.Value
     
            Next Cl
     
        Next Wsh
       ' On retourne le résultat
        Extract_Data = ExtrAR
     
    End Function
    "Idéalement nous sommes ce que nous pensons. Dans la réalité, nous sommes ce que nous accomplissons." A.Senna
    et n'oubliez-pas de développer des .... sourires ^_^

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2017
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2017
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    Merci,

    On à beau modifier et jongler avec la formule rien ne change,
    La feuille reste désespérément vide.

  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 761
    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 761
    Points : 28 619
    Points
    28 619
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Il faut modifier la valeur de la constante nommée rngAddress pour y placer les bonnes adresses de cellules
    On considère dans cette procédure qu'il n'y a pas d'étiquette de colonne dans la colonne cible.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub Regroupement()
     Const rngAddress As String = "R34,R69,R97"
     Const shtTargetName As String = "synthese"
     Dim sht As Worksheet, flag As Boolean
     With ThisWorkbook
      .Worksheets(shtTargetName).Cells.Clear
      For Each sht In .Worksheets
       If Trim(LCase(sht.Name)) <> shtTargetName Then
        sht.Range(rngAddress).Copy .Worksheets(shtTargetName).Range("A" & Application.Rows.Count).End(xlUp).Offset(Abs(flag)): flag = True
       End If
      Next
     End With
    End Sub
    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
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Bonjour,

    Une autre piste :
    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
     
    Sub Test()
     
        Dim Fe As Worksheet
        Dim Tbl
        Dim Tablo(1 To 12)
        Dim I As Integer
        Dim J As Integer
     
        Tbl = Array(34, 69, 97, 132, 160, 188, 223, 251, 279, 314, 342, 370)
     
        For Each Fe In Worksheets
     
            If Fe.Name <> "SYNTHESE" Then
     
                For I = 0 To UBound(Tbl): Tablo(I + 1) = Fe.Range("R" & Tbl(I)).Value: Next I
     
                J = J + 1
     
                Worksheets("SYNTHESE").Range("A" & J & ":L" & J).Value = Tablo()
     
            End If
     
        Next Fe
     
    End Sub

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2017
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2017
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    Merci à vous !
    C'est nickel et si j'ai bien compris entre :

    End If
    Next
    End With

    Je peux rajouter une fonction ?
    J'aimerais en plus rajouter la fonction "Prend le nom de la feuille 1 et saute 11 lignes puis prend le nom de la feuille 2 et saute 11 ligne etc.."
    Tout en l'intégrant dans le macro précédant.

  9. #9
    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 761
    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 761
    Points : 28 619
    Points
    28 619
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Je peux rajouter une fonction ?
    J'aimerais en plus rajouter la fonction "Prend le nom de la feuille 1 et saute 11 lignes puis prend le nom de la feuille 2 et saute 11 ligne etc.."
    Tout en l'intégrant dans le macro précédant.
    Tout est possible, il faut juste savoir ce que l'on veut faire et ensuite réfléchir à la meilleure manière d'effectuer le travail.

    ps
    Prend le nom de la feuille 1 et saute 11 lignes puis prend le nom de la feuille 2 et saute 11 ligne etc..
    Finalement ce n'était pas pareil pour toutes les feuilles
    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

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2017
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2017
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    Prend le nom de la feuille 1 et saute 11 lignes puis prend le nom de la feuille 2 et saute 11 lignes, etc..
    Effectivement, je pensais que vous parliez de la récurrence.

    Alors je vais reprendre exhaustivement

    Je possède un fichier excel rassemblant des heures de travails de x collaborateurs.
    A chaque fin de moi une colonne ($R$31, .. et ce 12 fois (mois de l'année).
    Chaque feuille correspondant à un collaborateur.

    J'ai besoin d'une dernière feuille qui me dise collaborateur1 (nom de la feuille) en B2 (par exemple); En B3 que ce soit les heures de janvier et du coup en B4 les heures de Fevrier...
    Collaborateur2 sera donc en C2 avec en C3 les heures de janvier..

    Avez-vous compris le sens de ma demande ?

    Merci à vous, pour votre aide, sincèrement.

  11. #11
    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 761
    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 761
    Points : 28 619
    Points
    28 619
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Je pense qu'avec les réponses déjà obtenues tu devrais déjà pouvoir réaliser ce travail non ?
    Le nom de la feuille (sht.Name) est déjà évoqué dans la procédure que j'ai proposée.
    C'est un club d'entraide. Il y a lieu de faire des tests, voir ce qui ne va pas, etc. et ensuite revenir pour expliquer où l'on a un problème.
    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

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2017
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2017
    Messages : 15
    Points : 5
    Points
    5
    Par défaut Merci
    Merci pour l'aide

    J'ai réussi et suis assez content, mais je n'arrive pas à paramétrer une commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub Regroupement()
     Const rngAddress As String = "M1"
     Const shtTargetName As String = "synthese"
     Dim sht As Worksheet, flag As Boolean
     With ThisWorkbook
      .Worksheets(shtTargetName).Cells.Clear
      For Each sht In .Worksheets
       If Trim(LCase(sht.Name)) <> shtTargetName Then
        sht.Range(rngAddress).Copy .Worksheets(shtTargetName).Range("A2" & Application.Rows.Count).End(xlUp).Offset(Abs(flag)): flag = True
       End If
      Next
     End With
     End Sub
    J'ai besoin que la copie de donnée soit apposé en "A2" laissant ainsi la ligne 1 vierge.

    Concernant celui-ci :
    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
    Sub Heures()
         Dim Fe As Worksheet
        Dim Tbl
        Dim Tablo(1 To 12)
        Dim I As Integer
        Dim J As Integer
         Tbl = Array(34, 69, 97, 132, 160, 188, 223, 251, 279, 314, 342, 370)
         For Each Fe In Worksheets
             If Fe.Name <> "SYNTHESE" Then
                 For I = 0 To UBound(Tbl): Tablo(I + 1) = Fe.Range("R" & Tbl(I)).Value: Next I
                 J = J + 1
                 Worksheets("SYNTHESE").Range("B" & J & ":M" & J).Value = Tablo()
             End If
         Next Fe
     End Sub
    J'ai réussi à le comprendre et à l'ajuster à mes besoins, mais ici je ne vois pas la possibilité d'appliquer la commande débute en "B2".

    Merci

Discussions similaires

  1. Réponses: 12
    Dernier message: 27/07/2014, 10h51
  2. Réponses: 2
    Dernier message: 27/06/2014, 11h50
  3. Réponses: 0
    Dernier message: 16/05/2014, 13h30
  4. Réponses: 5
    Dernier message: 15/07/2013, 10h32
  5. Réponses: 7
    Dernier message: 25/09/2008, 14h51

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