Bonjour le fil, bonjour le forum,
Une autre proposition VBA en pièce jointe avec un CommandButton Récup etle code ci-dessous :
Private Sub CommandButton1_Click()
Dim OSA As Worksheet 'déclare la variable OSA (Onglet Service A)
Dim OSB As Worksheet 'déclare la variable OSB (Onglet Service B)
Dim OSC As Worksheet 'déclare la variable OSC (Onglet Service C)
Dim OB As Worksheet 'déclare la variable OB (Onglet Bilan)
Dim CAP() As Variant 'déclare le tableau de variables CAP (Colonnes À Copier)
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim DLO As Integer 'déclare la variable DLO (Dernière Ligne de l'Onglet en cours)
Dim DLB As Integer 'déclare la variable DLB (Dernière Ligne de Bilan)
Dim I As Integer 'déclare la variable I (Incrément)
Dim J As Byte 'déclare la variable J (incrément)
Dim K As Byte 'déclare la variable K (incrément)
Application.ScreenUpdating = False 'masque les rafraîchissements d'écran
Set OSA = Worksheets("Service A") 'définit l'onglet OSA
Set OSB = Worksheets("Service B") 'définit l'onglet OSB
Set OSC = Worksheets("Service C") 'définit l'onglet OSC
Set OB = Worksheets("Bilan") 'définit l'onglet Bilan
OB.Range("A1").CurrentRegion.Offset(1, 0).ClearContents 'efface les anciennes données de l'onglet Bilan
For Each O In Worksheets 'boucle 1 : sur tous les onglets O du classeur
If Not O.Name = "Bilan" Then 'condition : si le nom de l'onglet n'est pas "Bilan"
Select Case O.Name 'agit en fonction du nom de l'onglet O
Case "Service A" 'cas "Service A"
CAP = Array(1, 6, 7, 8, 9) 'définit les colonnes à copier
Case "Service B" 'cas "Service B"
CAP = Array(1, 4, 5, 6, 7) 'définit les colonnes à copier
Case "Service C" 'cas "Service C"
CAP = Array(1, 3, 4, 5, 6) 'définit les colonnes à copier
End Select 'fin de l'action en fonction du nom de l'onglet O
DLO = O.Cells(Application.Rows.Count, ("A")).End(xlUp).Row 'définit la dernière ligne éditée de l'onglet O
For I = 2 To DLO 'boucle 2 : des lignes 2 à DLO
DLB = OB.Cells(Application.Rows.Count, "A").End(xlUp).Row + 1 'définit la première ligne vide de l'onglet OB
For J = 0 To 4 'boucle 3 : sur les 5 colonnes à copier
If J = 0 Then K = J + 1 Else K = J + 2 'si J est supérieure à 0 alors K = J + 2 (à cause de la construction de ton tableau !)
OB.Cells(DLB, K).Value = O.Cells(I, CAP(J)).Value 'récupère dans la cellule ligne DLB colonne K de l'onglet OB, la valeur de la cellule ligne I colonne CAP(J) de l'onglet O
Next J 'prochaine colonne de la boucle 3
OB.Cells(DLB, 2).Value = O.Name 'récupère le nom de l'onglet O dans la cellule ligne DLB, colonne 2 de l'onglet OB
Next I 'prochaine ligne de la boucle 2
End If 'fin de la condition
Next O 'prochain onglet de la boucle
Application.ScreenUpdating = True 'affiche les rafraîchissements d'écran
End Sub
Si tu rajoutes des onglets il te faudra modifier le code dans la partie Select Case en décrivant les colonnes à copier des nouveaux onglets mais il aurait été plus malin de les avoir toutes au même endroit ! Je ne connais pas le pouvoir de Query mais je pense que pour lui ce n'est pas un problème...
le fichier :