Regroupement d'onglets à partir d'une position variable

Bonjour

j'ai bien trouvé des indication sur une macro permettant de regrouper des onglet d'un meme fichier excel sur un nouvel onglet global mais mon besoin est je pense plus complex.

En effet, même si la zone a recopier sur chaque onglet est identique (en nombre de colonnes), la cellule à partir de laquelle elle démarre varie suivant les onglets.

Je vous place en PJ l'exemple concret de ce que je tente de faire. Mais un exemple plus simple : j'ai deux onglets. sur onglet 1 je veux récupérer le tableau qui va de A2 à C5 alors que sur l'onglet 2, ce meme tableau va de B5 à D10. Le tout sera regroupé sur un nouvel onglet automatiquement par macro ou on retrouvera ce tableau qui a donc 3 colonnes avec les lignes de l'onglet 1 puis directement à la suite les lignes de l'onglet deux. Pour savoir ou faire partir la copie du tableau sur chaque onglet je pensais à une msgbox qui demanderait à quelle cellule démarrer qu'en pensez vous ?

Je précise que le tableau à toujours le meme nombre de colonne (17 colonnes cf ma PJ) mais le nombre de ligne est variable.

De même le nombre d'onglet sur la feuille est variable, le nom des onglets peu être le même ou varier aussi.

merci pour votre aide

Bonjour, je vois bien que tu as des décalages sur ton fichier, ce qui est un gros souci en VBA, et peut poser un souci si tu dois à chaque feuille préciser quelle cellule est celle en haut à gauche de ton tableau, c'est pas optimal et on est pas à l'abri d'un clic à côté qui fait tout planter...

Est-ce qu'on peut partir du principe que: ton en-tête "N° CTN" se trouve toujours dans une zone et que ton en-tête bouge dans cette zone?

Sur ton exemple, ton tableau se décale d'une colonne entre la feuille 1 et la feuille 2, est-ce qu'il lui arrive vraiment de terminer perdu en colonne CH par exemple? ou bien est-ce qu'il se décale de moins de 10 colonnes à chaque fois? voir 5? parce qu'après je peux facilement te faire une macro de recherche qui va trouver cette en-tête pour trouver la position du tableau, qu'en penses-tu?

Parce que si à chaque fois tu dois renseigner la cellule de départ, tu irais presque plus vite en copiant collant toi même chaque infos de chaque feuille à la main...

bonjour,

une proposition via macro

edit: bonjour ausecour

Sub aargh()
    With Sheets("regroupement des onglets")
        dl = .Cells(Rows.Count, 1).End(xlUp).Row
        .Range("A2").Resize(dl, 18).Clear
        k = 2
        For Each ws In Worksheets
            If ws.Name <> .Name Then
                Set re = Nothing
                On Error Resume Next
                Set re = ws.UsedRange.Find("N° commande", lookat:=xlWhole, after:=ws.Range("A7"), searchorder:=xlByRows)
                On Error GoTo 0
                If Not re Is Nothing Then
                    dl = re.End(xlDown).Row
                    re.Cells(2, 1).Resize(dl - re.Row, 18).Copy .Cells(k, 1)
                    k = k + dl - re.Row
                End If
            End If
        Next ws
    End With
End Sub

Bonjour, je vois bien que tu as des décalages sur ton fichier, ce qui est un gros souci en VBA, et peut poser un souci si tu dois à chaque feuille préciser quelle cellule est celle en haut à gauche de ton tableau, c'est pas optimal et on est pas à l'abri d'un clic à côté qui fait tout planter...

Est-ce qu'on peut partir du principe que: ton en-tête "N° CTN" se trouve toujours dans une zone et que ton en-tête bouge dans cette zone?

Sur ton exemple, ton tableau se décale d'une colonne entre la feuille 1 et la feuille 2, est-ce qu'il lui arrive vraiment de terminer perdu en colonne CH par exemple? ou bien est-ce qu'il se décale de moins de 10 colonnes à chaque fois? voir 5? parce qu'après je peux facilement te faire une macro de recherche qui va trouver cette en-tête pour trouver la position du tableau, qu'en penses-tu?

Parce que si à chaque fois tu dois renseigner la cellule de départ, tu irais presque plus vite en copiant collant toi même chaque infos de chaque feuille à la main...

merci pour ton retour

en effet si la cellule de départ va varier, le tableau ne sera jamais aussi loin en CH ! donc ta solution est encore bien mieux pensée que la mienne mais je ne saurais absolument pas faire ce genre de "recherche" dans une zone. Donc si tu y arrives c'est encore plus rapide comme tu le dis. je pense que la zone peut aller jusqu’à 10 colonnes ou 10 lignes vers le bas ou vers la droite.

merci

bonjour,

une proposition via macro

Sub aargh()
    With Sheets("regroupement des onglets")
        dl = .Cells(Rows.Count, 1).End(xlUp).Row
        .Range("A2").Resize(dl, 18).Clear
        k = 2
        For Each ws In Worksheets
            If ws.Name <> .Name Then
                Set re = Nothing
                On Error Resume Next
                Set re = ws.UsedRange.Find("N° commande", lookat:=xlWhole, after:=ws.Range("A7"), searchorder:=xlByRows)
                On Error GoTo 0
                If Not re Is Nothing Then
                    dl = re.End(xlDown).Row
                    re.Cells(2, 1).Resize(dl - re.Row, 18).Copy .Cells(k, 1)
                    k = k + dl - re.Row
                End If
            End If
        Next ws
    End With
End Sub

salut

je ne suis pas expert en vba mais de ce que je lis deja tu pars du pp que l'onglet de regroupement est deja créé alors qu'a l'ouverture du fichier excel il n'existe pas. il faut le generer (bon ok ce n'est pas le plus dure).

Ensuite, ce que je pense etre un pb c'est que tu vas rechercher à un endroit precis le tableau à extraire non ?

ou du moins, que se passe t il si N° commande qui est en B6 se retrouve dans un autre onglet en A10.. ? il ne risque pas d'y avoir un soucis ?

merci

Bonjour,

avec la creation de l'onglet, pour le reste cela devrait fonctionner à la condition que ton tableau commence toujours après la ligne 7

Sub aargh()
    Application.DisplayAlerts = False
    On Error Resume Next
    Sheets("regroupement des onglets").Delete
    On Error GoTo 0
    Application.DisplayAlerts = True

    With Sheets.Add(after:=Sheets(1))
        .Name = "regroupement des onglets"
        dl = .Cells(Rows.Count, 1).End(xlUp).Row
        k = 1
        For Each ws In Worksheets
            If ws.Name <> .Name Then
                Set re = Nothing
                On Error Resume Next
                Set re = ws.UsedRange.Find("N° commande", lookat:=xlWhole, after:=ws.Range("A7"), searchorder:=xlByRows)
                On Error GoTo 0
                If Not re Is Nothing Then
                    dl = re.End(xlDown).Row
                    If k = 1 Then
                        re.Cells(1, 1).Resize(dl + 1 - re.Row, 18).Copy .Cells(k, 1)
                        k = k + dl + 1 - re.Row
                    Else
                        re.Cells(2, 1).Resize(dl - re.Row, 18).Copy .Cells(k, 1)
                        k = k + dl - re.Row
                    End If
                End If
            End If
        Next ws
        Cells.EntireColumn.AutoFit
    End With
End Sub

Re,

pas de souci en vue pour ton code h2so4, juste une chose que je ne comprends pas bien...

Sheets("regroupement des onglets").Delete
    On Error GoTo 0
    Application.DisplayAlerts = True

    With Sheets.Add(after:=Sheets(1))
        .Name = "regroupement des onglets"
        dl = .Cells(Rows.Count, 1).End(xlUp).Row
        .Range("A2").Resize(dl, 18).Clear

Tu supprimes la feuille de synthèse, tu en recrées une, et sur cette même feuille tu vas chercher la dernière ligne remplie pour supprimer des choses sur ta feuille vide? Je ne comprends pas très bien la logique de cette partie, une erreur de ta part ou bien une incompréhension de mon côté?

et sinon @Ausecour tu penses pouvoir réaliser ce que tu annonçais ? car cela semble une bonne solution surtout en terme de gain de temps

@ ausecour,

un résidu de la version précédente, qui aurait dû disparaître dans cette nouvelle version.

@benjy

as-tu essayé la macro proposée ou pars-tu du principe que cela ne fonctionne pas ?

et sinon @Ausecour tu penses pouvoir réaliser ce que tu annonçais ? car cela semble une bonne solution surtout en terme de gain de temps

Je ne proposerai pas de programme supplémentaire car la macro de h2so4 le fait déjà

Il y a une partie du code qui cherche le début du tableau de la façon dont je t'avais parlé, je n'ai pas grand chose à ajouter à part la petite question que j'avais posé à h2so4, je te conseille de tester sa macro, elle fonctionne pile poil

j'ai bien évidement essayé et c'est hyper rapide et marche tres bien mais le risque qu'il y a avec cette idée c'est si sur un onglet le tableau commande avant ligne 7. j'ai fait le test et effectivement il y a quand meme un copier coller qui se fait mais du coup ça rends n'importe quoi donc c'est un pre requis indispensable que le tab demarre apres ligne 7 et ça peut etre un pb.

c'est pour cela que l'idée d'aller chercher dans une "zone" la fameuse case me semble super !

j'ai bien évidement essayé et c'est hyper rapide et marche tres bien mais le risque qu'il y a avec cette idée c'est si sur un onglet le tableau commande avant ligne 7. j'ai fait le test et effectivement il y a quand meme un copier coller qui se fait mais du coup ça rends n'importe quoi donc c'est un pre requis indispensable que le tab demarre apres ligne 7 et ça peut etre un pb.

c'est pour cela que l'idée d'aller chercher dans une "zone" la fameuse case me semble super !

Re, le truc c'est que ça semble impossible, la ligne 7 et les quelques lignes qui suivent contiennent tes en-têtes, tu es sûr que ton tableau peut aller dessus?

h2so4 fait exactement cette recherche de zone, après si VRAIMENT c'est nécessaire, elle peut-être légèrement modifiée, mais je ne vois pas le besoin d'effectuer ce changement pour le moment

[/quote]

Je ne proposerai pas de programme supplémentaire car la macro de h2so4 le fait déjà

Il y a une partie du code qui cherche le début du tableau de la façon dont je t'avais parlé, je n'ai pas grand chose à ajouter à part la petite question que j'avais posé à h2so4, je te conseille de tester sa macro, elle fonctionne pile poil

[/quote]

je ne sais pas pourquoi vs pensez que je ne l'ai pas deja testé mais comme je viens de le dire en fait il y a un risque qu'un fournisseur ne me renvoi pas le fichier proprement et si par malheur (ce qui va arriver je le sais) sur un onglet le tab demarre par exemple en A1 et bien c'est capout ! y a t il possibilité d’ajuster simplement sur la macro que propose h2so4 j'imagine sur cette ligne là

Set re = ws.UsedRange.Find("N° commande", lookat:=xlWhole, after:=ws.Range("A7"), searchorder:=xlByRows)

une notion de recherche dans une zone de + ou - 10 en horizontal et vertical de l'entete N° Colis par ex ?

bon et je viens de voir que tu as repondu entre temps alors je vais vous montrer ce que je suis suceptible de recevoir en onglet 2 par ex et vous me direz ce qu"'on peut faire dans ce cas.

Re,

Ah je vois, le fournisseur peut faire n'importe quoi, dans ce cas, je propose en effet de modifier cette ligne par:

Set re = ws.UsedRange.Find("N° CTN", lookat:=xlWhole, searchorder:=xlByRows).Offset(0, -2)

Comme "N° CTN" n'apparait qu'une fois sur le fichier, plus besoin de se poser trop de questions par contre j'ai rajouté .offset(0, -2) pour ne pas boulverser la suite du programme

bonjour

merci à vous deux je vais compiler tt ça et cloturer le sujet si tt est ok

Bonjour,

ça marche, si tu valides tout, merci de passer le sujet en résolu

tout fonctionne impeccable

merci bcp

Re,

Ah je vois, le fournisseur peut faire n'importe quoi, dans ce cas, je propose en effet de modifier cette ligne par:

Set re = ws.UsedRange.Find("N° CTN", lookat:=xlWhole, searchorder:=xlByRows).Offset(0, -2)

Comme "N° CTN" n'apparait qu'une fois sur le fichier, plus besoin de se poser trop de questions par contre j'ai rajouté .offset(0, -2) pour ne pas boulverser la suite du programme

bonjour

si peu de temps apres je me retrouve deja avec un fournisseur qui comme je le pensais ne respecte pas les pré requis.

j'ai en l'occurence un cas ou le fichier renvoyé n'a pas la premiere colonne vide comme c'etait le cas et surtout, deux colonnes ont été inversée. donc le champs "N° Colis " qui est important dans notre macro n'est pas en D mais en C et cela fait planter la macro..

du coup y a t il moyen de s'adapter à ce type de cas ?

1/ meme si le tab commence directement en colonne A

2/ meme si le champs N° colis n'est pas à un numero de colonne fixe

l’idéal serait de tout simplement repérer ce champs puis aller le plus a gauche possible, descendre d'une ligne et copier coller tout ce qu'on y trouve vers le bas par End(xlDown).Row

et cela donc sans partir d'une position fixe.

Merci beaucoup

en PJ un nouvel exemple

4test-2.xlsm (54.34 Ko)

bonjour,

voici une adaptation

Sub SUPPLY()

    Application.DisplayAlerts = False
    On Error Resume Next
    'Sheets("regroupement des onglets").Delete
    On Error GoTo 0
    Application.DisplayAlerts = True

    With Sheets.Add(after:=Sheets(1))
        .Name = "regroupement des onglets"
        dl = .Cells(Rows.Count, 1).End(xlUp).Row
        k = 1
        For Each ws In Worksheets
            If ws.Name <> .Name Then
                Set re = Nothing
                On Error Resume Next
                Set re = ws.UsedRange.Find("N° CTN", lookat:=xlWhole, searchorder:=xlByRows).Offset(0, -1)
                On Error GoTo 0
                If Not re Is Nothing Then
                    dl = re.Offset(1).End(xlDown).Row
                    If k = 1 Then
                        re.Cells(1, 1).Resize(dl + 1 - re.Row, 18).Copy .Cells(k, 1)
                        k = k + dl + 1 - re.Row
                    Else
                        re.Cells(2, 1).Resize(dl - re.Row, 18).Copy .Cells(k, 1)
                        k = k + dl - re.Row
                    End If
                End If
            End If
        Next ws
        Cells.EntireColumn.AutoFit
    End With
End Sub

bravo @h2so4 et merci beaucoup

Rechercher des sujets similaires à "regroupement onglets partir position variable"