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
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
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.
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,
SpoilerPeut-ê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,
SpoilerPeut-ê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.
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.