Excel 2010 création d'un onglet par valeur différente col A

jerem2607 Messages postés 3 Statut Membre -  
jerem2607 Messages postés 3 Statut Membre -
Bonjour,
Novice en programmation, j'aurais besoin de votre aide pour mon taf.
J'ai une base de donnée excel de 20 000 lignes sur 17 colonnes.
Je souhaiterais créer une macro sous excel 2010 qui rapatrie les lignes ayant une même valeur ds la colonne A et qui créer automatiquement un onglet par valeur de cette même colonne avec nom de l'onglet =valeur colonne A.

Si vous aviez un modèle que je pourrai essayer d'adapter à mon fichier, ça serait top!!
Merci de votre aide précieuse.

1 réponse

  1. ThauTheme Messages postés 1564 Statut Membre 160
     
    Bonsoir Jerem, bonsoir le forum,

    Le code ci-dessous implique que les données commencent dans la cellule A1 et que la première ligne soit la ligne comportant les étiquettes (ou titres) des colonnes. Sinon, il faudra légèrement modifier... Le code s'adapte au nombre des colonnes. À vérifier et/ou adapter le nom de l'onglet source !

    Sub Macro1()
    Dim OS As Worksheet 'déclare la variable OS (Onglet Source)
    Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
    Dim NL As Long 'déclare la variable NL (Nombre de Lignes)
    Dim NC As Integer 'déclare la variable NC (Nombre de Colonnes)
    Dim D As Object 'déclare la variable D (Dictionnaire)
    Dim I As Long 'déclare la variable I (Incrément)
    Dim J As Integer 'déclare la variable J (incrément)
    Dim K As Long 'déclare la variable K (incrément)
    Dim TMP As Variant 'déclare la variable TMP (tableau TeMPoraire)
    Dim SD As Long 'déclare la variable SD (Sans Doublon)
    Dim TL() As Variant 'déclare la variable TL (Tableau des Lignes)
    Dim OD As Worksheet 'déclare la variable OD (Onglet Destination)
    
    Set OS = Sheets("Feuil1") 'définit l'onglet source OS (à adapter)
    TV = OS.Range("A1").CurrentRegion 'définit le tableau des valeurs TV
    NL = UBound(TV, 1) 'définit le nombre de lignes NL du tableau des valeurs TV
    NC = UBound(TV, 2) 'définit le nombre de colonnes NC du tableau des valeurs TV
    Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
    For I = 2 To NL 'boucle sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde)
        D(TV(I, 1)) = "" 'alimente le dictionnaire D avec les données en colonne 1 du tableau des valeurs TV
    Next I 'prochaine ligne de la boucle
    TMP = D.Keys 'récupère dans le tableau temporaire TMP la liste des éléments du dictionnaire D sans doublon
    For SD = 0 To UBound(TMP) 'boucle 1 : sur tous les éléments SD du tableau temporaire TMP
        K = 1 'initialise la variable K
        For I = 2 To NL 'boucle 2 : sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde)
            If TV(I, 1) = TMP(SD) Then 'condition : si la donnée ligne I colonne 1 de TV correspond à l'élément SD de TMP
                ReDim Preserve TL(1 To NC, 1 To K) 'redimensionne le tableau des lignes (autant de lignes que TV a de colonnes, K colonnes)
                For J = 1 To NC 'boucle 3 : sur touts les colonnes J du tableau des valeurs TV
                    TL(J, K) = TV(I, J) 'récupère dans la ligne J de TL la donnée en colonne J de TV (=transposition)
                Next J 'prochaine colonne de la boucle 3
                K = K + 1 'incrémente K (ajoute une colonne au tableau des lignes TL)
            End If 'fin de la condition
        Next I 'prochaine ligne de la boucle 2
        If K > 1 Then 'condition 1 : si K est supérieur à 1 (au moins une occurrence trouvée)
            On Error Resume Next 'gestion des erreurs (en cas d'erreur passe à la ligne suivante)
            Set OD = Sheets(TMP(SD)) 'définit l'onglet destination OD (génère une erreur si c'est onglet n'existe pas)
            If Err <> 0 Then 'condition 2 : si une erreur a été générée
                Err.Clear 'efface l'erreur
                Sheets.Add After:=Sheets(Sheets.Count) 'ajoute un onglet en dernière position
                ActiveSheet.Name = TMP(SD) 'renomme l'onglet avec le nom de l'élément SD du tableau temporaire TMP
                Set OD = ActiveSheet 'définit l'onglet de destination OD
            End If 'fin de la condition 2
            On Error GoTo 0 'annule la gestion des erreurs
            OD.Range("A1").Resize(1, NC).Value = Application.Index(TV, 1) 'renvoie dans la ligne 1 les étiquettes du tableau des valeurs TV
            OD.Range("A2").Resize(UBound(TL, 2), UBound(TL, 1)).Value = Application.Transpose(TL) 'renvoie dans A2 redimensionnée le tableau des ligne TL transposé
            Erase TL 'efface le contenu du tableau des lignes TL
        End If 'fin de la condition 1
    Next SD 'prochain élément de la boucle 1
    End Sub
    


    0
    1. jerem2607 Messages postés 3 Statut Membre
       
      Merci Thautheme, au top!!!

      J'ai réussi à rajouter une macro dans le workbook définissant le nom de l'onglet comme étant la valeur de la cellule A2
      Sub RenommeOngletsNomCelluleA2()
      
          Dim Feuille As Worksheet
          
          For Each Feuille In Worksheets
              Feuille.Name = Feuille.Range("A2").Value
          Next Feuille
          
      End Sub

      J'aimerais pouvoir enregistrer chaque onglet dans un fichier portant le même nom dans un dossier identifié. Je sais que c'est avec [SaveAs Filename:=feuille.Name + ".xls"]
      Je ne trouve pas comment spécifier le chemin...

      A plus
      Jérém
      0
      1. Utilisateur anonyme > jerem2607 Messages postés 3 Statut Membre
         
         
        Bonjour Jérémie,

        Au lieu de l'opérateur « + », c'est mieux que tu utilises l'opérateur de
        concaténation : « & » ; ton instruction peut être simplifiée ainsi :

        SaveAs feuille.Name & ".xls"
        

        Le fichier sera sauvegardé dans le dossier actif : c'est celui où tu as
        enregistré ton fichier Excel.

        Si tu veux sauvegarder ton fichier dans le dossier parent :

        SaveAs "..\" & feuille.Name & ".xls"
        

        Si tu veux sauvegarder ton fichier dans un dossier bien précis, depuis la racine
        du disque dur, et dans un sous-dossier "Factures" du dossier "Documents" :

        Dim Chemin As String
        Chemin = "C:\Users\Jérémie\Documents\Factures\"
        SaveAs Chemin & feuille.Name & ".xls"
        

        N'oublies pas le "\" à la fin de Chemin !

        Bien sûr, tu peux aussi faire la même chose plus directement,
        sans utiliser la variable Chemin :

        SaveAs "C:\Users\Jérémie\Documents\Factures\" & feuille.Name & ".xls"
        

        Si ton problème est réglé, merci d'aller en haut de page
        pour cliquer sur « Marquer comme résolu ».

        Cordialement.  😊
         
        0
    2. jerem2607 Messages postés 3 Statut Membre
       
      Merci Tautheme, merci Albklan.
      Tautheme, j'aurais du mieux regarder ta macro, elle nommait bien l'onglet selon la valeur de la colonne A2.
      Et, malgrè mon petit niveau, j'ai pu la modifier pour enregistrer chaque onglet dans un fichier xls portant le mm nom.

      Bref, content le Jérém!!!!
      0