[Catégorie modifiée VB6 --> VBA] Macro pour répartir les données d'une feuille E

Signaler
Messages postés
7
Date d'inscription
mardi 15 septembre 2009
Statut
Membre
Dernière intervention
22 juillet 2010
-
Messages postés
7
Date d'inscription
mardi 15 septembre 2009
Statut
Membre
Dernière intervention
22 juillet 2010
-
Bonjour,
Tous les mois je reçois un fichier avec les résultats de vendeurs.
Le fichier est présenté avec le nom des vendeurs les uns en dessous des autres (plusieurs lignes par vendeurs) avec pour chaque ligne les données correspondantes à un acte réalisé à une date du mois.
Je souhaiterais une macro qui va pointer sur le nom d'un vendeur, qui sélectionne toutes les lignes correspondantes à ce vendeur, les copies, ajoute un onglet (dans le même classeur), colle ces données dans le nouvel onglet et nomme ce nouvel onglet avec le nom du vendeur. Et ainsi de suite jusqu'au dernier vendeur.

Pouvez-vous m'aider ?

JMC

5 réponses

Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
80
Salut

"Tous les mois je reçois un fichier avec les résultats de vendeurs"
Fichier de type texte ou une feuille Excel ?
Si c'est un fichier texte, comment sont séparées les données sur une même ligne ?

"... ajoute un onglet (dans le même classeur), ..."
un onglet ? Une feuille, tu veux dire ?

"et nomme ce nouvel onglet avec le nom du vendeur"
Et si une feuille porte déjà le nom du vendeur ?
Est-ce que cela peut arriver ?

Avant de poursuivre, il faut les réponses à ces questions.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
7
Date d'inscription
mardi 15 septembre 2009
Statut
Membre
Dernière intervention
22 juillet 2010

C'est bien un fichier excel que je reçois.

Ajouter un onglet veut bien dire effectivement ajouter une nouvelle feuille.
Une feuille ne peut pas à l'avance porter le nom d'un vendeur puisqu'il n'y a qu'une seule feuille dans le fichier que je reçois et c'est moi qui veux crééer, en plus, une feuille par vendeur. cette feuille porterait donc le nom du vendeur et stokerait les données correspondantes à ce vendeur.

Est-ce plus compréhensible ainsi ?

JMC
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
80
Ok
Le code permettant l'ouverture du classeur peut être généré par l'enregistreur de macro. Je te laisse faire.

Ensuite, il te faudra scruter chaque ligne de LA feuille de ce classeur.
On supposera que les données se terminent dès qu'une ligne vide est rencontrée.
Une fois le classeur ouvert, voilà le principe de lecture, cellule par cellule d'un Range :
    Dim monRange As Range
    Dim maCellule As Range
    
    ' Colonne A = nom des vendeurs
    Set monRange = Workbooks("le nom du classeur").Worksheets("le nom de la feuille").Range("A:A")
    For Each maCellule In monRange
        ' On sort dès qu'on rencontre une cellule vide
        If IsEmpty(maCellule) Then Exit For
        ' Le traitement
        ' ...
    Next

Ensuite, à chaque fois qu'on lit une ligne, deux possibilités :
- Il existe déjà une feuille portant le nom du vendeur : on la sélectionne
- cette feuille n'existe pas : on la crée
--> Rechercher la feuille
    Dim maFeuille As Worksheet
    Dim maFeuilleVendeur As Worksheet
    
    Set maFeuilleVendeur = Nothing  ' Init
    For Each maFeuille In Workbooks("mon classeur").Worksheets
        If maFeuille.Name = maCellule.Value Then
            Set maFeuilleVendeur = maFeuille
            Exit For
        End If
    Next
    If maFeuilleVendeur Is Nothing Then
        ' On n'a pas trouvé de feuille avec ce nom
        Set maFeuilleVendeur = Workbooks("mon classeur").Worksheets.Add
        maFeuilleVendeur.Name = maCellule.Value
    End If
    ' maFeuilleVendeur est maintenant la feuille vers laquelle
    '   on va transférer les données

Tu n'as plus qu'à transférer le contenu de la ligne vers cette feuille :
- Première chose : trouver la première cellule vide dans maFeuilleVendeur, au cas où on aurait déjà écrit des données :
Là encore, on suppose que les données s'écrivent dans la colonne A
    Dim maTargetCellule As Range
    ' Recherche la 1ère cellule vide
    Set maTargetCellule = maFeuilleVendeur.Range("A65000").End(xlUp).Offset(1, 0)

Ensuite, transférer la ligne :
En supposant qu'il y ait 10 colonnes à transférer :
    Dim r As Long
    For r = 1 To 10
        maTargetCellule.Offset(0, r).Value = maCellule.Offset(0, r).Value
    Next r


Il faudra imbriquer tous ces bouts de code, les uns dans les autres + mettre tous les Dim en tête de procédure.
Analyse et comprends bien à quoi sert chaque partie.
Messages postés
7
Date d'inscription
mardi 15 septembre 2009
Statut
Membre
Dernière intervention
22 juillet 2010

Super !

J'essaie tout celà et vous tiens au courant en cas de pépin.

Merci beaucoup

JMC
Messages postés
7
Date d'inscription
mardi 15 septembre 2009
Statut
Membre
Dernière intervention
22 juillet 2010

J'ai un petit souci avec le code.

Quand j'arrive à l'opération :
Set maFeuilleVendeur = Workbooks("mon classeur").Worksheets.Add
maFeuilleVendeur.Name = maCellule.Value
(j'ai bien remplacé "mon classeur" par le nom du classeur sur lequel je travaille)

J'ai une erreur : "La methode 'Name' de l'objet'_Worksheet' à échoué"

Comment puis-je solutionner cette erreur ?

Merci d'avance


JMC