Tri en masse Excel 2007
Résolupijaku Messages postés 13513 Date d'inscription Statut Modérateur Dernière intervention -
Je n'arrive pas à mettre en place sur excel un tri. Mon niveau et très bas aussi.
Je fais une extraction de ma base de donnée AS400 vers excel sur la feuille 1, cela représente 50 000 références.
Chaque référence a :
Code Fourisseur / Ref / Description / Prix / Famille / Ss famille.
J'aimerai pouvoir créer un tri qui me permettrait de mettre dans différentes feuille les références ayant les memes famille / ss famille
Pouvez vous m'aider svp ?
Merci
- Tri en masse Excel 2007
- Tri sur excel - Guide
- Renommer des fichiers en masse - Guide
- Save as pdf office 2007 - Télécharger - Bureautique
- Logiciel tri photo - Guide
- Liste déroulante excel - Guide
25 réponses
- 1
- 2
Tri sur Excel après extraction AS400, représentant 50 000 références, où chaque ligne porte Code Fournisseur, Ref, Description, Prix, Famille et Sous-famille, et la demande vise à répartir ces références dans des feuilles par famille et sous-famille. Des solutions reposent sur une macro VBA qui regroupe les lignes par concaténation de Famille et Sous-famille, crée des feuilles nommées et duplique les six colonnes pertinentes. Pour éviter la perte de données, travailler sur une copie, désactiver temporairement la vérification des feuilles et tester sur des échantillons lorsque le fichier devient volumineux. En cas de symboles dans les descriptions, comme =, / ou +, il peut être nécessaire de les retirer ou d’ajuster le code pour que les noms de feuilles restent compatibles.
Combien as tu de familles? Sous familles?
Tu fais une extraction régulièrement ou c'est juste pour une fois?
J'ai environ 40 familles et 100 sous familles au total.
C'est une extraction que je fais régulièrement pour différent traitement donc c'est pour cela que je voudrai automatiser au mieux la chose pour gagner du temps
Merci encore
Feuille nommée "Feuil1" :
Colonne A :Code Fourisseur
Colonne B : Ref
Colonne C : Description
Colonne D: Prix
Colonne E : Famille
Colonne F : Ss famille
40 familles et 100 sous familles. Tu veux une feuille par famille ou une feuille par sous-famille? Comment souhaites tu organiser ton fichier en fait?
Ex Famille 1 Sous Famille 1
Ex Famille 1 Sous Famille 2
Ex Famille 1 Sous Famille 3
Ex Famille 2 Sous Famille 1
Ex Famille 2 Sous Famille 2
Ex Famille 2 Sous Famille 1
Ex Famille 2 Sous Famille 3
Donc la feuille 1 c'est Famille 1 Sous Famille 1
la feuille 2 c'est Famille 1 Sous Famille 2
la feuille 3 c'est Famille 1 Sous Famille 3
etc...
Et en gardant les entete de colonnes comme tu as dis
Le nombre maximum de feuilles par classeur est limité par la quantité de mémoire disponible.
Même si Excel 2007 et ton ordi pouvait gérer autant de feuilles (et là j'en doute), je suis sur qu'un utilisateur ne s'y retrouvera jamais!
Tu dis...
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionTestée sur 35 000 lignes et l'ajout de 100 feuilles, durée 12,54 secondes...
Pour plus de lignes et plus de feuilles, prévoir plus de temps!
J'ai enlevé l'option de vérification de l'existence des feuilles. Si tu ne le fais qu'une fois par fichier, elle est inutile.
Précaution d'usage :
Travailler sur une copie de votre fichier..... Ne venez pas pleurer si vos données sont irrémédiablement perdues...
Voici le code de la macro à insérer dans un module standard :
Option Explicit
Option Base 1
Sub Repartition()
Dim DicoConcat As Object
Dim concat(), Colonns(), TablDico()
Dim DrLig As Long, i As Long, j As Long, Lig As Long, Col As Long
Application.ScreenUpdating = False
With Sheets("Feuil1")
DrLig = .Range("A" & Rows.Count).End(xlUp).Row
ReDim concat(DrLig)
ReDim Colonns(1 To DrLig, 1 To 6)
For i = 2 To DrLig
For j = 1 To 6
Colonns(i - 1, j) = .Cells(i, j)
Next j
concat(i - 1) = Colonns(i - 1, 5) & "_" & Colonns(i - 1, 6)
Next i
End With
Set DicoConcat = CreateObject("Scripting.Dictionary")
For i = LBound(concat) To UBound(concat)
DicoConcat(concat(i)) = ""
Next i
If DicoConcat.Count + ThisWorkbook.Worksheets.Count >= 250 Then
MsgBox "Votre classeur va dépasser les 250 feuilles. Fractionnez le au préalable."
Exit Sub
End If
TablDico = DicoConcat.keys
'Si vous souhaitez tester si la feuille a déjà été créée
'enlevez les apostrophes en début des lignes suivantes
For i = 1 To UBound(TablDico) - 1
' If FeuilleExiste(TablDico(i)) = False Then
ThisWorkbook.Worksheets.Add
With ActiveSheet
.Name = TablDico(i)
.Range("A1") = "Fournisseur"
.Range("B1") = "Ref"
.Range("C1") = "Description"
.Range("D1") = "Prix"
.Range("E1") = "Famille"
.Range("F1") = "Sous famille"
For j = 1 To UBound(concat)
If concat(j) = TablDico(i) Then
Lig = .Range("A" & Rows.Count).End(xlUp).Offset(1, 0).Row
For Col = 1 To 6
.Cells(Lig, Col) = Colonns(j, Col)
Next
End If
Next j
End With
' Else
' With Sheets(concat)
' .Cells.Clear
' End With
' End If
Next i
Sheets("Feuil1").Select
End Sub
Function FeuilleExiste(NomFeuille) As Boolean
Dim f As Object
On Error Resume Next
Set f = Sheets(NomFeuille)
If Err = 0 Then FeuilleExiste = True
Set f = Nothing
End Function
J'oubliais... Vérifiez bien que toutes vos donénes sont encore présentes après traitement...
Possibilité également d'effacement de la feuille Feuil1, mais vérifiez vos données au préalable...
Cordialement,
Franck P
Il faut remplacer la ligne :
For i = 1 To UBound(TablDico) - 1
par :
For i = 0 To UBound(TablDico) - 1
soit :
Option Explicit
Option Base 1
Sub Repartition()
Dim DicoConcat As Object
Dim concat(), Colonns(), TablDico()
Dim DrLig As Long, i As Long, j As Long, Lig As Long, Col As Long
Application.ScreenUpdating = False
With Sheets("Feuil1")
DrLig = .Range("A" & Rows.Count).End(xlUp).Row
ReDim concat(DrLig)
ReDim Colonns(1 To DrLig, 1 To 6)
For i = 2 To DrLig
For j = 1 To 6
Colonns(i - 1, j) = .Cells(i, j)
Next j
concat(i - 1) = Colonns(i - 1, 5) & "_" & Colonns(i - 1, 6)
Next i
End With
Set DicoConcat = CreateObject("Scripting.Dictionary")
For i = LBound(concat) To UBound(concat)
DicoConcat(concat(i)) = ""
Next i
If DicoConcat.Count + ThisWorkbook.Worksheets.Count >= 250 Then
MsgBox "Votre classeur va dépasser les 250 feuilles. Fractionnez le au préalable."
Exit Sub
End If
TablDico = DicoConcat.keys
'Si vous souhaitez tester si la feuille a déjà été créée
'enlevez les apostrophes en début des lignes suivantes
For i = 0 To UBound(TablDico) - 1
' If FeuilleExiste(TablDico(i)) = False Then
ThisWorkbook.Worksheets.Add
With ActiveSheet
.Name = TablDico(i)
.Range("A1") = "Fournisseur"
.Range("B1") = "Ref"
.Range("C1") = "Description"
.Range("D1") = "Prix"
.Range("E1") = "Famille"
.Range("F1") = "Sous famille"
For j = 1 To UBound(concat)
If concat(j) = TablDico(i) Then
Lig = .Range("A" & Rows.Count).End(xlUp).Offset(1, 0).Row
For Col = 1 To 6
.Cells(Lig, Col) = Colonns(j, Col)
Next
End If
Next j
End With
' Else
' With Sheets(concat)
' .Cells.Clear
' End With
' End If
Next i
Sheets("Feuil1").Select
End Sub
Function FeuilleExiste(NomFeuille) As Boolean
Dim f As Object
On Error Resume Next
Set f = Sheets(NomFeuille)
If Err = 0 Then FeuilleExiste = True
Set f = Nothing
End Function
De plus je vais surement être trop gourmand, mais est il possible que le nom des feuilles soit un nom donné. Par ex la famille 1 sous famille 1 Banane, la famille 1 sous famille 2 Pomme ?
Le week end fut bon?
fais moi une liste des caractères spéciaux que tu rencontres colonne C.
Le nom des feuilles peut être modifié, mais j'ai besoin de savoir comment tu comptes faire. Tu ne connais pas à l'avance le nombre de feuilles... Dis moi, fais moi une liste également...
EDIT : peux tu me copier coller ici quelques unes des valeurs de ta colonne C qui bloquent?
Oui un petit weekend travail et toi ?
Je pensais pour le changement de nom créer une feuille avec :
2_1 = Pomme
2_2 = Banane....
De là lancer une macro qui va lire et remplacer.
Pour les symboles ce sont : ><-+=
Encore merci de ton aide
Tu n'as pas de formule colonne C?
Donne moi une liste d'exemples col C de "termes" bloquants...
2_1 = Pomme
2_2 = Banane Oui, mais il faudra que 2_1 soit en fait rigoureusement identique à Famille1_ss famille1. REprends les mêmes noms de familles et sous familles, pas que des chiffres...
Sub ListeFamillesSousFamilles()
Dim DicoConcat As Object
Dim concat()
Dim DrLig As Long, i As Long, j As Long
Application.ScreenUpdating = False
With Sheets("Feuil1")
DrLig = .Range("A" & Rows.Count).End(xlUp).Row
ReDim concat(DrLig)
For i = 2 To DrLig
concat(i - 1) = .Cells(i, 5) & "_" & .Cells(i, 6)
Next i
End With
Set DicoConcat = CreateObject("Scripting.Dictionary")
For i = LBound(concat) To UBound(concat)
DicoConcat(concat(i)) = ""
Next i
With Sheets("Feuil2")
.Range("A1").Resize(DicoConcat.Count) = Application.Transpose(DicoConcat.keys)
End With
End Sub
CUVE >12345678
BILLE $
FIL HUILE >a5879/2 >
Les familles et sous familles ne changerons jamais, au pire ce qu'il peut arriver c'est qu'il faille en rajouter
ex : 01_07 : Famille : Moteur Ss famille : Volant moteur et j'aimerai afficher a la place de 01_07 : Volant moteur
Pour les symboles le mieux c'est qu'ils restent en place, mais si pour se faciliter la tache on les enleves ce n'est pas grave
Pour moi quand je lance la macro elle se lance mais au bout de quelques secondes cela plante, si j'enleve tous les symboles cela fonctionne
- 1
- 2