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

Fermé
jerem2607 Messages postés 3 Date d'inscription samedi 5 novembre 2016 Statut Membre Dernière intervention 6 novembre 2016 - 5 nov. 2016 à 18:41
jerem2607 Messages postés 3 Date d'inscription samedi 5 novembre 2016 Statut Membre Dernière intervention 6 novembre 2016 - 6 nov. 2016 à 17:27
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.
A voir également:

1 réponse

ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022 160
5 nov. 2016 à 19:20
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
jerem2607 Messages postés 3 Date d'inscription samedi 5 novembre 2016 Statut Membre Dernière intervention 6 novembre 2016
Modifié par jerem2607 le 5/11/2016 à 21:10
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
Utilisateur anonyme > jerem2607 Messages postés 3 Date d'inscription samedi 5 novembre 2016 Statut Membre Dernière intervention 6 novembre 2016
Modifié par albkan le 6/11/2016 à 08:10
 
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
jerem2607 Messages postés 3 Date d'inscription samedi 5 novembre 2016 Statut Membre Dernière intervention 6 novembre 2016
6 nov. 2016 à 17:27
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