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 :

Sommes de plusieurs fichiers excel pour avoir un seul fichier, total de chacune des cellules


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 9
    Points : 3
    Points
    3
    Par défaut Sommes de plusieurs fichiers excel pour avoir un seul fichier, total de chacune des cellules
    Bonjour,
    Je me trouve dans une problématique où je veux faire la somme d’un nombre inconnu de fichiers Excel ayant un format similaire, chacun contenant plusieurs feuilles, dans le but d’avoir le total des sommes de leurs différentes cellules.
    Je ne suis pas un grand chef de la programation sur excel, cependant j'ai trouvé une piste qui me semble bonne dans le code ci-dessous.
    Pouriez vous m'éclairer s'il vous plaît ?
    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
     
    Sub Macro1()
    Dim chem As String 'déclare la variable chem (CHEMin d accès)
    Dim fs, d, f1, fd 'déclare les variables fs, d, f1 et fd
    Dim cel As Range 'déclare la variable cel (CELlule)
    Dim cl As Workbook 'déclare la varaible cl (CLasseur)
    Dim t As Double 'déclare la variable t (Total)
     
    '***********************
    'ouverture des classeurs
    '***********************
    chem = ThisWorkbook.Path & "C:\Users\A145749\Downloads\New folder" 'définit le chemin
    Set fs = CreateObject("Scripting.FileSystemObject") 'définit la variable fs (Fichiers Système)
    Set d = fs.GetFolder(chem) 'definit la variable d (dossier)
    Set fd = d.Files 'définit la variable fd (Fichiers du Dossier)
    For Each f1 In fd 'boucle sur tous les fichier du dossier
       If f1.Name <> "TOTAL.xls" Then Workbooks.Open chem & f1.Name 'ouvre le fichier
    Next f1
     
    '*****************
    'calcul des totaux
    '*****************
    For Each cel In ThisWorkbook.Sheets("Sheet1").Range("A1:A10") 'boucle 1 : sur toutes les cellules cel de la plage A1:A10 de l'onglet "Feuil1" (tu adapteras le nom de l'onglet si il faut...)
       If cel.Interior.ColorIndex = 38 Then 'condition 1 : si le couleur de fond de la cellule est rose
            For Each cl In Workbooks 'boucle 2 : sur tous les classeurs ouverts
               If cl.Name <> ThisWorkbook.Name Then 'condition 2 : si le nom du classseur est différent du nom de celui-ci
                   'redéfinit la variable t si la cellule correspondante est numérique
                   If IsNumeric(cl.Sheets("Sheet1").cel.Address) Then t = t + CDbl(cl.Sheets("Sheet1").cel.Address)
                End If 'fin de la condition 2
           Next cl 'prochain classeur de la boucle 2
           cel.Value = t 'place t dans la cellule cel
       End If 'fin de la condition 1
    Next cel 'prochaine cellul cel de la boucle 1
     
    '***********************
    'fermeture des classeurs
    '***********************
    For Each cl In Workbooks
        If cl.Name <> ThisWorkbook.Name Then cl.Close SaveChanges:=False 'ferme le fichier
    Next cl
    End Sub
    Merci d'avance

  2. #2
    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 variante avec une boite de dialogue pour choisir les classeurs.
    Ici, les plages dans les différents classeurs sont sensé être identiques. Pour le test, je prend la zone utilisée (UsedRange) de chaque feuille. Toutes les cellules de chaque feuille de chaque classeur sont totalisées. Adapte...
    Pour lancer, curseur dans le code et F5 :
    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
     
    Sub Test()
     
        Dim Cls As Workbook
        Dim Fe As Worksheet
        Dim Tbl() As String
        Dim TblTotal() As Double
        Dim Plage As Range
        Dim Retour As Integer
        Dim I As Integer
        Dim J As Long
        Dim K As Long
        Dim Ini As Boolean
     
        'affiche la boite de dialogue
        With Application.FileDialog(msoFileDialogFilePicker)
     
            'au moins un classeur doit être sélectionné sinon, fin...
            Retour = .Show
            If Retour = 0 Then Exit Sub
     
            'stocke les chemins et nom de fichier dans un tableau pour le bouclage
            For I = 1 To .SelectedItems.Count
     
                ReDim Preserve Tbl(1 To I)
                Tbl(I) = .SelectedItems(I)
     
            Next I
     
        End With
     
        'boucle sur les classeurs
        For I = 1 To UBound(Tbl)
     
            Set Cls = Workbooks.Open(Tbl(I))
     
            'boucle sur les feuilles du classeurs en cours
            For Each Fe In Cls.Worksheets
     
                'défini la plage sur la zone utilisée de la feuille en cours
                Set Plage = Fe.UsedRange
     
                'initialise le tableau seulement à l'ouverture du premier classeur et sur la première feuille
                If I = 1 And Ini = False Then
     
                    ReDim TblTotal(1 To Plage.Rows.Count, 1 To Plage.Columns.Count)
                    Ini = True
     
                End If
     
                'boucle sur les lignes
                For J = 1 To UBound(TblTotal, 1)
     
                    'boucle sur les colonnes
                    For K = 1 To UBound(TblTotal, 2)
     
                        'gère l'erreur d'un valeur non numérique ou autre (plus simple pour le test...)
                        On Error Resume Next
     
                        'totalise les cellules dans le tableau
                        TblTotal(J, K) = TblTotal(J, K) + Plage(J, K)
     
                    Next K
     
                Next J
     
            Next Fe
     
            'ferme le classeur en cours
            Cls.Close False
     
        Next I
     
        'affiche les résultat dans la feuille active de A1 à Xx...
        With ActiveSheet
     
            .Range(.Cells(1, 1), .Cells(UBound(TblTotal, 1), UBound(TblTotal, 2))) = TblTotal
     
        End With
     
    End Sub
    Hervé.

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Bonjour Hervé,

    Merci pour ta réponse, je ne crois pas avoir tout cerné ce que tu me proposes de faire.
    En gros, je dois dire où se situe chacune des cellules numériques, et la macro sera capable de les additionner dans un fichier type, je me trompe ?

    Ci-joint un fichier type, pour être plus précis mon objectif est de faire la somme des cellules où il y a une cotation (valeur 1 à chaque fois) des différents fichiers types

    Bonne journée à toi ainsi qu'à la communauté
    Fichiers attachés Fichiers attachés

  4. #4
    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,
    En gros, je dois dire où se situe chacune des cellules numériques, et la macro sera capable de les additionner dans un fichier type, je me trompe ?
    Tu ne te trompe pas, si tu veux faire la somme de certaines cellules de chaque feuille de chaque classeur, il est évident qu'il faut indiquer au compilateur lesquelles prendre en compte !
    Donc, il faut préciser quelle(s) feuille(s) de chaque classeur, puis quelle(s) cellule(s) de chaque feuille doit ou doivent être prise(s) en compte.
    Pour l'instant, tes explications sont trop vagues. Le code que je t'ai posté est un exemple, il t'est demandé de choisir sur le disque le ou les classeurs que tu veux prendre en compte et toujours pour l'exemple, la somme de chaque cellule utilisée de chaque feuille est faite dans un tableau et à la fin, ce tableau est inséré dans la feuille active du classeur contenant la macro.

    Hervé.

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    Je vous remercie encore un fois Hervé, vous m'apportez une grande aide. Et étant actuellement novice, je ne comprends pas tout à Excel. Cependant, vous avez largement compris ce que je veux faire.

    Ma question à votre réponse qui va surement vous parraitre bête est : "comment indiquer au compilateur ce qu'il doit prendre en compte ?"

    Mes salutations

  6. #6
    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,

    "comment indiquer au compilateur ce qu'il doit prendre en compte ?"
    Et bien, dis moi déjà les feuilles et cellules que tu souhaite prendre en compte et ensuite, j'essaierai de t'aider (ces quatre jours je ne serai pas là)

    Hervé.

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Bonjour Hervé,

    J’apprécie vraiment, c’est très sympathique de votre part.
    Voici les plages concernées, classées comme suit (Nom de la feuille ; début de la plage coin supérieur gauche ; fin de la plage coin inférieur droit)

    - General Appearance ; D10 ; G24

    - Reception_Pre-diagnosis ; D10 ; G11
    - Reception_Pre-diagnosis ; D15 ; G18
    - Reception_Pre-diagnosis ; D23 ; G29

    - Diagnosis and Repair ; D10 ; G10
    - Diagnosis and Repair ; D15 ; G16
    - Diagnosis and Repair ; D20 ; G23

    - Handover ; D10 ; G14

    - Invoicing ; D10 ; G13

    Je vous souhaite un excellent week-end

  8. #8
    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,

    Teste ce qui suit et contrôle si le résultat est correct, tu doit mieux le percevoir que moi. Il faut que tu supprime la fusion des cellules de la feuille "General Appearance" de façon à ce que la plage soit "D10:G17" et non" D10:G24" :
    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
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
     
    Sub Test()
     
        Dim Cls As Workbook
        Dim Fe As Worksheet
        Dim Tbl() As String
        Dim TblTotal() As Double
        Dim Plage As Range
        Dim Retour As Integer
        Dim I As Integer
        Dim J As Long
        Dim K As Long
     
        'affiche la boite de dialogue
        With Application.FileDialog(msoFileDialogFilePicker)
     
            'au moins un classeur doit être sélectionné sinon, fin...
            Retour = .Show
            If Retour = 0 Then Exit Sub
     
            'stocke les chemins et nom de fichier dans un tableau pour le bouclage
            For I = 1 To .SelectedItems.Count
     
                ReDim Preserve Tbl(1 To I)
                Tbl(I) = .SelectedItems(I)
     
            Next I
     
        End With
     
        'initialise le tableau par rapport à la plus grande plage (feuille "Reception_Pre-diagnosis")
        ReDim TblTotal(1 To 13, 1 To 4)
     
        'boucle sur les classeurs
        For I = 1 To UBound(Tbl)
     
            Set Cls = Workbooks.Open(Tbl(I))
     
            'boucle sur les feuilles définies du classeurs en cours
            For Each Fe In Cls.Worksheets(Array("General Appearance", _
                                                "Reception_Pre-diagnosis", _
                                                "Diagnosis and Repair", _
                                                "Handover", _
                                                "Invoicing"))
     
                Select Case Fe.Name
     
                    'défini la plage sur la zone voulue pour chaque feuille concernée
                    Case "General Appearance"
                        Set Plage = Fe.Range("D10:G17")
     
                    Case "Reception_Pre-diagnosis"
                        Set Plage = Fe.Range("D10:G29")
     
                    Case "Diagnosis and Repair"
                        Set Plage = Fe.Range("D10:G23")
     
                    Case "Handover"
                        Set Plage = Fe.Range("D10:G14")
     
                    Case "Invoicing"
                        Set Plage = Fe.Range("D10:G13")
     
                End Select
     
                'boucle sur les lignes
                For J = 1 To Plage.Rows.Count
     
                    'boucle sur les colonnes
                    For K = 1 To Plage.Columns.Count
     
                        'gère l'erreur d'un valeur non numérique ou autre (plus simple pour le test...)
                        On Error Resume Next
     
                        'évite les lignes à ne pas prendre en compte dans les deux feuilles à plages multiples
                        If Fe.Name = "Reception_Pre-diagnosis" Then
     
                            Select Case J
     
                                Case 1, 2, 6 To 9, 13 To 19
                                    'totalise les cellules dans le tableau
                                    TblTotal(J, K) = TblTotal(J, K) + Plage(J, K)
     
                                Case Else
     
                                    Exit For
     
                            End Select
     
                        ElseIf Fe.Name = "Diagnosis and Repair" Then
     
                            Select Case J
     
                                Case 1, 6, 7, 11 To 14
                                    'totalise les cellules dans le tableau
                                    TblTotal(J, K) = TblTotal(J, K) + Plage(J, K)
     
                                Case Else
     
                                    Exit For
     
                            End Select
     
                        Else
     
                            'totalise les cellules dans le tableau
                            TblTotal(J, K) = TblTotal(J, K) + Plage(J, K)
     
                        End If
     
                    Next K
     
                Next J
     
            Next Fe
     
            'ferme le classeur en cours
            Cls.Close False
     
        Next I
     
        'affiche les résultat dans la feuille active de A1 à Xx...
        With ActiveSheet
     
            .Range(.Cells(1, 1), .Cells(UBound(TblTotal, 1), UBound(TblTotal, 2))) = TblTotal
     
        End With
     
    End Sub
    Hervé.

  9. #9
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Bonjour et merci pour tout Herve,

    Cependant, je ne comprends pas tout à fait où tu veux en venir. En tout cas, lorsque j’essaye avec un seul fichier. Je me retrouve avec une feuille qui comprend une plage de résultat qui va d’A1 à D13. Certain résultats sont des chiffres supérieures à 1 alors qu’il ne devrait pas y en avoir (un fichier seulement).

    Ci-joint deux fichiers types avec un dernier fichier représentant le total des deux autres pour une mise en image. Tu seras ainsi plus à même de tester le code proposé chez toi.
    TypeTOTAL.xlsType2.xlsType1.xls

    Je te remercie encore pour l’aide que tu m’apportes, bonne journée

    Paul-Arthur

  10. #10
    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,

    Certain résultats sont des chiffres supérieures à 1 alors qu’il ne devrait pas y en avoir (un fichier seulement)
    Effectivement, il y avait une ligne cachée dans une feuille que je n'avais pas vu !
    D'un autre coté, il y a une chose que je ne saisi pas, tu dis qu'il y a des chiffres supérieurs à 1 alors qu'il n'y a qu'un classeur mais la totalisation porte sur toutes les feuilles du classeur donc c'est normal que certains chiffres soient supérieurs à 1 ??? Tu veux quoi au juste, une totalisation par feuille ? Dans ce cas, il faut utiliser plusieurs tableaux (1 par feuille).
    Le code avec la correction :
    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
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
     
    Sub Test()
     
        Dim Cls As Workbook
        Dim Fe As Worksheet
        Dim Tbl() As String
        Dim TblTotal() As Double
        Dim Plage As Range
        Dim Retour As Integer
        Dim I As Integer
        Dim J As Long
        Dim K As Long
     
        'affiche la boite de dialogue
        With Application.FileDialog(msoFileDialogFilePicker)
     
            'au moins un classeur doit être sélectionné sinon, fin...
            Retour = .Show
            If Retour = 0 Then Exit Sub
     
            'stocke les chemins et nom de fichier dans un tableau pour le bouclage
            For I = 1 To .SelectedItems.Count
     
                ReDim Preserve Tbl(1 To I)
                Tbl(I) = .SelectedItems(I)
     
            Next I
     
        End With
     
        'initialise le tableau par rapport à la plus grande plage (feuille "Reception_Pre-diagnosis")
        ReDim TblTotal(1 To 13, 1 To 4)
     
        'boucle sur les classeurs
        For I = 1 To UBound(Tbl)
     
            Set Cls = Workbooks.Open(Tbl(I))
     
            'boucle sur les feuilles définies du classeurs en cours
            For Each Fe In Cls.Worksheets(Array("General Appearance", _
                                                "Reception_Pre-diagnosis", _
                                                "Diagnosis and Repair", _
                                                "Handover", _
                                                "Invoicing"))
     
                Select Case Fe.Name
     
                    'défini la plage sur la zone voulue pour chaque feuille concernée
                    Case "General Appearance"
                        Set Plage = Fe.Range("D10:G17")
     
                    Case "Reception_Pre-diagnosis"
                        Set Plage = Fe.Range("D10:G29")
     
                    Case "Diagnosis and Repair"
                        Set Plage = Fe.Range("D10:G23")
     
                    Case "Handover"
                        Set Plage = Fe.Range("D10:G14")
     
                    Case "Invoicing"
                        Set Plage = Fe.Range("D10:G13")
     
                End Select
     
                'boucle sur les lignes
                For J = 1 To Plage.Rows.Count
     
                    'boucle sur les colonnes
                    For K = 1 To Plage.Columns.Count
     
                        'gère l'erreur d'un valeur non numérique ou autre (plus simple pour le test...)
                        On Error Resume Next
     
                        'évite les lignes à ne pas prendre en compte dans les deux feuilles à plages multiples
                        If Fe.Name = "Reception_Pre-diagnosis" Then
     
                            Select Case J
     
                                Case 1, 2, 6 To 9, 14 To 20
                                    'totalise les cellules dans le tableau
                                    TblTotal(J, K) = TblTotal(J, K) + Plage(J, K)
     
                                Case Else
     
                                    Exit For
     
                            End Select
     
                        ElseIf Fe.Name = "Diagnosis and Repair" Then
     
                            Select Case J
     
                                Case 1, 6, 7, 11 To 14
                                    'totalise les cellules dans le tableau
                                    TblTotal(J, K) = TblTotal(J, K) + Plage(J, K)
     
                                Case Else
     
                                    Exit For
     
                            End Select
     
                        Else
     
                            'totalise les cellules dans le tableau
                            TblTotal(J, K) = TblTotal(J, K) + Plage(J, K)
     
                        End If
     
                    Next K
     
                Next J
     
            Next Fe
     
            'ferme le classeur en cours
            Cls.Close False
     
        Next I
     
        'affiche les résultat dans la feuille active de A1 à Xx...
        With ActiveSheet
     
            .Range(.Cells(1, 1), .Cells(UBound(TblTotal, 1), UBound(TblTotal, 2))) = TblTotal
     
        End With
     
    End Sub
    Hervé.

  11. #11
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    Oui je veux additionner chacune des plages de chaque feuille entre les fichiers.
    Dans l’idée pour une cellule donnée A1 , par exemple, ( A1 ; classeur 1 ; feuille 1) + ( A1 ; classeur 2 ; feuille 1) + ( A1 ; classeur 3 ; feuille 1) + etc…

    PS : J’avais pensé à créer et ajouter une feuille modèle dans chacun des classeurs, qui m’aurait permis de sélectionner seulement les plages de cellules qui m’intéressent. Ensuite, il doit être plus simple d’additionner chacun des classeurs ensemble pour avoir le total des cellules sélectionnées dans cette nouvelle feuille. Cependant, je n’arrive pas à ajouter ni même à copié une feuille sans qu’elle ne garde pas un ancrage d’origine dans le classeur duquel elle est extraite ou qu’il y est une incompatibilité.

    Merci et bonne journée,

    Bien à toi Hervé.

  12. #12
    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,

    Bon, finalement je suis parti sur un tableau à 3 dimensions pour récupérer les valeurs de chaque feuille et les résultats sont affichés dans la feuille active du classeur où est située la macro (pour le test, ajouter une feuille vierge et la garder active, affichée) le nom de chaque feuille est affiché avant chaque résultat :
    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
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
     
    Sub Test()
     
        Dim Cls As Workbook
        Dim Fe As Worksheet
        Dim Tbl() As String
        Dim TblTotal() As Double
        Dim TblNom
        Dim Plage As Range
        Dim Retour As Integer
        Dim I As Integer
        Dim J As Long
        Dim K As Long
        Dim L As Integer
     
        'affiche la boite de dialogue
        With Application.FileDialog(msoFileDialogFilePicker)
     
            'au moins un classeur doit être sélectionné sinon, fin...
            Retour = .Show
            If Retour = 0 Then Exit Sub
     
            'stocke les chemins et nom de fichier dans un tableau pour le bouclage
            For I = 1 To .SelectedItems.Count
     
                ReDim Preserve Tbl(1 To I)
                Tbl(I) = .SelectedItems(I)
     
            Next I
     
        End With
     
        'initialise le tableau par rapport à la plus grande plage (feuille "Reception_Pre-diagnosis")
        ReDim TblTotal(1 To 13, 1 To 4, 1 To 5)
     
        'boucle sur les classeurs
        For I = 1 To UBound(Tbl)
     
            Set Cls = Workbooks.Open(Tbl(I))
     
            TblNom = Array("General Appearance", _
                           "Reception_Pre-diagnosis", _
                           "Diagnosis and Repair", _
                           "Handover", _
                           "Invoicing")
     
            'boucle sur les feuilles définies du classeurs en cours
            For Each Fe In Cls.Worksheets(TblNom)
     
                Select Case Fe.Name
     
                    'défini la plage sur la zone voulue pour chaque feuille concernée
                    Case "General Appearance"
                        Set Plage = Fe.Range("D10:G17")
     
                    Case "Reception_Pre-diagnosis"
                        Set Plage = Fe.Range("D10:G29")
     
                    Case "Diagnosis and Repair"
                        Set Plage = Fe.Range("D10:G23")
     
                    Case "Handover"
                        Set Plage = Fe.Range("D10:G14")
     
                    Case "Invoicing"
                        Set Plage = Fe.Range("D10:G13")
     
                End Select
     
                'boucle sur les lignes
                For J = 1 To Plage.Rows.Count
     
                    'boucle sur les colonnes
                    For K = 1 To Plage.Columns.Count
     
                        'gère l'erreur d'un valeur non numérique ou autre (plus simple pour le test...)
                        On Error Resume Next
     
                        Select Case Fe.Name
     
                            Case "General Appearance"
                                TblTotal(J, K, 1) = TblTotal(J, K, 1) + Plage(J, K)
     
                            Case "Reception_Pre-diagnosis"
     
                               Select Case J
     
                                   Case 1, 2, 6 To 9, 14 To 20
                                       'totalise les cellules dans le tableau
                                       TblTotal(J, K, 2) = TblTotal(J, K, 2) + Plage(J, K)
     
                                   Case Else
     
                                       Exit For
     
                               End Select
     
                           Case "Diagnosis and Repair"
     
                               Select Case J
     
                                   Case 1, 6, 7, 11 To 14
                                       'totalise les cellules dans le tableau
                                       TblTotal(J, K, 3) = TblTotal(J, K, 3) + Plage(J, K)
     
                                   Case Else
     
                                       Exit For
     
                               End Select
     
                            Case "Handover"
                                TblTotal(J, K, 4) = TblTotal(J, K, 4) + Plage(J, K)
     
                            Case "Invoicing"
                                TblTotal(J, K, 5) = TblTotal(J, K, 5) + Plage(J, K)
     
                        End Select
     
                    Next K
     
                Next J
     
            Next Fe
     
            'ferme le classeur en cours
            Cls.Close False
     
        Next I
     
        'affiche les résultats les uns au dessous des autres dans la feuille active
        L = 1
     
        With ActiveSheet
     
            For I = 1 To UBound(TblTotal, 3)
     
                .Cells(L, 1) = TblNom(I - 1)
     
                For J = 1 To UBound(TblTotal, 1)
     
                    For K = 1 To UBound(TblTotal, 2)
     
                        .Cells(J + L, K) = TblTotal(J, K, I)
     
                    Next K
     
                Next J
     
                L = L + 14
     
            Next I
     
        End With
     
    End Sub
    Hervé.

  13. #13
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Super Hervé,

    Reste un problème, est ce que chez vous vous avez la plupart des lignes du tableau qui ne sont pas comptabilisées ? C’est-à-dire 0 ; 0 ; 0 ; 0
    Cela veut-il dire que la macro n’arrive pas à extraire l’information de certaine ligne ?

    Un grand merci

  14. #14
    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
    Bonsoir,

    Alors, déjà as-tu supprimé les cellules fusionnées de la feuille "General Appearance" de chaque classeur car dans mon exemple, la plage est définie de D10 à G17 (Set Plage = Fe.Range("D10:G17") ) et non de D10 à G24 ? Souvent un grand nombre d'erreurs sont dues au fusionnage de cellules, chose qui doit être évité autant que faire ce peut.
    Le fait que tu as des cellules indiquant des valeurs égales à zéro (0) c'est d'une part les cellules vides (donc non renseignées par les valeurs 1) et d'autre part, comme indiqué plus haut, comme les plages des différentes feuilles de chaque classeur ne sont pas identiques, il a fallu que je dimensionne le tableau par rapport à la plage la plus grande et comme ce tableau est typé "Double" (Dim TblTotal() As Double) qui soit dit en passant peut être typé "Integer" voir même "Byte" (type assez peut utilisé) car je ne savait pas tout, est initialisé à zéro (0).
    Maintenant, il te faut faire des ajustements pour récupérer les valeurs comme tu le désire car j'ai posté un code pour l'exemple et non un classeur fini prêt à être utilisé !

    Hervé.

  15. #15
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    Je suis arrivé à bricoler le code pour que cela fonctionne, c'est formidable, un immense merci Hervé.
    Un seul B mol qui n'est pas dramatique, les fichiers doivent tous être dans le même dossier, alors qu'il se situe à chaque fois dans des sous-dossier, je ne sais pas s'il y a une technique pour passer outre.

    Mille mercis

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

Discussions similaires

  1. [XL-2010] copier depuis des fichiers excel identiques vers un seul fichier excel sous vba
    Par fleur-d'orient dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 03/01/2015, 17h29
  2. Macro pour créer plusieurs tables access a partir d'un fichier Excel
    Par jonathan810 dans le forum Macros Access
    Réponses: 6
    Dernier message: 02/05/2013, 15h01
  3. Réponses: 1
    Dernier message: 28/02/2012, 18h30
  4. Réponses: 5
    Dernier message: 22/04/2011, 20h54
  5. [XL-2003] Création d'un fichier Excel à chaque rupture d'un fichier Excel de référence.
    Par Richard_35 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 24/08/2010, 16h08

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