Comment trouver la première valeur différente d'une colonne?
Résolu/Fermé
bassmart
Messages postés
281
Date d'inscription
jeudi 19 février 2015
Statut
Membre
Dernière intervention
19 décembre 2023
-
Modifié par bassmart le 15/08/2016 à 14:57
bassmart Messages postés 281 Date d'inscription jeudi 19 février 2015 Statut Membre Dernière intervention 19 décembre 2023 - 16 août 2016 à 16:20
bassmart Messages postés 281 Date d'inscription jeudi 19 février 2015 Statut Membre Dernière intervention 19 décembre 2023 - 16 août 2016 à 16:20
A voir également:
- Comment trouver la première valeur différente d'une colonne?
- Déplacer une colonne excel - Guide
- Trouver adresse mac - Guide
- Formule somme excel colonne - Guide
- Trier colonne excel - Guide
- Colonne word - Guide
4 réponses
ThauTheme
Messages postés
1442
Date d'inscription
mardi 21 octobre 2014
Statut
Membre
Dernière intervention
29 juillet 2022
160
15 août 2016 à 15:40
15 août 2016 à 15:40
Bonjour Bassmart, bonjour le forum,
Essaie comme ça (si j'ai bien compris) :
Essaie comme ça (si j'ai bien compris) :
Sub Macro1() Dim O As Worksheet 'déclare la variable O (Onglet) Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs) Dim NL As Integer 'déclare la variable NL (Nombre de Lignes) Dim NC As Byte 'déclare la variable NC (Nombre de Colonnes) Dim I As Integer 'déclare la variable I (Incrément) Dim D As Object 'déclare la variable D (Dictionnaire) Dim TMP As Variant 'déclare la variable TMP (TeMPoraire) Dim A As Integer 'déclare la variable A (Année) Dim OA As Worksheet 'déclare la variable OA (Onglet Année) Dim J As Byte 'déclare la variable J (incrément) Dim TL() As Variant 'déclare la variable TL (Tableau des Lignes) Set O = Sheets(1) 'définit l'onglet O TV = O.Range("A2").CurrentRegion 'définit le tableau des valeurs TV NL = UBound(TV, 1) 'définit le nombre de ligne 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, 2)) = "" 'alimente le dictionnaire D avec les éléments de la colonne 2 (années) 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 A = 0 To UBound(TMP) 'boucle 1 : sur toutes les années A du tableau TMP On Error Resume Next 'gestion des erreurs (en cas d'erreur passe à la ligne suivante) Set OA = Worksheets(TMP(A)) 'définit l'onglet OA (génère une erreur si cet onglet n'existe pas) If Err <> 0 Then 'condition : si une erreur a été générée Err.Clear 'supprime l'erreur Sheets.Add after:=Sheets(Sheets.Count) 'ajoute un onglet vierge en dernière position ActiveSheet.Name = TMP(A) 'renomme l'onglet Set OA = ActiveSheet 'définit l'onglet OA End If 'fin de la condition On Error GoTo 0 'annule la gestion des erreurs K = 1 'initialise la variable K For I = 2 To NL 'boucle 2 : sur toutes les lignes I du tableau des valeur TV (en partant de la seconde) If TV(I, 2) = TMP(A) Then 'condition : si la donnée ligne I colonne 2 de TV est égale à l'année TMP(A) 'redimensionne le tableau des lignes TL (autant de lignes que TV a de colonnes, K colonnes) ReDim Preserve TL(1 To NC, 1 To K) For J = 1 To NC 'boucle 3 : sur toutes les colonnes J de TV TL(J, K) = TV(I, J) 'récupère dans la ligne J de TL la valeur de la 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 : si K est supérieure à un (ou moins une occurrence trouvée) 'renvoie la première ligne de TV dans A1 redimensionnée OA.Range("A1").Resize(1, NC) = Application.Index(TV, 1) 'renvoi dans A2 redimensionnée le tableau TL transposé OA.Range("A2").Resize(UBound(TL, 2), UBound(TL, 1)).Value = Application.Transpose(TL) Erase TL 'efface le tableau TL End If 'fin de la condition Next A 'prochaine année de la boucle 1 End Sub
ThauTheme
Messages postés
1442
Date d'inscription
mardi 21 octobre 2014
Statut
Membre
Dernière intervention
29 juillet 2022
160
15 août 2016 à 18:08
15 août 2016 à 18:08
Re,
La variable K n'était pas déclarée, c'est vrai (pardon, un oubli !), mais elle était définie...
Si tout est Ok tu devrais marqué le sujet comme [résolu]...
La variable K n'était pas déclarée, c'est vrai (pardon, un oubli !), mais elle était définie...
Si tout est Ok tu devrais marqué le sujet comme [résolu]...
bassmart
Messages postés
281
Date d'inscription
jeudi 19 février 2015
Statut
Membre
Dernière intervention
19 décembre 2023
1
15 août 2016 à 18:44
15 août 2016 à 18:44
Re,
effectivement je n'ai pas utilisé le bon terme!
Est-ce possible de garder la mise en forme de la feuille source?
Merci!
effectivement je n'ai pas utilisé le bon terme!
Est-ce possible de garder la mise en forme de la feuille source?
Merci!
ThauTheme
Messages postés
1442
Date d'inscription
mardi 21 octobre 2014
Statut
Membre
Dernière intervention
29 juillet 2022
160
15 août 2016 à 19:54
15 août 2016 à 19:54
Re,
Oui mais pas avec le système que je t'ai proposé qui est le plus rapide. Il faut utiliser les filtres automatiques mais j''ai besoin pour cela de savoir comment se présente ton tableau. D'après ton code il commencerait à la ligne 2 ? La ligne 1 est-elle réservé aux étiquettes ?
Un fichier exemple serait le bienvenu...
Oui mais pas avec le système que je t'ai proposé qui est le plus rapide. Il faut utiliser les filtres automatiques mais j''ai besoin pour cela de savoir comment se présente ton tableau. D'après ton code il commencerait à la ligne 2 ? La ligne 1 est-elle réservé aux étiquettes ?
Un fichier exemple serait le bienvenu...
bassmart
Messages postés
281
Date d'inscription
jeudi 19 février 2015
Statut
Membre
Dernière intervention
19 décembre 2023
1
15 août 2016 à 20:15
15 août 2016 à 20:15
Bonjour ThauTheme,
Voici le résultats final que ça me donne maintenant:
http://www.cjoint.com/c/FHpsjYFewy7
Je t'envoi aussi le fichier avec toute les macros dedans:
http://www.cjoint.com/c/FHpsnmh5oE7
et un fichier à tester:
http://www.cjoint.com/c/FHpsoPFYUM7
Merci beaucoup!
Voici le résultats final que ça me donne maintenant:
http://www.cjoint.com/c/FHpsjYFewy7
Je t'envoi aussi le fichier avec toute les macros dedans:
http://www.cjoint.com/c/FHpsnmh5oE7
et un fichier à tester:
http://www.cjoint.com/c/FHpsoPFYUM7
Merci beaucoup!
ThauTheme
Messages postés
1442
Date d'inscription
mardi 21 octobre 2014
Statut
Membre
Dernière intervention
29 juillet 2022
160
15 août 2016 à 20:49
15 août 2016 à 20:49
Re,
Pas bien compris l'intérêt de tous ces fichiers ?!...
Le code modifié qui garde la mise en forme :
Pas bien compris l'intérêt de tous ces fichiers ?!...
Le code modifié qui garde la mise en forme :
Sub Macro1() Dim O As Worksheet 'déclare la variable O (Onglet) Dim PL As Range 'déclare la variable PL (PLage) Dim D As Object 'déclare la variable D (Dictionnaire) Dim I As Integer 'déclare la variable I (Incrément) Dim TMP As Variant 'déclare la variable TMP (TeMPoraire) Dim A As Integer 'déclare la variable A (Année) Dim OA As Worksheet 'déclare la variable OA (Onglet Année) Dim PLV As Range 'déclare la variable PLV (PLage Visible) Set O = Sheets(1) 'définit l'onglet O Set PL = O.Range("A1").CurrentRegion 'définit la plage PL Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D For I = 2 To PL.Rows.Count 'boucle sur toutes les lignes I de la plage PL (en partant de la seconde) D(O.Cells(I, 2).Value) = "" 'alimente le dictionnaire D avec les éléments de la colonne 2 (années) de la plage PL 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 A = 0 To UBound(TMP) 'boucle 1 : sur toutes les années A du tableau TMP On Error Resume Next 'gestion des erreurs (en cas d'erreur passe à la ligne suivante) Set OA = Worksheets(TMP(A)) 'définit l'onglet OA (génère une erreur si cet onglet n'existe pas) If Err <> 0 Then 'condition : si une erreur a été générée Err.Clear 'supprime l'erreur Sheets.Add after:=Sheets(Sheets.Count) 'ajoute un onglet vierge en dernière position ActiveSheet.Name = TMP(A) 'renomme l'onglet Set OA = ActiveSheet 'définit l'onglet OA End If 'fin de la condition PL.AutoFilter Field:=2, Criteria1:=TMP(A) Set PLV = PL.SpecialCells(xlCellTypeVisible) 'définit la plage PLV (cellules visibles de la plage PL) PLV.Copy OA.Range("A1") 'copy la plage PLV dans la cellule A1 de l'onglet OA PL.AutoFilter 'supprime le filtre automatique On Error GoTo 0 'annule la gestion des erreurs Next A 'prochaine année de la boucle 1 End Sub
bassmart
Messages postés
281
Date d'inscription
jeudi 19 février 2015
Statut
Membre
Dernière intervention
19 décembre 2023
1
16 août 2016 à 14:18
16 août 2016 à 14:18
Merci pour la réponse,
C'est exactement ça!
Ce fichier me permet d'ouvrir des fichiers .CSV et .DAT qui contiennent des lectures d'instruments qui mesure des niveau d'eau 2 fois par jours (donc 2x365=730 lectures/année) pour différents sites. Donc, j'applique une mise en forme pour que ce soit plus facile à lire, je fais sortir des graphiques pour chacun de instruments installés afin de voir la variation dans le temps des niveaux d'eau. Pour pouvoir faire mes graphiques et afficher une série pour chacune des années, la seule manière que j'ai trouvé c'est de créer une feuille par année, de trouver la première date de lecture et de venir copier les données vis-à-vis cette date pour l'affichage dans le graphique.
Merci!
C'est exactement ça!
Ce fichier me permet d'ouvrir des fichiers .CSV et .DAT qui contiennent des lectures d'instruments qui mesure des niveau d'eau 2 fois par jours (donc 2x365=730 lectures/année) pour différents sites. Donc, j'applique une mise en forme pour que ce soit plus facile à lire, je fais sortir des graphiques pour chacun de instruments installés afin de voir la variation dans le temps des niveaux d'eau. Pour pouvoir faire mes graphiques et afficher une série pour chacune des années, la seule manière que j'ai trouvé c'est de créer une feuille par année, de trouver la première date de lecture et de venir copier les données vis-à-vis cette date pour l'affichage dans le graphique.
Merci!
bassmart
Messages postés
281
Date d'inscription
jeudi 19 février 2015
Statut
Membre
Dernière intervention
19 décembre 2023
1
16 août 2016 à 15:43
16 août 2016 à 15:43
Bonjour ThauTheme,
Je viens de m'apercevoir qu'il manque les 2 premières colonnes de mes lecture (J &K) du tableau source. Elle non pas été copié dans les nouvelles feuilles crées.
Merci!
Je viens de m'apercevoir qu'il manque les 2 premières colonnes de mes lecture (J &K) du tableau source. Elle non pas été copié dans les nouvelles feuilles crées.
Merci!
bassmart
Messages postés
281
Date d'inscription
jeudi 19 février 2015
Statut
Membre
Dernière intervention
19 décembre 2023
1
>
bassmart
Messages postés
281
Date d'inscription
jeudi 19 février 2015
Statut
Membre
Dernière intervention
19 décembre 2023
16 août 2016 à 16:20
16 août 2016 à 16:20
Re,
J'ai trouvé le problème! Ce n'est pas cette macro qui ne fonctionnais pas mais bien une ligne de code qui supprimais les colonnes superflus (F à I), qui ne supprime plus les bonnes colonnes. En la modifiant tout est ok!
Merci!
J'ai trouvé le problème! Ce n'est pas cette macro qui ne fonctionnais pas mais bien une ligne de code qui supprimais les colonnes superflus (F à I), qui ne supprime plus les bonnes colonnes. En la modifiant tout est ok!
Merci!
15 août 2016 à 17:09
C'est exactement ça! J'ai du définir la variable K qui ne l'était pas mais à part ça, fonctionne très bien.
J'ai une macro par la suite pour dessiner des graphiques qui ne fonctionne plus par contre, je regarde ça!
Est-ce possible de garder la mise en forme d'origine?
Merci!
15 août 2016 à 17:16
Il me reste juste à créer une nouvelle série avec chacune des feuilles créés.