Consolidation de plusieurs feuilles dans une seule feuille

Bonjour,

De nouveau, je sollicite votre bien vaillance pour m'aider sur un problème qui me fait perdre beaucoup de temps

en fait, j'ai un fichier source (ci-joint) qui contient 5 feuilles sources qui ont le même format (même nombre de colonnes qui ont les mêmes titres), cependant le nombre de lignes est variable...

Mon besoin est de consolider uniquement les 5 feuilles sources (nom fictif) dans une seule feuille dans un autre classeur.

Pouvez vous m'aider à trouver une Macro qui sera installé dans l'autre classeur et qui me permet d'importer les 5 feuilles sources du fichier ci-joint dans une feuille de l'autre classeur Excel ?

NB : Le fichier ci-joint contient d'autres feuilles à part les feuilles sources

Le noms des feuilles 'SOURCE 1, 2, 3... est fictif par contre en réel les noms des feuilles est différent mais fixe (je peux le modifier au niveau du code)

D'avance, merci pour vos propositions et aide

Bonjour ,

une petite solution a tester :

Sub test()
Dim wkSource As Workbook
Dim wkArriver As Worksheet
Set wkArriver = Workbook("Nom classeur arriver").Sheets("nom feuille d'arriver")
Set wk = ThisWorkbook
For Each ws In wk.Sheets
  For i = 2 To ws.Range("A" & Rows.Count).End(xlUp).Row
    lastLigne = wkArriver.Range("A" & Rows.Count).End(xlUp).Row + 1
    wkArriver.Range("A" & lastLigne & ":" & "T" & lastLigne).Value = ws.Range("A" & i & ":" & "T" & i).Value
  Next i
Next ws

end sub

2 condition pour que le code vba fonctionne :

  • les 2 classeurs doivent être ouvert
  • le code est a exécuté dans le Classeur Source

petit erreur à remplacer :

 For Each ws In wk.Sheets 

par

 For Each ws In wkSource.Sheets 

Bonjour et merci pour votre proposition,

je viens de la tester mais j'ai un message d'erreur

en plus mon souhait est que la macro soit exécuté dans le classeur d'arrivée qui me permet d'importer les feuilles sources du fichier source dans une seule feuille dans le classeur d'arrivée...

mais si j'ai bien compris la logique de votre code proposé est l'inverse, non ?

Merci

il suffira de changer de 2 ligne pour exécuté le code vba dans le classeur d'arriver ^^"


et quel est ce message d'erreur ??

L'erreur est au niveau de la ligne suivante :

Set wkArriver = Workbook("Nom classeur arriver").Sheets("nom feuille d'arriver")

Libellé de l'erreur : Erreur de compilation Sub ou function non définie

PS: sera-t-il possible d'insérer une fonction qui me permet de sélectionner le fichier source (Fichier - Parcourir) au lieu de le garder ouvert avec le fichier d'arrivée ?

Merci

nouveau code à exécuter sur la feuille d'arriver :

Sub importDonnée()
Dim wkSource As Worksheet
Dim wkArriver As Workbook
Set wkArriver = ActiveSheet
Set wkSource = Workbook("Nom classeur Source")
For Each ws In wkSource.Sheets
  For i = 2 To wsSource.Range("A" & Rows.Count).End(xlUp).Row
    lastLigne = wkArriver.Range("A" & Rows.Count).End(xlUp).Row + 1
    wkArriver.Range("A" & lastLigne & ":" & "T" & lastLigne).Value = ws.Range("A" & i & ":" & "T" & i).Value
  Next i
Next ws
End Sub

je pense que c'est possible de sélectionner le classeur même si celui-ci est fermer mais avec mon niveau je sais pas comme le faire

Merci pour cette nouvelle proposition, cependant, j'ai toujours la même erreur au niveau de la même ligne

Set wkSource = Workbook("Nom classeur Source")

Précisément c'est le mot Workbook

oups

il manque un "s" a "workbook" ^^"

Set wkSource = Workbooks("Nom classeur Source")

J'ai le nouveau message d'erreur suivant :

Erreur de compilation : Membre de méthode ou de données introuvable

au niveau de la ligne suivante :

For Each ws In wkSource.Sheets (le mot sheets)

PS: Est ce normal que vous avez défini wksource comme worksheet ? ne devrait pas être un workbook ?

Dim wkSource As Worksheet

Merci

merci pour la remarque j'ai inverser les 2 déclaration

Dim wkSource As workbook
Dim wkArriver As worksheet

c'est sur que si on cherche des feuille dans des feuille vba va pas être content ^^

J'ai fait la modification mais j'ai un autre message d'erreur à savoir :

Erreur d'exécution '9' :L'indice n'appartient pas à la sélection au niveau de la ligne suivante :

Set wkSource = Workbooks("Nom classeur Source")

il faut quand même changer "Nom classeur source" par le nom de ton fichier excel ^^

Oui oui bien sur, c'est ce que j'ai fait d'ailleurs mais toujours le même problème

Les 2 classeur sont ouverte ?

Oui

c'est possible de voir le code une fois adapter svp ?

Bonjour Morino, minanse.

Je te propose un code différent de celui proposé par minanse.

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

Set w1 = ThisWorkbook: Set f1 = w1.Sheets("Feuil1")

'On vérifie si le fichier à consolider est ouvert.
'Le cas contraire on l'ouvre.
If FichierEstOuvert("Fichier Source %28Consolidation%29.xlsx") Then
    Set w2 = Workbooks("Fichier Source %28Consolidation%29.xlsx")
    Else: Set w2 = Workbooks.Open(ThisWorkbook.Path & "\Fichier Source %28Consolidation%29.xlsx")
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 = 1 To .Sheets.Count
        If LCase(.Sheets(i).Name) Like LCase("*Source*") Then
            With .Sheets(i)
                l = .Cells.Find("*", , , , xlByRows, xlPrevious).Row
                temp = .Range(.Cells(2, 1), .Cells(l, 20)).Value
                If k = 0 Then
                    t = temp
                    Else: t = MergeArray2DVert(t, temp)
                End If
            End With
        End If
    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.[a1].Resize(UBound(t), UBound(t, 2))
    .NumberFormat = "@"
    .Value = t
End With
End Sub

Function FichierEstOuvert(ByRef FichierTeste As String) As Boolean
    Dim Fichier As Long
    On Error GoTo Erreur
    Fichier = FreeFile
    Open FichierTeste For Input Lock Read As #Fichier
    Close #Fichier
    FichierEstOuvert = False
    Exit Function
Erreur:
    FichierEstOuvert = True
End Function

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

A noter que les deux fichiers doivent se trouver dans le même répertoire.

c'est vrai que avec ce code il y a plus de contrôle qui limite les erreurs (notamment de saisie des nom et les classeur ouvert ou non )

j'ai pas tester pas je met un +1

Bonjour thebenoit59 et merci beaucoup pour votre intervention,

je viens de tester votre code et ça fonctionne mais j'ai quelques remarques à savoir :

1- La consolidation prend en compte toutes les feuilles du fichier Source, or que mon fichier réel contient plusieurs feuilles et je ne veux consolider que 5 parmi eux ==> Comme le libellé de mes 5 feuilles est fixe tout le temps, comment je peux les nommer dans le code en utilisant la fonction If sheets.Name = "Source 1" or sheets.Name = "Source 2" etc...

2- Le code ne fonctionne pas lorsque le fichier est fermé : j'ai une erreur (l'indice n'appartient pas à la sélection) au niveau de la ligne suivante :

Set w2 = Workbooks("Fichier Source.xlsx")

3- En réalité Le nom de mon fichier source n'est pas stable, il est différent d'un dossier à un autre (malgré que le nom des feuilles est fixe), donc comment je peux surmonter ce problème svp ? ===> La solution idéale sera de pouvoir sélectionner le fichier via une fenêtre (Fichier => ouvrir => parcourir)

Merci une autre fois


Re,

J'étais très rapide et je n'ai pas vu qu'il y a une condition sur le nom des feuilles, donc je viens de le modifier en fixant les noms concernés et ça marche ===> ne tenez pas compte du Point 1 svp

cependant je viens de découvrir un autre point qui peut être amélioré (j'espère) : il n' y a pas de titre des colonnes dans la feuille consolidé ===> Comme les titres sont fixes aussi, je peux les insérer dès le départ dans la feuille de consolidation mais dans ce cas, il faut que les données collés commence à partir de la ligne 2 ==> Comment je peux modifier ça dans le code ??

Merci

2- Le code ne fonctionne pas lorsque le fichier est fermé : j'ai une erreur (l'indice n'appartient pas à la sélection) au niveau de la ligne suivante :

Set w2 = Workbooks("Fichier Source.xlsx")

Tu as du modifier le code, en faisant une erreur à un moment.

Le nouveau code, pour lequel tu peux choisir ton fichier :

Sub Consolidation()
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("Feuil1")
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
                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.[a1].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
Rechercher des sujets similaires à "consolidation feuilles seule feuille"