Déplacer une ligne dans une autre feuille sous condition

Bonjour à tous,

J'aimerais s'il vous plaît obtenir de l'aide sur ce "problème" : je dispose d'une liste de données, que je souhaiterais répartir dans différentes feuilles de mon fichier excel en fonction d'un élément fixe de la liste.

Pour que ce soit plus clair, je vous donne un exemple : dans la cellule C1 se trouve l'entrée "F0123", et l'une des feuilles de mon fichier s'intitule F0123. J'aimerais donc que toute la ligne 1 soit déplacée dans la feuille qui porte le même nom... L'élément en fonction duquel je souhaite déplacer est toujours contenu dans la colonne C, et commence par F (il s'agit d'un code d'essai). J'ai 5 codes d'essai différents en tout, soit 5 feuilles, toutes intitulées selon ces codes.

Je ne sais pas du tout si c'est possible, j'imagine que oui (tout est possible, non ?), peut-être avec une formule, peut être avec une macro ... Je m'en remets à vos connaissances !

Je précise que mon niveau excel est tout juste correct, et je n'y connais vraiment (vraiment) rien en programmation VBA ... Je m'en tiens à enregistrer de simples macros lorsque j'en ai besoin ...

Un grand merci à tous ceux qui pourront me venir en aide !

Bonjour,

Voilà ma proposition en VBA (la feuille avec la liste de données à affecter doit se trouver en 1ère position):

Sub ExporterLignes()

Dim i As Long, Infos(6, 2) As Variant, Nf As Byte 'Attention, le "6" dans Infos(6,2) est prévu pour un classeur comprenant 6 feuilles (ou moins)

For Nf = 1 To Worksheets.Count 'Pour chaque feuille du classeur
    With Sheets(Nf)
        Infos(Nf, 1) = .Name 'Nom de la feuille
        Infos(Nf, 2) = .Cells(Rows.Count, 1).End(xlUp).Row 'Dernière ligne
    End With
Next Nf
With Sheets(1) 'Feuille 1 = base de données
    For i = Infos(1, 2) To 2 Step -1  'Pour chaque ligne en partant de la dernière
        For Nf = 2 To Worksheets.Count 'Pourcourir les feuilles
            If .Cells(i, 3) = Infos(Nf, 1) Then 'Si l'info en colonne C correspond à un nom de feuille
                .Rows(i).Copy Sheets(Nf).Rows(Infos(Nf, 2) + 1) 'Copier à la suite
                Infos(Nf, 2) = Infos(Nf, 2) + 1 'Incrémenter la position de la dernière ligne
                .Rows(i).Delete 'Supprimer la ligne de la base de données
            End If
        Next Nf
    Next i
End With

End Sub

J'ajoute également un fichier exemple pour voir comment le code est intégré au fichier et pour le tester :

1'272classeur1test.xlsm (20.69 Ko)

Merci beaucoup pour la réponse, je ne pensais pas en obtenir une si complète et rapide !

J'ai regardé au niveau du fichier excel joint, et c'est exactement ce que je recherche !

Par contre, il faut que je puisse l'appliquer à mon fichier excel, et là je sèche un peu ... vu que je n'y connais pas grand chose en VBA, je ne sais pas quoi changer dans ton code pour que cela s'applique à mon fichier. J'imagine par exemple que je dois indiquer un nom/numéro de feuille à un moment, mais je sais pas où/sous quelle forme l'écrire.

Lorsque j'ai essayé d'utiliser ta macro telle quelle, j'ai eu une erreur d'exécution '9' : l'indice n'appartient pas à la sélection au niveau de la ligne :

 Infos(Nf, 1) = .Name 'Nom de la feuille

Est-ce que tu peux me donner quelques explications sur ton code, pour que je sache ce que je dois modifier ?

Egalement, voici plus de précisions (certainement pas toutes utiles) sur l'agencement de mon fichier excel :

  • ma base de données se trouve dans la Feuil1 (qui est en position 7 au niveau des onglets)
  • il y a donc avant cette feuille 6 autres feuilles (sans rapport avec ce que je souhaite faire)
  • les feuilles intitulées F--- se trouvent dans les onglets suivants
  • erreur de ma part (je m'excuse), la colonne contenant le code F est la deuxième (B) et non la troisième

Merci par avance!

Toutes les instructions du type "Worksheets" et "Sheets" font référence à une feuille. Pour travailler sur une feuille définie, tu peux soit utiliser son nom ("Sheets("Feuil1")"), soit sa position dans le classeur ("Sheets(8)").

Je vais rajouter quelque part une condition pour ne pas travailler sur les feuilles inférieures à 7 et je te redonne le script.

Avec le code actuel, c'est normal que tu aies une erreur puisque mon tableau Infos() n'a que 6 lignes (pour recevoir les noms et nombres de ligne de 6 feuilles au maximum). Or si ta base de données est en 7ème position, c'est que tu as forcément plus de 7 feuilles et donc que quand tu cherches la valeur dans Infos(7, 1) tu es hors de la dimension acceptée par le tableau. Aussi, tu peux très bien créer un tableau de grande taille mais n'utiliser que les premières valeurs. Par exemple, déclarer un tableau Infos(1000, 2).

Nouvelle proposition (attention au nom de ta feuille contenant les données à affecter : ici "Feuil1") :

Sub ExporterLignes()

Dim i As Long, Infos(255, 2) As Variant, Nf As Byte, MaxFeuil As Byte, Fdéb As Byte
MaxFeuil = Worksheets.Count 'Nombre de feuilles dans le classeur

For Nf = 1 To MaxFeuil 'Pour chaque feuille du classeur
    With Sheets(Nf) 'Ajout du nombre de feuilles
        If .Name = "Feuil1" Then Fdéb = Nf 'Identifie la position de la base de données
        Infos(Nf, 1) = .Name 'Nom de la feuille
        Infos(Nf, 2) = .Cells(Rows.Count, 1).End(xlUp).Row 'Dernière ligne avec des données
    End With
Next Nf
With Sheets(Fdéb) 'Feuille 1 = base de données
    For i = Infos(1, 2) To 2 Step -1  'Pour chaque ligne en partant de la dernière
        For Nf = Fdéb + 1 To MaxFeuil 'Pourcourir les feuilles après la base de données
            If .Cells(i, 3) = Infos(Nf, 1) Then 'Si l'info en colonne C correspond à un nom de feuille
                .Rows(i).Copy Sheets(Nf).Rows(Infos(Nf, 2) + 1) 'Copier à la suite
                Infos(Nf, 2) = Infos(Nf, 2) + 1 'Incrémenter la position de la dernière ligne
                .Rows(i).Delete 'Supprimer la ligne de la base de données
            End If
        Next Nf
    Next i
End With

End Sub

Bonjour !

(je m'excuse pour l'absence de réponse, je n'avais plus accès à mon fichier excel donc je n'ai pas pu tester immédiatement...)

J'ai repris ton code tel quel, en modifiant seulement "Feuil1" par le nom de ma feuille contenant la base de données

Cette fois-ci, aucun message d'erreur, mais il ne se passe rien

Dois-je modifier autre chose ?

Peux tu envoyer ton fichier ? S'il est confidentiel, envoie le en message privé que je regarde à ça, par ce que à chaud, je ne vois pas d'où peut venir l'erreur (et de mémoire ça marchait chez moi).

bonjour

mon opinion personnelle de moi à moi

répartir des données dans différentes feuilles c'est ce qu'on faisait sur papier il y a 30 ans

aujourd'hui sur informatique, on a une feuille de saisie dans laquelle on ajoute et on n'efface JAMAIS !

si on veut voir un extrait de cette immense feuille (elle grandit au fil des années de saisie ! ) on fait des filtres, des tris, des TCD des Données:Obtenir, du Power BI ou autre

et on a des vues, des synthèses, des graphiques. Tout interactif, voir les segments.

aucun VBA,

s'il faut faire des totaux, les TCD s'en chargent : pas de formules

exemple

j'ai mis un TCd sur la même feuille pour bien voir, mais il faudrait le mettre sur une feuille à part

295classeur1.xlsx (17.01 Ko)

@Pedro

ceci devrait pouvoir t'aider :

kyu_kyu a écrit :
  • ma base de données se trouve dans la Feuil1 (qui est en position 7 au niveau des onglets)
  • il y a donc avant cette feuille 6 autres feuilles (sans rapport avec ce que je souhaite faire)
kyu_kyu a écrit :

- erreur de ma part (je m'excuse), la colonne contenant le code F est la deuxième (B) et non la troisième

y'a plus qu'à adapter ton code !

dhany

C'est en effet un fichier confidentiel, mais je t'en transmets un autre réalisé sur la même base et qui ne comprend aucune donnée sensible (ce fichier est dépersonnalisé mais dans la forme, il est en tout point comme l'original).

147projet.xlsm (51.88 Ko)

Bonjour kyu_kyu,

je te retourne ton fichier modifié, où j'ai adapté le code VBA de Pedro :

198projet.xlsm (46.80 Ko)

à toi de faire les tests !

dhany

Bonjour kyu_kyu,

je te retourne ton fichier modifié, où j'ai adapté le code VBA de Pedro :

Projet.xlsm

à toi de faire les tests !

dhany

Parfait, merci !

Bonjour kyu_kyu,

je te retourne ton fichier modifié, où j'ai adapté le code VBA de Pedro :

Projet.xlsm

à toi de faire les tests !

dhany

Je te remercie !

Par contre... est-ce que lorsque tu exécutes la macro, tu as bien l'exportation des lignes dans les différentes feuilles ? Parce que de mon côté, ça ne fonctionne toujours pas je fais peut-être quelque chose de la mauvaise manière ... j'ai beau lancer, il ne se passe rien ... une idée ?

Une petite erreur à corriger dans le code et ça roule :

For i = Infos(Fdéb, 2) To 2 Step -1
'Et pas :
For i = Infos(1, 2) To 2 Step -1

J'ai corrigé comme tu l'as fait, mais toujours rien

Si ça fonctionne sur ton fichier, est-ce que tu pourrais me le renvoyer s'il te plaît ? Je dois avoir une coquille quelque part ...

489projet-2.xlsm (45.04 Ko)

Ça fonctionne parfaitement, merci beaucoup !

Rechercher des sujets similaires à "deplacer ligne feuille condition"