Consolidation de plusieurs feuilles dans une seule feuille

Bonsoir à toutes à tous,

Depuis un moment j'utilise le code suivant qui fonctionne bien

Sub Consolidation_2()
Dim w1 As Workbook, w2 As Workbook
Dim f1 As Worksheet, f2 As Worksheet
Dim l&, i&, k&, t(), temp(), Liste(), nw2

Set w1 = ThisWorkbook: Set f1 = w1.Sheets("Recap Conso")
Liste = Array("SOURCE 1", "SOURCE 2", "SOURCE 3", "SOURCE 4", "SOURCE 5")

'On choisit le fichier à ouvrir
nw2 = Application.GetOpenFilename("Fichiers Excel (*.xlsx), *.xlsx")
    If nw2 <> False Then
        Set w2 = Workbooks.Open(nw2)
        Else: MsgBox "Vous n'avez pas sélectionné de fichier": Exit Sub
    End If

'On débute le compteur à 0, afin de savoir s'il s'agit du premier tableau.
k = 0

'On boucle les différentes feuilles.
With w2
    For i = LBound(Liste) To UBound(Liste)
        With .Sheets(Liste(i))
            l = .Cells.Find("*", , , , xlByRows, xlPrevious).Row
            temp = .Range(.Cells(2, 1), .Cells(l, 20)).Value
            If k = 0 Then
            .Rows(1).Copy f1.[a1]
                t = temp
                Else: t = MergeArray2DVert(t, temp)
            End If
        End With
    k = k + 1
    Next i
End With

'On ferme le classeur à consolider.
w2.Close False

'On note les valeurs dans le classeur d'origine.
With f1.[a2].Resize(UBound(t), UBound(t, 2))
    .NumberFormat = "@"
    .Value = t
End With
End Sub

Function MergeArray2DVert(a, b)
  maxtab1 = UBound(a)
  Dim Tbl(): ReDim Tbl(1 To UBound(a) + UBound(b), 1 To UBound(a, 2))
  For i = LBound(a) To UBound(a)
    For c = 1 To UBound(a, 2): Tbl(i, c) = a(i, c): Next
  Next i
  For i = 1 To UBound(b)
    For c = 1 To UBound(b, 2): Tbl(maxtab1 + i, c) = b(i, c): Next
  Next i
  MergeArray2DVert = Tbl
End Function

Mais je voudrai ajouter le nom de la feuille source dans le fichier consolidé (colonne 21 : à la fin)

pouvez vous m'aider à ajouter cette évolution qui va me faire gagner beaucoup de temps ?

D'avance, merci pour vos propositions

A+

Bonjour.

Déclare la variable source en String.

Dim source$

Enregistre la variable :

'On boucle les différentes feuilles.
With w2
    source = .Name
    For i = LBound(Liste) To UBound(Liste)

Et inscrit la variable dans ton fichier consolidé.

With f1.[a2].Resize(UBound(t), UBound(t, 2))
    .NumberFormat = "@"
    .Value = t
    f1.Cells(UBound(t) + 1, 21).Value = source
End With

Bonjour et merci pour votre proposition,

je viens de modifier le code comme suit :

Sub Consolidation_2()
Dim w1 As Workbook, w2 As Workbook
Dim f1 As Worksheet, f2 As Worksheet
Dim l&, i&, k&, t(), temp(), Liste(), nw2
Dim source$

Set w1 = ThisWorkbook: Set f1 = w1.Sheets("Recap Conso")
Liste = Array("SOURCE 1", "SOURCE 2", "SOURCE 3", "SOURCE 4", "SOURCE 5")

'On choisit le fichier à ouvrir
nw2 = Application.GetOpenFilename("Fichiers Excel (*.xlsx), *.xlsx")
    If nw2 <> False Then
        Set w2 = Workbooks.Open(nw2)
        Else: MsgBox "Vous n'avez pas sélectionné de fichier": Exit Sub
    End If

'On débute le compteur à 0, afin de savoir s'il s'agit du premier tableau.
k = 0

'On boucle les différentes feuilles.
With w2
    source = .Name
    For i = LBound(Liste) To UBound(Liste)
        With .Sheets(Liste(i))
            l = .Cells.Find("*", , , , xlByRows, xlPrevious).Row
            temp = .Range(.Cells(2, 1), .Cells(l, 20)).Value
            If k = 0 Then
            .Rows(1).Copy f1.[a1]
                t = temp
                Else: t = MergeArray2DVert(t, temp)
            End If
        End With
    k = k + 1
    Next i
End With

'On ferme le classeur à consolider.
w2.Close False

'On note les valeurs dans le classeur d'origine.
With f1.[a2].Resize(UBound(t), UBound(t, 2))
    .NumberFormat = "@"
    .Value = t
    f1.Cells(UBound(t) + 1, 21).Value = source
End With

End Sub

Function MergeArray2DVert(a, b)
  maxtab1 = UBound(a)
  Dim Tbl(): ReDim Tbl(1 To UBound(a) + UBound(b), 1 To UBound(a, 2))
  For i = LBound(a) To UBound(a)
    For c = 1 To UBound(a, 2): Tbl(i, c) = a(i, c): Next
  Next i
  For i = 1 To UBound(b)
    For c = 1 To UBound(b, 2): Tbl(maxtab1 + i, c) = b(i, c): Next
  Next i
  MergeArray2DVert = Tbl
End Function

Mais malheureusement le résultat ne répond pas à mes besoins :

Au niveau de la dernière ligne de la colonne 21, il est inscrit le libellé du classeur source ! or que je voudrai avoir le libellé de la feuille source (source 1, source 2...) pour toutes les lignes de cette colonne

Pour plus de détails, je vous joints les 2 fichiers en question avec le dernier code

est-il possible de revoir ce qui ne fonctionne pas !

merci


Pour complément d'informations, en modifiant la source, j'ai eu le libellé de la feuille mais toujours uniquement au niveau de la dernière ligne de la colonne 21

source = Sheets(Liste(i)).Name
19fichier-source.xlsx (22.55 Ko)

Si j'ai bien compris la demande cette fois ci :

'On boucle les différentes feuilles.
With w2
    For i = LBound(Liste) To UBound(Liste)
        With .Sheets(Liste(i))
            l = .Cells.Find("*", , , , xlByRows, xlPrevious).Row
            temp = .Range(.Cells(2, 1), .Cells(l, 21)).Value
            For m = LBound(temp) To UBound(temp)
                temp(m, 21) = Liste(i)
            Next m
            If k = 0 Then
            .Rows(1).Copy f1.[a1]
                t = temp
                Else: t = MergeArray2DVert(t, temp)
            End If
        End With
    k = k + 1
    Next i
End With

Bonjour thebenoit59 et merci beaucoup pour votre proposition

je viens de tester le nouveau code et ça marche très bien mais juste il y a un petit problème : au niveau de la dernière ligne de la colonne 21, il n'y a pas le nom de la feuille source (à l'inverse des les autres lignes ou j'ai bien le nom des feuilles sources)

Est-il possible de corriger ce petit point ?

Merci d'avance

Chez moi aucun soucis.

Peut-être que cette ligne est une ancienne. Essaye en nettoyant ta feuille et en lançant le code ensuite.

J'ai refait l'exécution du code plusieurs fois, mais j'ai toujours le même problème

Ci-joint le fichier ou vous pouvez voir que la cellule U77 (dernière ligne de la colonne 21) est vide malgré qu'elle provient de la feuille 'source 5'

parait, j'ai modifié la traille des feuilles et à chaque la dernier ligne colonne 21 est vide !!

Il faut supprimer la première réponse avec le source (déclaration, source = et inscription dans le classeur de consolidation).

Excusez moi je n'ai pas bien compris votre réponse :qu'est ce qu'il faire exactement :

 f1.Cells(UBound(t) + 1, 21).Value= source

est ce je dois modifier la ligne ci-dessus ?

Merci

Ne pas tenir compte de la première solution c'est tout

Ah d'accord, merci beaucoup

Rechercher des sujets similaires à "consolidation feuilles seule feuille"