Création d'une nouvelle feuille a chaque changement de valeur dans une colonne

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Poulepiquante

XLDnaute Nouveau
Bonjour le Forum,

Je cherche depuis longtemps, mais sans trouver la solution, à créer un nouveau fichier à chaque fois que la valeur d'une colonne (triée au préalable) change.

Je voudrais que ces nouveaux fichiers soient renommés comme la "valeur clé", et qu'ils contiennent un copier/coller des lignes correspondantes selon la meme mise en page que le ficher original. Ce serait parfait s'ils pouvaient être enregistrés au même endroit que le fichier source.

J'espère être à peu près claire, je vous remercie BEAUCOUP de votre aide, et serai de retour Lundi!

P.
 

Pièces jointes

Re : Création d'une nouvelle feuille a chaque changement de valeur dans une colonne

Bonjour Poulepiquante,

Impossible de récupérer les macros existantes, ton fichier étant enregistré en xlsx

De plus, quelques éclaircissements seraient souhaitables :

- Pour quelles colonnes veux-tu créer un nouveau fichier : une seule ou la totalité ?

- Que faire si un fichier du même nom existe : faut-il l'écraser ?

Dans cette attente.

Bon WE.

Cordialement.
 
Re : Création d'une nouvelle feuille a chaque changement de valeur dans une colonne

Bonjour Papou-net 🙂

Merci pour l'interet que tu portes à ma question.

Ce fichier est un test, il y avait effectivement une petite macro pour insérér des lignes, mais elle n'a pas d'importance dans le projet dont nous parlons.

Je voudrais qu'a chaque changement de "country", colonne A, un nouveau fichier excel s'ouvre et que toutes les lignes correspondant à cette valeur soient copiées dans le nouveau fichier, qui s'appellerait "Bulgarie" par exemple.

Si un fichier du meme nom existe, il faudrait une message box pour demander la confirmation de l'écrasement.

Voila ça serait formidable !

Merci!
 
Re : Création d'une nouvelle feuille a chaque changement de valeur dans une colonne

Bonsoir Poulepiquante,

Voilà qui devrait être formidable !

Le fichier ci-joint devrait fonctionner comme tu le souhaites, mis à part un détail qu'il me reste à régler, mais je verrais ça plus tard car mon dodo m'attend.

Mais avant cela, quelques explications :

Lorsqu'un seul pays apparaît, une copie est créée sans les filtres et la sauvegarde est lancée dans le même répertoire que le fichier source. Si tu listes tous les pays, rien ne se passe. Si le fichier existe, une boîte de confirmation s'affiche et si tu cliques sur Oui la version précédente est écrasée. Mais si tu cliques sur Non ou Annuler, une erreur se produit. Il faut que je revoie cette gestion d'erreur mais là mes paupières se font lourdes et mes doigts malhabiles alors je te dis bientôt.

Bonne nuit.

Bises.

Ah, j'allais oublier : j'ai dû créer une feuille pour gérer la macro lancée par le filtrage, mais je l'ai masquée. Il ne faut surtout pas la supprimer ou la modifier.

Edit : fichier modifié, voir message suivant.
 

Pièces jointes

Dernière édition:
Re : Création d'une nouvelle feuille a chaque changement de valeur dans une colonne

Bonsoir Poulepiquante
(que voilà un pseudo amusant : est-ce le résultat d'un croisement imaginaire entre une gallinacée et un hérisson ?)

Après cette brève divagation humoristique, je te transmets ton fichier modifié.

En principe, il n'y a plus de message d'erreur car j'ai modifié la boîte de dialogue de confirmation d'enregistrement. Mais attention, si tu cliques sur Oui, le fichier précédent disparaît sans possibilité de le récupérer. Les nouveaux fichiers créés sont au format .xlsx, ils ne contiennent donc aucune macro. Pour les conserver, il convient de remplacer les .xlsx par .xlsm dans la macro Export.

Sur la nouvelle feuille créée, j'ai prévu de supprimer le bouton New Contact ainsi que les 3 lignes de légende afférentes. S'il ne faut pas les effacer, tu peux supprimer les lignes de code entre les tirets.

Par ailleurs, ne connaissant pas ton niveau de compétence en matière de VBA, j'ai commenté abondamment le code.

Espérant que cette version te sera utile.

Bonne soirée.

Bises.
 

Pièces jointes

Re : Création d'une nouvelle feuille a chaque changement de valeur dans une colonne

Merci Papou!

C'est prometteur mais chez moi ca ne marche pas tout à fait. Malgré mon intérêt pour les macros, je n'arrive pas a trouver pourquoi!

Alors je crois que la boucle ne finit pas, en gros cela tourne indefiniment sur le 'Austria' dans notre cas, et cela ne passe jamais a 'Bulgaria'.

Si on passe à ' Affecte la plage de cellules à la variable PlgCountry, cela copie toutes les cellules et pas seulement celles qui correspondent à Austria.

en tous cas merci pour ton aide! 🙂

P.
 
Re : Création d'une nouvelle feuille a chaque changement de valeur dans une colonne

Bonjour poulepiquante,

Qu'est-ce qui ne marche pas comme tu le voudrais ?

Chez moi, je n'ai pas de problème de boucle, l'affichage et la sauvegarde se font sans anicroche.

Ce que je peux te conseiller :

Tu ouvres l'éditeur VBA, tu places le curseur dans la macro "Sub Export", puis tu appuies sur F8 pour dérouler le code au pas-à-pas. La ligne en cours d'exécution se colore en jaune. Tu verras ainsi où ça coince, et tu me transmets tes observations avec, éventuellement, une copie d'écran du message d'erreur s'il y a lieu.

A bientôt.

Cordialement.
.
 
Re : Création d'une nouvelle feuille a chaque changement de valeur dans une colonne

Bonjour Poulepiquante, Papou-net, bonjour le forum,

Comme j'avais travaillé sur ton fichier je me permets d'envoyer une autre proposition :
Code:
Sub Macro1()
Dim cs As Workbook 'déclare la variable cs (Classeur Source)
Dim c As String 'déclare la variable c (Chemin d'accès)
Dim os As Object 'déclare la variable os (Onglet Source)
Dim dl As Integer 'déclare la variable dl (Dernière Ligne)
Dim pl As Range 'déclare la variable pl (PLage)
Dim dico As Object 'déclare la variable dico (DICtiOnnaire)
Dim cel As Range 'déclare la variable cel (CELlule)
Dim temp As Variant 'déclare la variable temps (tableau TEMPoraire)
Dim x As Integer 'déclare la variable x (incrément)
Dim cd As Workbook 'déclare la variable cd (Classeur Destination)
Dim od As Object 'déclare la variable od (Onglet Destination)
Dim dest As Range 'déclare la variable dest (cellule de DESTination)

Set cs = ThisWorkbook 'définit le classeur source
c = cs.Path & "\" 'définit la chemin d'accès
Set os = cs.Sheets("Pilots contacts") 'définit l'onglet source
dl = os.Cells(Application.Rows.Count, 1).End(xlUp).Row 'définit la dernière ligne éditée de la colonne A de l'onglet source
Set pl = os.Range("A9:A" & dl) 'définit la plage pl
Set dico = CreateObject("Scripting.Dictionary") 'définit le dictionnaire dico
For Each cel In pl 'boucle sur toutes les celllules cel de la plage pl
    dico(cel.Value) = "" 'alimente le dictionnaire
Next cel 'prochaine cellule de la boucle
temp = dico.keys 'récupère le dictionnaire sans doublons
For x = 0 To UBound(temp) 'boucle sur tous les noms uniques temp(x) de la plage pl
    On Error Resume Next 'gestion des erreurs (en cas d'erreur passe à la ligne suivante)
    Workbooks.Open (c & temp(x) & ".xls") 'ouvre le classeur du nom (génère une erreur si le classeur n'existe pas)
    If Err <> 0 Then 'condition : si une erreur a été générée
        Err = 0 'annule l'erreur
        Workbooks.Add 'ajoute un nouveau classeur
    End If 'fin de la condition
    On Error GoTo 0 'annule la gestion des erreur
    Set cd = ActiveWorkbook 'définit le classeur destination
    Set od = cd.Sheets("Feuil1") 'définit l'onglet de destination
    os.Range("A8").AutoFilter field:=1, Criteria1:=temp(x) 'filtre la plage pl par rapport au nom unique temp(x)
    Set dest = IIf(od.Range("A1").Value = "", od.Range("A1"), od.Cells(Application.Rows.Count, 1).End(xlUp).Offset(1, 0)) 'définit la cellule de destination dest
    pl.SpecialCells(xlCellTypeVisible).Resize(pl.SpecialCells(xlCellTypeVisible).Rows.Count, 4).Copy dest 'copie la plage pl, redimentionnée à la colonne D, et la colle dans dest
    Application.DisplayAlerts = False 'empêche les message Excel
    cd.SaveAs (c & temp(x) & ".xls") 'enregsitre le fichier sous...
    cd.Close 'ferme le classerur destination
    Application.DisplayAlerts = True 'affiche les messages Excel
Next x 'prochain nom unique de la boucle
os.Range("A8").AutoFilter 'affiche toutes les ligne de la plage pl
End Sub
Je l'ai testée avant et elle avait l'air de bien fonctionner. Les fichiers sont ouverts, renseignés, enregistrés (dans le même dossier que ton fichier original), puis fermés...

Pense juste à modifier cette ligne de code :
Code:
cd.SaveAs (c & temp(x) & ".xls") 'enregsitre le fichier sous...
en adaptant l'extension du fichier (.xlsm ou .xlmx je sais pas) à ta version...
 
Re : Création d'une nouvelle feuille a chaque changement de valeur dans une colonne

Bonjour Robert & Papou,

pour répondre à ta question, Papou, il n'y a pas de message d'erreur, ca tourne sans cesse au niveau suivant:
For Each cel In Range("A9:A" & Range("A9").End(xlDown).Row).SpecialCells(xlCellTypeVisible)
i = IIf(i <= 1, i + 1, i)
If i > 1 And cel.Value <> cel.Offset(-1, 0).Value And cel.Value <> "" Then Exit Sub
Next

Robert, j'ai un message d'erreur "subscript out of range (error 9)" au niveau de
Set od = cd.Sheets("Feuil1") 'définit l'onglet de destination


Que faire? 🙂

Un grand merci pour votre aide !

P.
 
Re : Création d'une nouvelle feuille a chaque changement de valeur dans une colonne

OK, je vois d'où ça vient : probablement une mauvaise compréhension du problème.

Comme je te le disais au début, s'il y a plusieurs pays filtrés la macro ne fait rien. Je pensais avoir compris que chaque fichier enregistré ne devait contenir qu'un seul pays étant donné le nom du fichier. Peux-tu confirmer ou préciser davantage ce point ? Est-il possible d'enregistrer un fichier s'il comporte des pays différents ?

Dans cette attente.

Cordialement.

PS : En tout cas, ça marche parfaitement de cette façon chez moi.
 
Re : Création d'une nouvelle feuille a chaque changement de valeur dans une colonne

Bonsoir le fil, bonsoir le forum,

Poulepiquante, chez moi ça tourne sans erreur mais il est vrai que le nom du premier onglet d'un nouveau fichier est par défaut Feuil1. Si ce n'est pas le cas chez toi il te faudrait adapter cette ligne :
Code:
Set od = cd.Sheets("Feuil1") 'définit l'onglet de destination
par :
Code:
Set od = cd.Sheets(1) 'définit l'onglet de destination
du coup l'onglet de destination sera le premier onglet quel que soit son nom...
 
Re : Création d'une nouvelle feuille a chaque changement de valeur dans une colonne

Bonjour Papou-net!
Ah voila, en effet si je ne garde que les lignes correspondant à Austria, cela me copie les données dans un autre fichier et le renomme correctement.
Donc cela fonctionne, mais j'aurai besoin de faire cela pour Austria, Bulgaria, Czech Rep etc etc... en tout j'ai une quinzaine de pays!
Pardon si je n'ai pas été claire, avec un seul pays ca marche bien...
Merci !!!
 
Re : Création d'une nouvelle feuille a chaque changement de valeur dans une colonne

Bonjour Robert,
Ca marche bien, et c'est super...
Y aurait il un moyen de copier les 8 lignes d'en-tête dans chacun de ces fichiers, avec le bouton "New contact" et la macro attachée a ce bouton?

Par ailleurs, mon "vrai" fichier de base contient 32 colonnes, et c'est susceptible de changer: y a t il un moyen de copier et coller toutes les colonnes dans l'onglet de destination, et pas seulement les 4 premières?

En tous cas encore un immense MERCI a Papou-net et toi pour votre aide!!!
 
Dernière édition:
Re : Création d'une nouvelle feuille a chaque changement de valeur dans une colonne

Bonsoir le fil, bonsaoir le forum,

Voici le code adapté :
Code:
Sub Macro1()
Dim cs As Workbook 'déclare la variable cs (Classeur Source)
Dim c As String 'déclare la variable c (Chemin d'accès)
Dim os As Object 'déclare la variable os (Onglet Source)
Dim dl As Integer 'déclare la variable dl (Dernière Ligne)
Dim pl As Range 'déclare la variable pl (PLage)
Dim dico As Object 'déclare la variable dico (DICtiOnnaire)
Dim cel As Range 'déclare la variable cel (CELlule)
Dim temp As Variant 'déclare la variable temps (tableau TEMPoraire)
Dim x As Integer 'déclare la variable x (incrément)
Dim cd As Workbook 'déclare la variable cd (Classeur Destination)
Dim od As Object 'déclare la variable od (Onglet Destination)
Dim dest As Range 'déclare la variable dest (cellule de DESTination)
Dim col As Integer 'décalre la variable col (COLonne)

Set cs = ThisWorkbook 'définit le classeur source
c = cs.Path & "\" 'définit la chemin d'accès
Set os = cs.Sheets("Pilots contacts") 'définit l'onglet source
dl = os.Cells(Application.Rows.Count, 1).End(xlUp).Row 'définit la dernière ligne éditée de la colonne A de l'onglet source
col = os.Cells(8, Application.Columns.Count).End(xlToLeft).Column 'définit la colonne col
Set pl = os.Range("A9:A" & dl) 'définit la plage pl
Set dico = CreateObject("Scripting.Dictionary") 'définit le dictionnaire dico
For Each cel In pl 'boucle sur toutes les celllules cel de la plage pl
    dico(cel.Value) = "" 'alimente le dictionnaire
Next cel 'prochaine cellule de la boucle
temp = dico.keys 'récupère le dictionnaire sans doublons
For x = 0 To UBound(temp) 'boucle sur tous les noms uniques temp(x) de la plage pl
    On Error Resume Next 'gestion des erreurs (en cas d'erreur passe à la ligne suivante)
    Workbooks.Open (c & temp(x) & ".xls") 'ouvre le classeur du nom (génère une erreur si le classeur n'existe pas)
    If Err <> 0 Then 'condition : si une erreur a été générée
        Err = 0 'annule l'erreur
        Workbooks.Add 'ajoute un nouveau classeur
    End If 'fin de la condition
    On Error GoTo 0 'annule la gestion des erreur
    Set cd = ActiveWorkbook 'définit le classeur destination
    Set od = cd.Sheets(1) 'définit l'onglet de destination
    os.Range("A1:D8").Copy 'copie la plage A1:A8 de l'onglet source
    od.Range("A1").PasteSpecial (xlPasteColumnWidths) 'collage spécial "largeur des colonnes" dans A1 de l'onglet destination
    os.Range("A1:D8").Copy od.Range("A1") 'colle la plage dans A1
    od.Range("A1").Select 'sélectionne A1
    os.Range("A8").AutoFilter field:=1, Criteria1:=temp(x) 'filtre la plage pl par rapport au nom unique temp(x)
    Set dest = IIf(od.Range("A9").Value = "", od.Range("A9"), od.Cells(Application.Rows.Count, 1).End(xlUp).Offset(1, 0)) 'définit la cellule de destination dest
    pl.SpecialCells(xlCellTypeVisible).Resize(pl.SpecialCells(xlCellTypeVisible).Rows.Count, col).Copy dest 'copie la plage pl, redimentionnée à la colonne D, et la colle dans dest
    Application.DisplayAlerts = False 'empêche les message Excel
    cd.SaveAs (c & temp(x) & ".xls") 'enregsitre le fichier sous...
    cd.Close 'ferme le classerur destination
    Application.DisplayAlerts = True 'affiche les messages Excel
Next x 'prochain nom unique de la boucle
os.Range("A8").AutoFilter 'affiche toutes les ligne de la plage pl
End Sub
Toujours la même remarque pour cette ligne à adapter à ta version pour l'extension du fichier (.xlsm ou .xlmx je sais toujours pas)...
Code:
d.SaveAs (c & temp(x) & ".xls") 'enregsitre le fichier sous...
Il ne manque que la copie de la macro. J'essaie de trouver une solution...
 
Dernière édition:
Re : Création d'une nouvelle feuille a chaque changement de valeur dans une colonne

Bonjour Robert, Papou-net, le forum,

!!!! Ca fonctionne !!!! C'est tip top!!!! La macro liée au bouton new contact est même enregistrée avec chacun des fichiers pays...

Reste juste a regler le probleme d'extension, parceque je ne sais pas quelle version d'excel ont mes collaborateurs. .xlsm ne fonctionne pas dans mon fichier macro, donc j'ai utilisé .xlmx. Un conseil à ce sujet?

En tous cas un immense merci à tous les deux pour votre gentillesse et votre aide sur ce sujet... Je vous dois une fière chandelle 🙂

P.
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Retour