SELECTIONS DANS UNE FEUILLE EXCEL PUIS CRÉATION DE NOUVELLES FEUILLES EXCEL AVEC

artgile Messages postés 61 Date d'inscription mercredi 20 janvier 2010 Statut Membre Dernière intervention 26 juin 2017 - 25 nov. 2010 à 12:08
DHugot Messages postés 12 Date d'inscription mercredi 4 février 2004 Statut Membre Dernière intervention 3 janvier 2011 - 29 nov. 2010 à 09:03
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/52509-selections-dans-une-feuille-excel-puis-creation-de-nouvelles-feuilles-excel-avec-les-donnees-selectionnees

DHugot Messages postés 12 Date d'inscription mercredi 4 février 2004 Statut Membre Dernière intervention 3 janvier 2011
29 nov. 2010 à 09:03
> dans excel tu ne peu créer plus de 255 feuilles
La limitation du nombre de feuille n'est pas de 255. La limitation dépend de la mémoire disponible: http://office.microsoft.com/fr-ca/excel-help/limites-et-specifications-excel-HP005199291.aspx
galaadspirit Messages postés 5 Date d'inscription mardi 7 octobre 2008 Statut Membre Dernière intervention 28 novembre 2010
28 nov. 2010 à 20:07
merci pour les précisions.
"attention aux espaces en fin de noms identique, cela est considéré comme des noms différents. Si le besoin s'en fait sentir je pourrais ajouter une petite commande." => pas de pb je ferai attention.
En tout cas joli travail
artgile Messages postés 61 Date d'inscription mercredi 20 janvier 2010 Statut Membre Dernière intervention 26 juin 2017
28 nov. 2010 à 11:33
Bonjour, tout le monde est content 8D

Complément d'informations :

- Dans la première feuille (feuille_depart), j'utilise la dernière colonne pour ranger le résultat de test des lignes traitées. Elle comporte une suite de "1", NE PAS DÉTRUIRE CETTE COLONNE au risque de te trouver avec des doublons dans le contenu des autres feuilles. Ainsi, dans le cas ou tu voudrais supprimer un nom dans ton tableau, supprime la ligne complètement.

- Ne pas créer de ligne vide dans le tableau, car je teste la fin de la liste des noms sur la première ligne vide trouvée. Ce qui par ailleurs pourrait servir pour créer deux tableaux. Un tableau dont les noms sont traités et un autre en cours de saisie.

- Rappel, attention aux espaces en fin de noms identique, cela est considéré comme des noms différents. Si le besoin s'en fait sentir je pourrais ajouter une petite commande.

- Si l'on supprime un nom ou plusieurs occurrences du même nom, dans le tableau principal, les feuilles crées sous ces noms ne sont pas effacées.

Voilà, je crois que j'ai tout dit, à peu de chose près.
Pour le plaisir je essayer de réduire le code.

Bonne journée et Cordialement, JML
galaadspirit Messages postés 5 Date d'inscription mardi 7 octobre 2008 Statut Membre Dernière intervention 28 novembre 2010
27 nov. 2010 à 21:16
Nom d'un petit bonhomme, tu as assuré, le résultat est parfait !
Très sincèrement MERCI =)
artgile Messages postés 61 Date d'inscription mercredi 20 janvier 2010 Statut Membre Dernière intervention 26 juin 2017
27 nov. 2010 à 18:49
Bonsoir Galaadspirit,

Après deux jours ou je croyais ne pas en finir, j'ai enfin ceci :
(à toi de tester et dit moi si cela est ok)

Ps: j'ai remarqué, accidentellement, que 2 feuilles peuvent porter le même nom. Il suffit pour cela
d'avoir un espace à la fin d'un des deux noms lors de la saisie -:(

Cordialement, JML
'===============================================================
Option Explicit
Dim NbF As Long 'Nombre de Feuille dans le classeur
Dim NL As Long 'Numéros de Ligne dans la feuille depart
Dim FT As Long 'Feuille Trouvée
Dim i As Long 'Indice de boucle
Dim j As Long 'Indice de boucle
Dim k As Long 'Indice de boucle
Dim NF As String 'Nom d'une feuille
Dim Nom As String 'Contenu de la cellule Nom
'=================================================================
Private Sub CmdTraitement_Click()
NL = 1 'Calcul le nombre total de ligne renseignée.
Do
Nom = Worksheets(1).Range("A" & NL + 1).Value
If Nom <> "" Then NL = NL + 1
Loop Until Nom = "" 'Arrête la boucle jusqu'à ce que la cellule soit vide
NbF = Worksheets.Count 'Retourne le nombre de feuuille du classeur
If Worksheets.Count = 1 Then Creation_première_feuille 'Si uniquement la feuille_depart au démarrage
Call Creation
Worksheets(1).Activate 'Revient à la feuille de départ
End Sub
'=================================================================
Private Sub Creation()
For i = 2 To NbF 'Indice de la feuille
NF = Worksheets(i).Name 'Nom de la feuille
For j = 2 To NL 'numéros de ligne
Nom = Worksheets(1).Range("A" & j).Value If NF Nom And Worksheets(1).Range("IV" & j).Value "" Then
Call Complete_feuille(i, j)
ElseIf NF <> Nom And Worksheets(1).Range("IV" & j).Value = "" Then
FT = 0
For k = 2 To Worksheets.Count
If Nom = Worksheets(k).Name Then
Call Complete_feuille(k, j)
FT = 1
End If
Next k
If FT = 0 Then
Worksheets(1).Range("IV" & j).Value = 1 'valeurs de contrôles
Call Nouvelle_Feuille(Nom)
Call Premiere_ligne_d_ecriture(j)
End If
End If
Next j
Next i
End Sub
'=================================================================
Private Sub Nouvelle_Feuille(Nm As String)
Sheets.Add after:=Worksheets(Worksheets.Count) 'Création de la feuille
Worksheets(Worksheets.Count).Name = Nm '(nom)Renomme la feuille
End Sub
'=================================================================
Private Sub Premiere_ligne_d_ecriture(IDL As Long)
With Worksheets(Worksheets.Count)
'création de l'entête des colonnes de la nouvelle feuille
.Range("A1").Value = Worksheets(1).Range("A1").Value
.Range("B1").Value = Worksheets(1).Range("B1").Value
.Range("C1").Value = Worksheets(1).Range("C1").Value
'Renseigne la nouvelle feuille de (Nom, Id, Type)
.Range("A2").Value = Worksheets(1).Range("A" & IDL).Value
.Range("B2").Value = Worksheets(1).Range("B" & IDL).Value
.Range("C2").Value = Worksheets(1).Range("C" & IDL).Value
End With
End Sub
'=================================================================
Sub Complete_feuille(IdF As Long, N°Ligne As Long)
'Ajout d'informations sur une feuille existante
Dim NLFA As Long 'Numéros de Ligne de la Feuille Actuelle
Dim NLA As String 'Nom de la Ligne Actuelle
NLFA = 1
Do 'Calcul le nombre de ligne existante dans la feuille déjà crée
NLA = Worksheets(IdF).Range("A" & NLFA + 1).Value
If NLA <> "" Then NLFA = NLFA + 1
Loop Until NLA = "" 'Arrête la boucle jusqu'à ce que la cellule soit vide
NLFA = NLFA + 1
With Worksheets(IdF) 'i
'Renseigne la feuille (Nom, Id, Type)
.Range("A" & NLFA).Value = Worksheets(1).Range("A" & N°Ligne).Value
.Range("B" & NLFA).Value = Worksheets(1).Range("B" & N°Ligne).Value
.Range("C" & NLFA).Value = Worksheets(1).Range("C" & N°Ligne).Value
End With
Worksheets(1).Range("IV" & N°Ligne).Value = 1 'valeurs de contrôles
End Sub
'=================================================================
Private Sub Creation_première_feuille()
Worksheets(1).Range("IV" & 1).Value = 1
Worksheets(1).Range("IV" & 2).Value = 1
'Création d'une feuille au démarrage
Sheets.Add after:=Worksheets(1) 'Création de la feuille
Worksheets(2).Name = Worksheets(1).Range("A2").Value
With Worksheets(2)
'création de l'entête des colonnes de la nouvelle feuille
.Range("A1").Value = Worksheets(1).Range("A1").Value
.Range("B1").Value = Worksheets(1).Range("B1").Value
.Range("C1").Value = Worksheets(1).Range("C1").Value
'Renseigne la feuille (Nom, Id, Type)
.Range("A2").Value = Worksheets(1).Range("A2").Value
.Range("B2").Value = Worksheets(1).Range("B2").Value
.Range("C2").Value = Worksheets(1).Range("C2").Value
End With
Worksheets(1).Activate 'Revient à la feuille de départ
NbF = Worksheets.Count 'Retourne le nombre de feuuille dans le classeur
End Sub
galaadspirit Messages postés 5 Date d'inscription mardi 7 octobre 2008 Statut Membre Dernière intervention 28 novembre 2010
25 nov. 2010 à 21:44
:D oui pas évident mon problème je le reconnais...

"En revanche, si je comprend bien, je dois vérifier pour l'ensemble des noms et Id si il existe une feuille du même nom avec des nouveaux ID le concernant"
=> pour le nom oui il faudrait faire la vérif. Pour l'"id_operation" ce n'est pas utile car il est unique. Donc si le nom est présent une deuxième fois il faut juste ajouter la ligne à la suite dans la bonne feuille sans tenir compte des lignes déjà existantes dans cette feuille.
Il faut aussi ne pas recréé une feuille "dupond" si la feuille "dupond" existe déjà.

Pour info la tableau d'exemple que j'ai mis contient bien un doublon de nom :

nom id Type_operation
dupond AF1 vente
durand UY3 location
duchemin HT7 location
dupond JU4 location
artgile Messages postés 61 Date d'inscription mercredi 20 janvier 2010 Statut Membre Dernière intervention 26 juin 2017
25 nov. 2010 à 21:11
Re :(

Je crois comprendre. Je viens de faire l'essai avec une seule feuille, c'est à dire, avec la feuille de départ et avec une autre feuille excel standard. Et la effectivement bingo! l'erreur! Mais pas de doublon? Bon c'est déjà un début....
Si tu essaies avec ton fichier d'exemple, il n'y a pas de message d'erreur. Mais ta demande n'est pas honorée.

Donc retour à la case départ, j'ai du boulot...........

cordialement, JML
artgile Messages postés 61 Date d'inscription mercredi 20 janvier 2010 Statut Membre Dernière intervention 26 juin 2017
25 nov. 2010 à 20:43
Bonsoir,

Bigre! Par la Couenne des "gens bons", je viens de faire l'essai de mon script mais je n'est aucun message d'erreur???????

En revanche, si je comprend bien, je dois vérifier pour l'ensemble des noms et Id si il existe une feuille du même nom avec des nouveaux ID le concernant, puis d'ajouter l'information sur la dite feuille ou en créer une nouvelle.
J'ai peur de faire un script qui ressemble à une usine à gaz............
Si tu n'est pas pressé....Mais dans un premier temps il faudrait résoudre l'erreur en question.
Travail t-on avec le même fichier? Je n'ai aucun doublon de nom au niveau de mes feuilles.

J'attends la suite, Cordialement, JML
galaadspirit Messages postés 5 Date d'inscription mardi 7 octobre 2008 Statut Membre Dernière intervention 28 novembre 2010
25 nov. 2010 à 19:16
j'ai testé, mais il y a un problème :

j'aurai voulu que quand il y a plusieurs fois le même nom il ajoute la ligne à la suite du tableau de la feuille qui porte ce nom
(de plus avec ton script s'il y a plusieurs occurrences du nom le script s'arrête avec l'erreur "deux feuilles ne peuvent pas avoir le même nom !")

dans mon exemple il y avait deux fois "dupond", j'aurai donc voulu avoir 3 feuilles dont une feuille qui s'appelle "dupond" présentée comme ceci :

nom id operation Type d'operation
dupond AF1 vente
dupond JU4 location

est-ce que tu peux faire quelque chose pour moi ?
galaadspirit Messages postés 5 Date d'inscription mardi 7 octobre 2008 Statut Membre Dernière intervention 28 novembre 2010
25 nov. 2010 à 12:37
Je te remercie beaucoup, je vais essayer ça cet après-midi je te tiendrai au courant.
Pour ce qui est des feuilles, il ne devrait pas y en avoir plus de 30.
artgile Messages postés 61 Date d'inscription mercredi 20 janvier 2010 Statut Membre Dernière intervention 26 juin 2017
25 nov. 2010 à 12:08
Bonjour galaadspirit,

J'ai regardé hier soir ta question et j'ai eu envie d'essayer.
Donc voici mes commentaires:
- Concernant le tri tu le réalise déjà avec l'option liste.
- Concernant la création de feuille j'ai réalisé se code, et j'attire ton
attention, dans excel tu ne peu créer plus de 255 feuilles. Alors combien de nouveau nom????

Bon bref le code quoi: (ne pas oublier de créer un bouton de commande dans ta feuille générale)
Je l'ai crée sur office 2003 et testé avec office 2010 tous est OK.

Bon courage,JML

Option Explicit

Dim NomFeuille As String 'Nom d'une feuille
Dim NbFeuille As Integer 'Nombre totale de feuille dans le classeur
Dim NbNom As Long 'Nombre de Nom
Dim i As Long 'Indice de boucle
Dim j As Long 'Indice de boucle
Dim Nom As String 'Cellule contenant un Nom
Dim ArrTabNom() As String 'Tableau dynamique des noms. Le tableau serat à 2 dimensions
Private Sub CmdNouveauNom_Click()
'Calcul le nombre total de noms dans la colonne Nom.
i = 1 'Saute la ligne 1
Do
Nom = Worksheets(1).Range("A" & i + 1).Value
If Nom <> "" Then i = i + 1
Loop Until Nom = "" 'Arrête la boucle jusqu'à ce que la cellule soit vide

ReDim ArrTabNom(2, i) 'Création du tableau dynamique
NbNom = i - 1 'Retranche l'intitulé des colonnes, soit la ligne 1
NbFeuille = ActiveWorkbook.Worksheets.Count 'Retourne le nombre de feuuille dans le classeur

'Place tous les noms dans le tableau, puis met une chaine vide en face de chaque nom.
i = 0
Do
ArrTabNom(1, i) = Worksheets("feuille_depart").Range("A" & i + 2).Value
ArrTabNom(2, i) = ""
Nom = Worksheets(1).Range("A" & i + 2).Value
If Nom <> "" Then i = i + 1
Loop Until Nom = ""

'Compare le nom des feuilles avec la liste de Noms et place la valeur 1
' dans le tableau en face de chaque nom si existant.
For i = 2 To NbFeuille
NomFeuille = ActiveWorkbook.Worksheets(i).Name
For j = 0 To NbNom If ArrTabNom(1, j) NomFeuille Then ArrTabNom(2, j) "1"
Next j
Next i

'Création des nouvelles feuilles
For i = 0 To NbNom - 1
If ArrTabNom(2, i) = "" Then 'Si chaine vide alors nouveau nom
'Création d'une feuille en derniére position
j = Worksheets.Count 'indice de la dernier feuille crée
ActiveWorkbook.Sheets.Add after:=Worksheets(j)
'Donne le nouveau nom
j = Worksheets.Count 'indice de la dernier feuille crée
ActiveWorkbook.Worksheets(j).Name = ArrTabNom(1, i)
With Worksheets(j) 'renseigne la nouvelle feuille avec les données concernant le nouveau nom
.Range("A1").Value = Worksheets(1).Range("A1").Value 'place l'intitulé de colonne nom
.Range("B1").Value = Worksheets(1).Range("B1").Value 'place l'intitulé de colonne id opération
.Range("C1").Value = Worksheets(1).Range("C1").Value 'place l'intitulé de colonne Type d'opération
.Range("A2").Value = ArrTabNom(1, i)
.Range("B2").Value = Worksheets(1).Range("B" & i + 2).Value
.Range("C2").Value = Worksheets(1).Range("C" & i + 2).Value
End With
End If
Next i
'Revient à la feuille de départ
ActiveWorkbook.Worksheets(1).Activate
End Sub