VBA pour trier un fichier Excel de 18 000 lignes

Bonjour à tous je suis nouveau et je n'ai jamais utilisé VBA.

J'aimerais trier un fichier excel de 18000 lignes environ mais qui est réparti de la même façon c'est-à-dire que je veux récupérer la ligne 1 et la ligne 2 à 182 dans une nouvelle feuille ensuite toujours la ligne 1 en en tête et la ligne 183 jusqu'à 363 dans une nouvelle feuille renommée et ainsi de suite tous les 180.

un ami a pensé à

cpt=0

Pour i=0:1:100

créer onglet name="onglet" + i

copier feuille initialle ligne 1--> onglet + i

copier feuilleinit [(i*180)+2+cpt: i*180+182+cpt]

cpt=cpt+1

Fin

Mais je ne sais pas comment le mettre en VBA et pour nommer les feuille ca peut être n'importe qu'elle case de la colonne E qui a le même nom mais qui change toute les 180 lignes je vous met un bout du fichier.

Je sais pas si j'ai été clair.

Merci beaucoup d'avance pour votre aide

6test-vba.xlsx (59.96 Ko)

Bonjour et bienvenue,

Quel est l'objectif final de la chose ?

Créer 100 feuilles pour quoi faire ensuite ?

Cdlt.

Bonjour Willian, Jean-Éric, bonjour le forum,

Peut-être comme ça :

Sub Macro1()
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim RO As String 'déclare la variable RO (Référence de l'Onglet)
Dim LD As Long 'déclare la variable LD(Ligne de Départ)
Dim I As Long 'déclare la variable I (Incrément)
Dim NO As String 'déclare la variable NO (Nom de l'Onglet)
Dim CO As Worksheet 'déclare la variable CO (Copie Onglet)

Set O = Worksheets("Feuil1") 'définit l'onglet O
TV = O.Range("A1").CurrentRegion 'définit le tableau des valeurs TV
RO = TV(2, 5) 'initialise l'onglet de référence
LD = 2 'initialise la ligne de dépard LD
For I = 2 To UBound(TV, 1) 'boucle sur toutes les ligne I du tableau des valeurs (en partant de la seconde)
    NO = TV(I, 5) 'définit le nom de l'onglet NO
    If NO <> RO Then 'condition : si le nom de l'onglet NO est différent de la référence de l'onglet RO
        Sheets.Add After:=Sheets(Sheets.Count) 'ajoute un onglet vierge en dernière position
        Set CO = ActiveSheet 'définit l'onglet CO
        CO.Name = RO 'renome l'onglet
        RO = TV(I, 5) 'redéfinit la référence de l'onglet RO
        CO.Range("A1").Resize(1, UBound(TV, 2)).Value = Application.Index(TV, 1) 'copie la première ligne du tableau TV
        O.Range(O.Cells(LD, "A"), O.Cells(I - 1, "O")).Copy CO.Range("A2") 'copie le bloc correspondant
        LD = I 'redéfinit la ligne de dépar LD
    End If 'fin de la condition
Next I 'prochaine ligne de la boucle
End Sub

Bonjour,

Voici une solution posible :

TV = O.Range("A1").CurrentRegion 'définit le tableau des valeurs TV

Merci de l'astuce, je ne connaissais pas!

Merci ça marche trop bien exactement ce dont j'avais besoin trop fort me manque juste le dernier groupe je ne sais pas pourquoi.

Aurais-tu une idée? sinon pour le dernier je fais manuellement

Merci merci merci

Bonjour Willian, Jean-Éric, bonjour le forum,

Peut-être comme ça :

Sub Macro1()
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim RO As String 'déclare la variable RO (Référence de l'Onglet)
Dim LD As Long 'déclare la variable LD(Ligne de Départ)
Dim I As Long 'déclare la variable I (Incrément)
Dim NO As String 'déclare la variable NO (Nom de l'Onglet)
Dim CO As Worksheet 'déclare la variable CO (Copie Onglet)

Set O = Worksheets("Feuil1") 'définit l'onglet O
TV = O.Range("A1").CurrentRegion 'définit le tableau des valeurs TV
RO = TV(2, 5) 'initialise l'onglet de référence
LD = 2 'initialise la ligne de dépard LD
For I = 2 To UBound(TV, 1) 'boucle sur toutes les ligne I du tableau des valeurs (en partant de la seconde)
    NO = TV(I, 5) 'définit le nom de l'onglet NO
    If NO <> RO Then 'condition : si le nom de l'onglet NO est différent de la référence de l'onglet RO
        Sheets.Add After:=Sheets(Sheets.Count) 'ajoute un onglet vierge en dernière position
        Set CO = ActiveSheet 'définit l'onglet CO
        CO.Name = RO 'renome l'onglet
        RO = TV(I, 5) 'redéfinit la référence de l'onglet RO
        CO.Range("A1").Resize(1, UBound(TV, 2)).Value = Application.Index(TV, 1) 'copie la première ligne du tableau TV
        O.Range(O.Cells(LD, "A"), O.Cells(I - 1, "O")).Copy CO.Range("A2") 'copie le bloc correspondant
        LD = I 'redéfinit la ligne de dépar LD
    End If 'fin de la condition
Next I 'prochaine ligne de la boucle
End Sub

Re,

Une proposition à étudier.

Une synthèse par TCD et la création des feuilles (name2).

J'ai considéré que l'on avait pas besoin de toutes les colonnes et fait appel à un soupçon de Power Query…

Donc pour résumer pas de VBA.

Cdlt.

5test-vba.xlsx (142.01 Ko)

T'as solution a l'air très bien aussi il faut que je regarde comment ça marche, auriez vous une idée pour trier aussi la colonne B exemple: j'ai des noms comme M1E12 ou M8E16 donc E correspond au groupe et M à l'échantillon donc j'aimerai trier d'abord les groupe donc du E le plus bas vers le plus haut exemple E04 avant E08 et dans l'ordre M1E04 avant M2E04.

Merci

Désolé si j'abuse un peu ça c'est du bonus pour moi

Re,

Une proposition à étudier.

Une synthèse par TCD et la création des feuilles (name2).

J'ai considéré que l'on avait pas besoin de toutes les colonnes et fait appel à un soupçon de Power Query…

Donc pour résumer pas de VBA.

Cdlt.

test-VBA.xlsx

Merci ça marche trop bien exactement ce dont j'avais besoin trop fort me manque juste le dernier groupe je ne sais pas pourquoi.

Aurais-tu une idée? sinon pour le dernier je fais manuellement

Merci merci merci

Bonjour Willian, Jean-Éric, bonjour le forum,

Spoiler

Peut-être comme ça :

Sub Macro1()
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim RO As String 'déclare la variable RO (Référence de l'Onglet)
Dim LD As Long 'déclare la variable LD(Ligne de Départ)
Dim I As Long 'déclare la variable I (Incrément)
Dim NO As String 'déclare la variable NO (Nom de l'Onglet)
Dim CO As Worksheet 'déclare la variable CO (Copie Onglet)

Set O = Worksheets("Feuil1") 'définit l'onglet O
TV = O.Range("A1").CurrentRegion 'définit le tableau des valeurs TV
RO = TV(2, 5) 'initialise l'onglet de référence
LD = 2 'initialise la ligne de dépard LD
For I = 2 To UBound(TV, 1) 'boucle sur toutes les ligne I du tableau des valeurs (en partant de la seconde)
    NO = TV(I, 5) 'définit le nom de l'onglet NO
    If NO <> RO Then 'condition : si le nom de l'onglet NO est différent de la référence de l'onglet RO
        Sheets.Add After:=Sheets(Sheets.Count) 'ajoute un onglet vierge en dernière position
        Set CO = ActiveSheet 'définit l'onglet CO
        CO.Name = RO 'renome l'onglet
        RO = TV(I, 5) 'redéfinit la référence de l'onglet RO
        CO.Range("A1").Resize(1, UBound(TV, 2)).Value = Application.Index(TV, 1) 'copie la première ligne du tableau TV
        O.Range(O.Cells(LD, "A"), O.Cells(I - 1, "O")).Copy CO.Range("A2") 'copie le bloc correspondant
        LD = I 'redéfinit la ligne de dépar LD
    End If 'fin de la condition
Next I 'prochaine ligne de la boucle
End Sub

De quelle proposition tu parles?

Celle de ThauThème que j'ai testé en premier, mais la tienne a l'ai très bien aussi sans me faire d'onglet supplémentaire je suis en train de l'essayer mais pour Name et ID quand j'essaie de faire comme toi ça me met dans la même colonne et pas en colonne séparé.

Merci

Merci ça marche trop bien exactement ce dont j'avais besoin trop fort me manque juste le dernier groupe je ne sais pas pourquoi.

Aurais-tu une idée? sinon pour le dernier je fais manuellement

Merci merci merci

Bonjour Willian, Jean-Éric, bonjour le forum,

Spoiler

Peut-être comme ça :

Sub Macro1()
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim RO As String 'déclare la variable RO (Référence de l'Onglet)
Dim LD As Long 'déclare la variable LD(Ligne de Départ)
Dim I As Long 'déclare la variable I (Incrément)
Dim NO As String 'déclare la variable NO (Nom de l'Onglet)
Dim CO As Worksheet 'déclare la variable CO (Copie Onglet)

Set O = Worksheets("Feuil1") 'définit l'onglet O
TV = O.Range("A1").CurrentRegion 'définit le tableau des valeurs TV
RO = TV(2, 5) 'initialise l'onglet de référence
LD = 2 'initialise la ligne de dépard LD
For I = 2 To UBound(TV, 1) 'boucle sur toutes les ligne I du tableau des valeurs (en partant de la seconde)
    NO = TV(I, 5) 'définit le nom de l'onglet NO
    If NO <> RO Then 'condition : si le nom de l'onglet NO est différent de la référence de l'onglet RO
        Sheets.Add After:=Sheets(Sheets.Count) 'ajoute un onglet vierge en dernière position
        Set CO = ActiveSheet 'définit l'onglet CO
        CO.Name = RO 'renome l'onglet
        RO = TV(I, 5) 'redéfinit la référence de l'onglet RO
        CO.Range("A1").Resize(1, UBound(TV, 2)).Value = Application.Index(TV, 1) 'copie la première ligne du tableau TV
        O.Range(O.Cells(LD, "A"), O.Cells(I - 1, "O")).Copy CO.Range("A2") 'copie le bloc correspondant
        LD = I 'redéfinit la ligne de dépar LD
    End If 'fin de la condition
Next I 'prochaine ligne de la boucle
End Sub

De quelle proposition tu parles?

Bonjour le fil, bonjour le forum,

le code modifié :

Sub Macro1()
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim LD As Long 'déclare la variable LD(Ligne de Départ)
Dim I As Long 'déclare la variable I (Incrément)
Dim NO As String 'déclare la variable NO (Nom de l'Onglet)
Dim CO As Worksheet 'déclare la variable CO (Copie Onglet)

Set O = Worksheets("Feuil1") 'définit l'onglet O
TV = O.Range("A1").CurrentRegion 'définit le tableau des valeurs TV
LD = 2 'initialise la ligne de dépard LD
For I = 2 To UBound(TV, 1) Step 180 'boucle sur toutes les ligne I du tableau des valeurs par bloc de 180 (en partant de la seconde)
    LD = I 'redéfinit la ligne de dépar LD
    NO = TV(I, 5) 'définit le nom de l'onglet NO
    Sheets.Add After:=Sheets(Sheets.Count) 'ajoute un onglet vierge en dernière position
    Set CO = ActiveSheet 'définit l'onglet CO
    CO.Name = NO 'renome l'onglet
    CO.Range("A1").Resize(1, UBound(TV, 2)).Value = Application.Index(TV, 1) 'copie la première ligne du tableau TV
    O.Range("A" & LD).Resize(180, 15).Copy CO.Range("A2") 'copie le bloc correspondant
Next I 'prochaine ligne de la boucle
End Sub

Je n'ai pas dû comprendre ta demande alors

Je croyais que tu voulais juste prendre ton tableau et le repartir en plein d'onglets qui ne contenaient au máximum que 180 lignes de données, ça ne doit pas être ça alors

Si c'est ça mais t'as solution est bonne aussi sauf que j'ai du mal a la reproduire

Je n'ai pas dû comprendre ta demande alors

Je croyais que tu voulais juste prendre ton tableau et le repartir en plein d'onglets qui ne contenaient au máximum que 180 lignes de données, ça ne doit pas être ça alors

Merci ça marche parfaitement peux-tu m'expliquer pourquoi ton premier code n'allait pas au bout?

Car la tu as changé de façon de faire

Et si tu as une idée pour trier aussi la colonne B exemple: j'ai des noms comme M1E12 ou M8E16 donc E correspond au groupe et M à l'échantillon donc j'aimerai trier d'abord les groupe donc du E le plus bas vers le plus haut exemple E04 avant E08 et dans l'ordre M1E04 avant M2E04. Ex: M1E04,M2E04 etc... M1E08,M2E08 etc...

Merci

Bonjour le fil, bonjour le forum,

le code modifié :

Sub Macro1()
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim LD As Long 'déclare la variable LD(Ligne de Départ)
Dim I As Long 'déclare la variable I (Incrément)
Dim NO As String 'déclare la variable NO (Nom de l'Onglet)
Dim CO As Worksheet 'déclare la variable CO (Copie Onglet)

Set O = Worksheets("Feuil1") 'définit l'onglet O
TV = O.Range("A1").CurrentRegion 'définit le tableau des valeurs TV
LD = 2 'initialise la ligne de dépard LD
For I = 2 To UBound(TV, 1) Step 180 'boucle sur toutes les ligne I du tableau des valeurs par bloc de 180 (en partant de la seconde)
    LD = I 'redéfinit la ligne de dépar LD
    NO = TV(I, 5) 'définit le nom de l'onglet NO
    Sheets.Add After:=Sheets(Sheets.Count) 'ajoute un onglet vierge en dernière position
    Set CO = ActiveSheet 'définit l'onglet CO
    CO.Name = NO 'renome l'onglet
    CO.Range("A1").Resize(1, UBound(TV, 2)).Value = Application.Index(TV, 1) 'copie la première ligne du tableau TV
    O.Range("A" & LD).Resize(180, 15).Copy CO.Range("A2") 'copie le bloc correspondant
Next I 'prochaine ligne de la boucle
End Sub

Re,

Tu n'as pas que MxxExx mais aussi des MxxJxx.

Que fait-on ? As-tu besoin de ces éléments ?

Cdlt.

Ah oui désolé d'abord M1E04, E08, E12 etc... ainsi de suite et ensuite J1 et J4. Du coup ça ne doit pas être possible.

Merci

Re,

Tu n'as pas que MxxExx mais aussi des MxxJxx.

Que fait-on ? As-tu besoin de ces éléments ?

Cdlt.

Il faudrait par exemple extraire les différentes valeurs dans des cellules temporaires de la feuille du genre :

colonne bonus 1 : contient les valeurs 1, 2 etc

colonne bonus 2 : contient les lettres E , J etc

colonne bonus 3 : contient les valeurs 04, 08, 12 etc

et trier par colonne 1, puis 2, puis 3

Enfin supprimer les colonnes en trop

C'est une piste en tout cas

Re,

As-tu d'autres lettres différentes de E et J ?

C'est une question fermée qui attend une réponse simple oui ou non.

Cdlt.

NON

Re,

As-tu d'autres lettres différentes de E et J ?

C'est une question fermée qui attend une réponse simple oui ou non.

Cdlt.

Re,

La version définitive ?

Cdlt.

3test-vba.xlsx (140.24 Ko)
Rechercher des sujets similaires à "vba trier fichier 000 lignes"