Selection de ligne

Bonjour,

Je dispose d'un fichier excel dont les lignes en A sont identiques en lot ( on va avoir par ex, 122 lignes avec "client1", 146 lignes avec "client2" etc)
J'aimerai savoir comment faire pour sélectionner les lignes identiques entre elles pour les ranger dans des tableaux différents..
Merci pour vos réponse

5 réponses

Résumé de la discussion

La discussion porte sur comment regrouper les lignes de la colonne A dans Excel et les placer dans des feuilles séparées selon chaque valeur identique. Plusieurs propositions évoquent l'utilisation de VBA, notamment une macro qui parcourt les données et crée une feuille par valeur unique, tout en gérant les noms et les caractères invalides. Des remarques soulignent des limites comme la longueur des noms de feuille (31 caractères) et des erreurs 'nom de feuille non valide' liées à certains noms trop longs ou contenant des caractères spéciaux. D'autres échanges suggèrent de nettoyer les noms (suppression de caractères spéciaux et tri des valeurs) avant la création des feuilles pour éviter les messages d'erreur.

Bobot (l’IA à votre service)
  1. Modérateur
    Bonjour,

    Manuellement avec :
    - un tri par la colonne A
    - un filtre sur cette colonne
    - des copié/collé.
    1. Merci
      N'y a t-il pas un moyen de le faire automatiquement ? J'ai plus de 3000 blocs de lignes identiques
  2. Modérateur
    Le tri peut être fait manuellement une seule fois.
    Après ne reste plus qu'à automatiser les copié/collé.
    Tu as, par contre, 3000 clients? comportant chacun entre 100 et 150 lignes?
    1. Non les clients c'était pour donner un exemple, pour moi il s'agit de machine et de temps de fab. Mais quand j'automatiserais les copier coller, comment faire en sorte qu'il reconnaisse quand je passe à un autre nom de machine ?
      Merci
    2. Modérateur
      @samPeu importe...
      Client, machine, pépitos ou cafés, on s'en fiche.
      J'ai besoin d'en connaitre le nombre. Ainsi que le nombre moyen approximatif de lignes par machine. Ainsi que le nombre de colonnes à copié-collé.
    3. Après 1er tri, il me reste 82 lots de machines avec des lignes variant de 200 a parfois 2000 selon le lots, c'est très disparate. Et j'ai 3 colonnes a copier coller
    4. Modérateur
      @samEt tes résultats, tu les veux ou?
      Dans 82 nouvelles feuilles?
      Dans 82 nouveaux classeurs?
      Autre?
    5. Dans 82 nouvelles feuilles dans l'idéal
  3. Modérateur
    Bonjour,
    Quelques infos complémentaires pour ne pas que tu aies trop de choses à adapter :
    - nom de la feuille contenant tes données,
    - Dans qu'elles colonnes sont situées les données à copier-coller,
    - Les noms des machines sont dans qu'elle colonne?
    - y a t'il une ligne d'entête? Si oui, laquelle? 1ère ligne? autre?

    🎼 Cordialement,
    Franck 🎶
    1. Bonjour,
      le nom de la feuille est "procede_etape"
      il s'agit des colonnes A et B à copier
      Le nom des machines sont dans la colonne A et il y a une ligne d'entête, la 1ère.
      Merci
    2. Modérateur
      @samEt une dernière question (promis après je m'y met...) :
      Tes noms de machine comportent ils des caractères spéciaux?
      Si oui, lesquels?
    3. :) alors oui, il y a un * a chaque début de nom et un _. Il y a aussi des points..
    4. Modérateur
      @samle signe * devra être remplacé ou supprimé dans le nom des feuilles. Ta préférence? Suppression ou remplacement? Si remplacement, par quoi?
    5. Suppression c'est niquel :)
  4. Modérateur
    Bon...
    Voici un premier jet.
    A adapter, les deux constantes déclarées dans l'entête du module.
    Il s'agit de tes entêtes de colonne...

    Il peut y avoir un souci au niveau du format de tes données dans les feuilles créées. Notamment tu parlais de temps de fabrication. Il faudra voir ça après essai de cette macro.
    Essaye là donc sur une copie de ton classeur, pas sur l'original...

    J'ai également pré-supposé que tu as préalablement trié tes données...

    Reviens nous dire ce qu'il en est ainsi que le temps d'exécution...
    A insérer dans un module standard et lancer par ALT+F8
    Option Explicit
    '*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* A ADAPTER
    Const ENTETE_A$ = "Machine"            'entête colonne A
    Const ENTETE_B$ = "Temps de Fab"       'entête colonne B
    '*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* 
    
    Sub Creation_Feuilles_Machine()
    Dim wshSheet As Worksheet
    Dim Plage As Range, DL&, L&, Cpt&
    Dim Tb_In, Dico As Object
    Dim t As Double
       
       t = Timer
       Set Dico = CreateObject("Scripting.Dictionary")
       With Worksheets("procede_etape")
          DL = .Columns(1).Find("*", , , , xlByColumns, xlPrevious).Row
          Set Plage = .Range("A2:B" & DL)
       End With
       Tb_In = Plage
       Application.ScreenUpdating = False
       For L = LBound(Tb_In, 1) To UBound(Tb_In, 1)
          If Not Dico.Exists(Tb_In(L, 1)) Then
             Dico(Tb_In(L, 1)) = ""
             Set wshSheet = Add_Feuil(Replace(Tb_In(L, 1), "*", ""))
             With wshSheet
                .Range("A1") = ENTETE_A
                .Range("B1") = ENTETE_B
             End With
             Cpt = 1
          End If
          Cpt = Cpt + 1
          With wshSheet
             .Range("A" & Cpt) = Tb_In(L, 1)
             .Range("B" & Cpt) = Tb_In(L, 2)
          End With
       Next L
       MsgBox Timer - t & " secondes"
    End Sub
    
    Function Add_Feuil(NF$) As Worksheet
    Dim Feuil_Exist As Boolean
    
       With ThisWorkbook
          On Error Resume Next
          Feuil_Exist = (.Worksheets(NF).Name = NF)
          On Error GoTo 0
          If Feuil_Exist = False Then
             .Worksheets.Add After:=.Worksheets(.Worksheets.Count)
             ActiveSheet.Name = NF
          End If
          Set Add_Feuil = .Worksheets(NF)
       End With
    End Function
    

    1. Bonjour, lorsque je le lance, voici l'erreur qu'il me met :" le nom de feuille est non valide" pour la ligne : ActiveSheet.Name = NF.
      J'ai essayé de le modifier mais cela ne change rien
      1. Modérateur
        Cela peut être du à d'autres caractères indésirables...
        Essaye ce code et dit moi ce qui s'affiche avant le plantage :
        Option Explicit
        '*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* A ADAPTER
        Const ENTETE_A$ = "Machine"            'entête colonne A
        Const ENTETE_B$ = "Temps de Fab"       'entête colonne B
        '*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* 
        
        Sub Creation_Feuilles_Machine()
        Dim wshSheet As Worksheet
        Dim Plage As Range, DL&, L&, Cpt&
        Dim Tb_In, Dico As Object
        Dim t As Double
           
           t = Timer
           Set Dico = CreateObject("Scripting.Dictionary")
           With Worksheets("procede_etape")
              DL = .Columns(1).Find("*", , , , xlByColumns, xlPrevious).Row
              Set Plage = .Range("A2:B" & DL)
           End With
           Tb_In = Plage
           Application.ScreenUpdating = False
           For L = LBound(Tb_In, 1) To UBound(Tb_In, 1)
              If Not Dico.Exists(Tb_In(L, 1)) Then
                 Dico(Tb_In(L, 1)) = ""
                 Set wshSheet = Add_Feuil(Replace(Tb_In(L, 1), "*", ""))
                 With wshSheet
                    .Range("A1") = ENTETE_A
                    .Range("B1") = ENTETE_B
                 End With
                 Cpt = 1
              End If
              Cpt = Cpt + 1
              With wshSheet
                 .Range("A" & Cpt) = Tb_In(L, 1)
                 .Range("B" & Cpt) = Tb_In(L, 2)
              End With
           Next L
           MsgBox Timer - t & " secondes"
        End Sub
        
        Function Add_Feuil(NF$) As Worksheet
        Dim Feuil_Exist As Boolean
        
           With ThisWorkbook
              On Error Resume Next
              Feuil_Exist = (.Worksheets(NF).Name = NF)
              On Error GoTo 0
              If Feuil_Exist = False Then
                 .Worksheets.Add After:=.Worksheets(.Worksheets.Count)
                MsgBox NF
                 ActiveSheet.Name = NF
              End If
              Set Add_Feuil = .Worksheets(NF)
           End With
        End Function
      2. Il m'ouvre une fenêtre microsoft excel avec juste écrit : *D.LAB.000NN.MACHINELABO_OUI_ZONETAKD.3C"
        ceci est le nom de ma machine dans la base de donnée. Peut-être que le nom est trop long ? Car pour tester j'ai modifié à la main le nom d'une machine et ça a marché
      3. Modérateur
        @samNon, c'est le caractère spécial " qui pose souci...
        Essaye ceci :
        Option Explicit
        '*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* A ADAPTER
        Const ENTETE_A$ = "Machine"            'entête colonne A
        Const ENTETE_B$ = "Temps de Fab"       'entête colonne B
        '*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* 
        
        Sub Creation_Feuilles_Machine()
        Dim wshSheet As Worksheet, strNF$
        Dim Plage As Range, DL&, L&, Cpt&
        Dim Tb_In, Dico As Object
        Dim t As Double
           
           t = Timer
           Set Dico = CreateObject("Scripting.Dictionary")
           With Worksheets("procede_etape")
              DL = .Columns(1).Find("*", , , , xlByColumns, xlPrevious).Row
              Set Plage = .Range("A2:B" & DL)
           End With
           Tb_In = Plage
           Application.ScreenUpdating = False
           For L = LBound(Tb_In, 1) To UBound(Tb_In, 1)
              If Not Dico.Exists(Tb_In(L, 1)) Then
                 Dico(Tb_In(L, 1)) = ""
                 strNF = Replace(Replace(Tb_In(L, 1), "*", ""), """", "")
                 Set wshSheet = Add_Feuil(strNF)
                 With wshSheet
                    .Range("A1") = ENTETE_A
                    .Range("B1") = ENTETE_B
                 End With
                 Cpt = 1
              End If
              Cpt = Cpt + 1
              With wshSheet
                 .Range("A" & Cpt) = Tb_In(L, 1)
                 .Range("B" & Cpt) = Tb_In(L, 2)
              End With
           Next L
           MsgBox Timer - t & " secondes"
        End Sub
        
        Function Add_Feuil(NF$) As Worksheet
        Dim Feuil_Exist As Boolean
        
           With ThisWorkbook
              On Error Resume Next
              Feuil_Exist = (.Worksheets(NF).Name = NF)
              On Error GoTo 0
              If Feuil_Exist = False Then
                 .Worksheets.Add After:=.Worksheets(.Worksheets.Count)
                MsgBox NF
                 ActiveSheet.Name = NF
              End If
              Set Add_Feuil = .Worksheets(NF)
           End With
        End Function
      4. Oups le caractère " s'est glissé par mégarde. Il n'y en a pas dans le nom de la machine. J'ai cependant relancé le code et il y a le même message
      5. Modérateur
        @samQuel est le nom EXACT de la machine : *D.LAB.000NN.MACHINELABO_OUI_ZONETAKD.3C