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 |
Partager