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
Bonjour,

J'ai une macro pour la mise en forme de données et où se retrouve en colonne B: l'année , en colonne C: le jours et le mois et différentes lectures dans les autres colonnes.

Dans la colonne B, je peux avoir plusieurs années. Ce que je veux, c'est de créer une nouvelle feuille pour chacune des années présentent dans mon fichier.

Pour l'ajout de feuille ça va, mais je ne réussi pas à trouver le bon code qui me renvoi la première ligne de chacune des dates différentes de la cellule "B2", qui correspond à la première date présente de ma colonne. Je veux me servir de ces lignes pour spécifier les range afin de pouvoir copier les valeurs sur différente feuilles (une feuille par année). La valeur "Dif" dans mon code représente la ligne de la première année différente de "B2".


J'ai essayé avec des fonctions For, Do, Do Until, If sans succès avec la ligne
cell <> Range("B2").Value


Voici mon code:
'tester la colonne B, si on change d'année
'___________________________________________

DerLig = Sheets(1).Range("A" & Rows.Count).End(xlUp).Row
DerCol = Sheets(1).Cells(2, Cells.Columns.Count).End(xlToLeft).Column

With Sheets(1).Range(Cells(2, 2), Cells(DerLig, 2))    
   Do Until cell <> Range("B2").Value   
    
    
  
    Loop   
End With

Sheets(1).Range(Cells(1, 1), Cells(Dif, DerCol)).Copy
Sheets.Add.Move after:=Sheets(Sheets.Count)
ActiveSheet.Name = Sheets(1).Range("B2").Value
Sheets(Sheets.Count).Select
ActiveSheet.Range("A1").Paste 'Paste:=xlPasteAll

With Range(Cells(1, 1), Cells(Dif, DerCol))    
    Columns("F:I").Delete shift:=xlToLeft
End With


Merci beaucoup pour votre aide!

A voir également:

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
Bonjour Bassmart, bonjour le forum,

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

0
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 à 17:09
Merci pour la réponse rapide ThauTheme!

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!
0
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
15 août 2016 à 17:16
Mon problème avec les graphiques est résolu, j'avais une variable qui était vide. Après correction tout est redevenue normale.

Il me reste juste à créer une nouvelle série avec chacune des feuilles créés.
0
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
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]...
0
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
Re,

effectivement je n'ai pas utilisé le bon terme!

Est-ce possible de garder la mise en forme de la feuille source?

Merci!
0
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
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...
0
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
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!
0
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
Re,

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

0
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
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!
0
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
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!
0
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
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!
0