Forum Clubic

Excel-VBA décomposer une feuille

Bonjour à tous,
Dans un classeur excel, j’ai une feuille principale qui contient les champs suivant :
Branch - type - source
A-1-2
A-1-3
A-2-4
B-9-8
B-4-8
C-4-4
D-7-7
D-9-1
Cette feuille est ordonnée sur le champ Branch.
Je voudrais, au moyen d’une macro VBA, décomposer cette feuille principale pour avoir une feuille par Branch (càd une feuille avec touts les lignes commencant par A, par B,…)
J’espère avoir été suffisament clair,
Merci

Tout dépend du niveau de vba que tu veux utiliser.
Si tu ne tiens pas à ce que ce soit particulièrement propre, tu peux faire en macro enregistrée, en utilisant le filtrage automatique par exemple.
Sinon balayage de la zone de donnée avec une boucle :

  • selection 1e ligne
    boucle
  • extension selection aux lignes ayant le même contenu dans la 1e colonne
  • copie
  • création d’un onglet ayant pour nom le contenu de la 1e colonne
  • collage dans l’onglet
  • sélection ligne suivant la sélection
    jusqu’a la fin de la zone utile

Je ne tiens pas particulièrement à un code propre,
je souhaite automatiser au maximum,

le balayage des données par une boucle??? il faut que je réféchisse.

Pour l’instant, j’avais essayé de monter un macro avec un filtre automatique
mais je n’arrive pas à définir une varible représentant les différents choix du filtre,
pour par la suite, copier la selection sur une autre feuille.

Tu as dit que tu partais de données triées
Donc tu peux créer un tableau de string en balayant la première comonne, et en insérant les valeurs des cellules à partir du moment où elles ne sont pas identiques à la précédente.
Ensuite, tu n’auras plus qu’à appliquer chacune de ces valeurs comme critère de filtre

Effectivement c’était une méthode plus facile que par un filtre

et ça marche
Voici mon code

Sub Macro1()


Dim Nbligne As Integer
Dim Nom_feuille As String
Dim i As Long
Dim n As Long
Dim m As String

'trier sur colonne D
m = InputBox(“Quel colonne pour le trie ???”, “INFO2”)
Cells.Select
Selection.Sort Key1:=Range(Cells(1, m), Cells(50000, m)), Order1:=xlAscending, Header:=xlYes, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal

ActiveSheet.Name = "Data"
i = 2

Do While ActiveSheet.Cells(i, m) <> ""
Nom_feuille = ActiveSheet.Cells(i, m)

    'compte le nombre de ligne à copier
    Do While ActiveSheet.Cells(i + 1, m) = Nom_feuille
    i = i + 1
    Loop

'selectionne, copie et colle la selection par devise
Range(Cells(1, 1), Cells(i, 20)).Select
Application.CutCopyMode = False
Selection.Copy
ActiveWorkbook.Sheets.Add
ActiveSheet.Name = Nom_feuille
Selection.Insert Shift:=xlDown
Sheets("Data").Select
Range(Cells(2, 1), Cells(i, 20)).Select
Selection.Delete Shift:=xlUp
i = 2
Loop

End Sub

Merci

Ton programme n’a l’air de trier qu’une seule colonne (la colonne m)
Est-tu sûr qu’à la sortie du tri les correspondances ligne par ligne sont toujours bonnes ?

Tu n’es pas obligé de supprimer les lignes déjà traitées :
il suffit que tu fasses “glisser” ta zone active en mettant la première valeur de ligne dans une variable