XL 2019 copier les lignes en fonction d'un mot dans les cellules

321concept

XLDnaute Nouveau
Bonjour,

Je ne suis pas ce qu'on appelle un féru de EXCEL. Je n'y connait pas grand chose.

Mon problème:

J'ai un tableau Excel de plus de 2000 lignes, avec une 30aine de cellules pour chaque ligne.
Ce sont, entre autre, des références et des marques de produits qui sont notées assez anarchiquement dans des cellules différentes sur la ligne que je cherche à copier.

Bref, j'aimerai copier les lignes qui contiennent un mot donné de ces cellules, et les coller dans une autre feuille pour effectuer un tri plus "manuel"

exemple, je dois trier pour copie les ligne contenant "monique Ranou", "Fleury michon", etc... Elle ne sont pas forcément dans la colonne MARQUE, elles peuvent être dans Référence, Fournisseur, charcuterie, etc...
Si c'est possible, copier toutes les lignes d'un seul coup et les copier dans une autre feuille

Ca ne dois pas être vraiment compliqué, mais mon Excel est du niveau "Gaz de Schiste"
 
Solution
déjà c'est bien, tu cherches à comprendre.. pas sur que ce soit une majorité des gens qui viennent ici

du coup, je remets encore une fois le fichier, car je viens de voir qu'il y avait un bug que j'ai corrigé
et un autre problème avec le bouton qui perd le lien avec la macro.. sans doute du fait qu'elle s'appelait "extraire".. sans doute un mot reconnu par VBA comme un nom réservé??

321concept

XLDnaute Nouveau
une fois que les lignes sont copiées.. comment comptes tu "séparer"/"Corriger" les infos?
parce que en reprennant ton exemple d'Aagaard, le mot peut apparaitre n'importe ou DANS la cellule
les infos de volume et autres n'apparaissent pas.. tu comptes tout faire à la main??
ne serait il pas plus judicieux de traiter le problème à la source.. cad au moment de la création de l'onglet "Stock" ??

en attendant, une proposition de code pour appliquer un filtre, copier le résultat dans une nouvelle feuille

VB:
Sub extraire()
With Sheets("Stock")
    If .AutoFilterMode Then
        .AutoFilterMode = False
    End If
    fin = .Range("A" & .Rows.Count).End(xlUp).Row
    Set zoneToFilter = .Range("A1:I" & fin)
 
    MotAFiltrer = Application.InputBox("Saisissez le mot à filter")
    'MsgBox MotAFiltrer
    If MotAFiltrer = "" Then Exit Sub
    zoneToFilter.AutoFilter Field:=2, Criteria1:="=*" & MotAFiltrer & "*", Operator:=xlAnd
    Set ZoneToCopy = zoneToFilter.SpecialCells(xlCellTypeVisible)
End With
If Not FeuilleExiste(CStr(MotAFiltrer)) Then
    ActiveWorkbook.Sheets.Add
    ActiveSheet.Name = MotAFiltrer
End If

ZoneToCopy.Copy Destination:=Sheets(MotAFiltrer).Range("A1")
Sheets("Stock").AutoFilterMode = False
End Sub

Function FeuilleExiste(NomFeuille As String) As Boolean
FeuilleExiste = False
For Each ws In ActiveWorkbook.Sheets
    If ws.Name = NomFeuille Then
        FeuilleExiste = True
        Exit For
    End If
Next ws

End Function
En premier lieu, merci de vous intéresser a mon cas.
Je ne pensais pas que ce fut si compliqué

(En 2, je ne sais pas quoi faire avec le code que vous avez écrit, et encore moins ou le coller pour obtenir un résultat à vous fournir)

Pour répondre à:
parce que en reprennant ton exemple d'Aagaard, le mot peut apparaitre n'importe ou DANS la cellule

C'est bien cela, n'importe ou dans la cellule, et pas forcement dans la même colonne, d'où mon problème.
D'où ma question; y a t'il un moyen, par "rechercher" par exemple, de localiser un même mot dans une feuille qui identifierait les lignes portant ce mot, afin de les copier.

je dois dire que je tourne sur le net depuis longtemps, j'ai visité le site de M.OFFICE, je suis même aller voir chez libreoffice, mais rien, nada...




Mon exemple concret aagaard c'est ça:

Cosmétique naturelleAAGAARD DENTIFRICE A LA PROPOLIS 50ML
4​
11​
44​
4011245000119Stock revente

Ensuite je veux copier toutes les lignes de ma feuille stock ou se trouve le mot aagaard, pour les coller dans une autre feuille que je nomme aagaard
après, effectivement, il serait judicieux que je fasses les modifs à la main.
Comme je sais que aagaard est une marque de produit, et que toutes les lignes qui viennent d'être copiées porte le mot "aagaard", du coup, c'est forcément la bonne marque.

Donc en extrapolant: dans ma nouvelle feuille, je crée une nouvelle colonne à la main que je nomme "marque", j'inscrit le nom de la marque dans le nombre le lignes correspondantes, puis je corrige les éventuelles erreurs, toujours à la main, cosmétiques naturelles qui deviennent "produits d'hygiène" pour notre exemple, et encore au besoin, séparer encore à la main dans une nouvelle colonne, les contenances.

AAGAARDCosmétique naturelleAAGAARD DENTIFRICE A LA PROPOLIS 50ML
4​
11​
44​
4011245000119Stock revente

qui deviendrait

AAGAARDProduits d'hygièneAAGAARD DENTIFRICE A LA PROPOLIS 50ML
4​
11​
44​
4011245000119Stock revente

Avec correction manuelle le cas échéant

AAGAARDProduits d'hygièneDENTIFRICE A LA PROPOLIS50ML
4​
11​
44​
4011245000119Stock revente
 

vgendron

XLDnaute Barbatruc
le bouton n'est pas linké à la bonne macro apparemment...

ici, c'est corrigé

hello @Marcel32

effectivement.. un peu d'aide supplémentaire s'impose

1) Ouvrir l'éditeur VBA : Alt + F11
2) double clic sur le projet à gauche (projet = nom du fichier excel)
3) clic droit sur le nom du projet- insérer module standard
4) dans la fenetre de code vide qui vient de s'ouvrir à droite: copier coller le code fourni
 

Pièces jointes

  • stock expport-05-2022 (1).xlsm
    162.7 KB · Affichages: 5

vgendron

XLDnaute Barbatruc
la meme avec des commentaires pour t'aider à comprendre
VB:
Sub extraire()
With Sheets("Stock") 'dans la feuille Stock
    If .AutoFilterMode Then 'si un filtre est actif
        .AutoFilterMode = False 'on supprime les filtres automatiques
    End If
    fin = .Range("A" & .Rows.Count).End(xlUp).Row 'dernière ligne non vide de la colonne A
    Set zoneToFilter = .Range("A1:I" & fin) 'on affecte tout le tableau de données à une variable 'ZoneToFilter  (j'ai choisi un nom de variable explicite)
    
    MotAFiltrer = Application.InputBox("Saisissez le mot à filter") 'on ouvre une boite de dialogue pour inviter l'utilisateur à saisir... un MOT à filtrer  !! Bingo :-D
    'MsgBox MotAFiltrer
    If MotAFiltrer = "" Or Not MotAFiltrer Then Exit Sub 'si on valide sans rien mettre OU si on annule==> on sort de la macro
    zoneToFilter.AutoFilter Field:=2, Criteria1:="=*" & MotAFiltrer & "*", Operator:=xlAnd 'on applique le filtre
    Set ZoneToCopy = zoneToFilter.SpecialCells(xlCellTypeVisible) 'on affecte le résultat du filtre = cellules visibles à une autre variable.. explicite
End With
If Not FeuilleExiste(CStr(MotAFiltrer)) Then 'on vérifie que la feuille dont le nom est le mot à filtrer
    ActiveWorkbook.Sheets.Add 'on ajoute une nouvelle feuille
    ActiveSheet.Name = MotAFiltrer 'on la renomme
End If

ZoneToCopy.Copy Destination:=Sheets(MotAFiltrer).Range("A1") 'on copie la zone à copier dans la nouvelle feuille à partir de A1
Sheets("Stock").AutoFilterMode = False 'on désactive le filtre
End Sub

Function FeuilleExiste(NomFeuille As String) As Boolean 'fonction appelée avec une chaine de caractère, et qui répond Vrai ou Faux
FeuilleExiste = False 'initialisation à faux
For Each ws In ActiveWorkbook.Sheets 'on parcourt toutes les feuilles du classeur actif
    If ws.Name = NomFeuille Then 'si le nom de la feuille correspond à la chaine de caractère entrée en paramètre (NomFeuile=
        FeuilleExiste = True 'on retourne "Vrai"
        Exit For 'on quitte la boucle: pas besoin de la continuer
    End If
Next ws

End Function
 

321concept

XLDnaute Nouveau
la meme avec des commentaires pour t'aider à comprendre
VB:
Sub extraire()
With Sheets("Stock") 'dans la feuille Stock
    If .AutoFilterMode Then 'si un filtre est actif
        .AutoFilterMode = False 'on supprime les filtres automatiques
    End If
    fin = .Range("A" & .Rows.Count).End(xlUp).Row 'dernière ligne non vide de la colonne A
    Set zoneToFilter = .Range("A1:I" & fin) 'on affecte tout le tableau de données à une variable 'ZoneToFilter  (j'ai choisi un nom de variable explicite)
   
    MotAFiltrer = Application.InputBox("Saisissez le mot à filter") 'on ouvre une boite de dialogue pour inviter l'utilisateur à saisir... un MOT à filtrer  !! Bingo :-D
    'MsgBox MotAFiltrer
    If MotAFiltrer = "" Or Not MotAFiltrer Then Exit Sub 'si on valide sans rien mettre OU si on annule==> on sort de la macro
    zoneToFilter.AutoFilter Field:=2, Criteria1:="=*" & MotAFiltrer & "*", Operator:=xlAnd 'on applique le filtre
    Set ZoneToCopy = zoneToFilter.SpecialCells(xlCellTypeVisible) 'on affecte le résultat du filtre = cellules visibles à une autre variable.. explicite
End With
If Not FeuilleExiste(CStr(MotAFiltrer)) Then 'on vérifie que la feuille dont le nom est le mot à filtrer
    ActiveWorkbook.Sheets.Add 'on ajoute une nouvelle feuille
    ActiveSheet.Name = MotAFiltrer 'on la renomme
End If

ZoneToCopy.Copy Destination:=Sheets(MotAFiltrer).Range("A1") 'on copie la zone à copier dans la nouvelle feuille à partir de A1
Sheets("Stock").AutoFilterMode = False 'on désactive le filtre
End Sub

Function FeuilleExiste(NomFeuille As String) As Boolean 'fonction appelée avec une chaine de caractère, et qui répond Vrai ou Faux
FeuilleExiste = False 'initialisation à faux
For Each ws In ActiveWorkbook.Sheets 'on parcourt toutes les feuilles du classeur actif
    If ws.Name = NomFeuille Then 'si le nom de la feuille correspond à la chaine de caractère entrée en paramètre (NomFeuile=
        FeuilleExiste = True 'on retourne "Vrai"
        Exit For 'on quitte la boucle: pas besoin de la continuer
    End If
Next ws

End Function
 

vgendron

XLDnaute Barbatruc
déjà c'est bien, tu cherches à comprendre.. pas sur que ce soit une majorité des gens qui viennent ici

du coup, je remets encore une fois le fichier, car je viens de voir qu'il y avait un bug que j'ai corrigé
et un autre problème avec le bouton qui perd le lien avec la macro.. sans doute du fait qu'elle s'appelait "extraire".. sans doute un mot reconnu par VBA comme un nom réservé??
 

Pièces jointes

  • stock expport-05-2022 (2).xlsm
    163.9 KB · Affichages: 8

321concept

XLDnaute Nouveau
Ok, ça fonctionne pour mon fichier d'exemple.
je vais aller voir dans VBA comment ce fichier est "monté" et essayer de l'implanté dans les autres fichier Excel.
Très franchement, je vous dois un énorme merci. Parce que je pense que c'est 2 semaines que je vais gagner en temps.
Je vais me mettre au VBA; il y a des construction un peu comme le GW Basic, mais ça ne rajeuni personne.
je ne pensais vraiment pas que ce soit aussi dur...
Merci beaucoup, je vais apprendre le VBA, peut être qu'un jour on discutera plutôt que je pose des questions.

Jérôme
 

321concept

XLDnaute Nouveau
Je crois qu'il veut dire : "comment insérer le code dans son vrai fichier, puis l'utiliser". 😉


[edit]
Ah ben non. J'avions mal compris... 😔
[/edit]
Merci pour tout le temps que vous avez passé pour résoudre mon problème. Vous avez compris que je me sers d'Excel surtout comme d'un lecteur de fichiers. Si vous avez un soucis dans côté web, n'hésitez pas, avec mon pseudo, l'adresse mail n'est pas compliqué à trouver
Jérôme
 

Discussions similaires