IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Gestion des occurrences du même valeur en VBA dans un fichier csv - Trouver et garder lama plus récente


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Expertise Comptable
    Inscrit en
    Mars 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expertise Comptable

    Informations forums :
    Inscription : Mars 2015
    Messages : 6
    Par défaut Gestion des occurrences du même valeur en VBA dans un fichier csv - Trouver et garder lama plus récente
    Bonjour,

    J’éprouve des difficultés dans la gestion des occurrences de la même «*valeur*».

    Concrétement, j’ai un fichier base.csv dont les «*colonnes*» sont séparées par des «*;*». La structure du fichier est ainsi :
    JJ-MM-AAAA_HH-MM-SS;AnnéeDeLaRealisation;ID_Produit;CA_Realise;

    Exemple d’une ligne :
    25-03-2015_19-00-01;2014;AspirateurABC;10000;

    Le problème : il pourrait y avoir plusieurs lignes se rapportant au CA de l’aspirateurABC en 2014. Le CA pourrait être pour une ligne 10000 l’autre 13000, une autre 11000… Il me faut donc garder la ligne correspondant à l’information la plus récente. En effet, pour chaque occurrence, la première «*colonne*» JJ-MM-AAAA_HH-MM-SS est forcément différente.

    Je sollicite votre aide car je ne sais pas comment coder en VBA :
    Ouvrir le fichier, prendre la première ligne, chercher s’il y a une autre occurence de celle-ci (en se basant sur l’ID_Produit ET l’AnnééDeLaRealisation), s’il n’y en a pas passer à la ligne suivante, s’il y a d’autres occurrences déterminer la plus récente en se basant sur le champ JJ-MM-AAAA_HH-MM-SS et supprimer les lignes/occurences les plus anciennes puis passer à la ligne suivante, enregistrer et fermer une fois la boucle terminée jusqu’à la fin du fichier.
    Je précise que pour déterminer l’occurrence la plus récente il faudrait comparer successivement : AAAA si pareil > MM si pareil > JJ si pareil > HH si pareil > MM (les minutes cette fois) si pareil > SS. A chaque étape, trouver une différence permet de déterminer la plus récente.
    Dernière précisions : il peut y avoir plus de deux occurrences…

    J’espére avoir été assez clair…

    En vous remerciant,
    Kramnik

  2. #2
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut heu
    Bonjour je pense que la l'utilisation d'un dictionnaire ("Scripting.dictionary")est tout indiqué

    tu aurais pas un fichier en exemple même avec une dizaine de ligne suffirait
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  3. #3
    Membre à l'essai
    Homme Profil pro
    Expertise Comptable
    Inscrit en
    Mars 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expertise Comptable

    Informations forums :
    Inscription : Mars 2015
    Messages : 6
    Par défaut
    Bonsoir,
    Merci pour ta réponse.

    Voici un exemple de contenu du fichier :

    02-01-2014_01-05-21;2001;Frigo;10300;
    12-01-2014_02-10-12;2001;Meuble;10100;
    22-01-2014_05–55-59;2001;Micro-onde;11000;
    10-01-2014_12-00-01;2001;AspirateurABC;13000;
    25–02-2014_19-21-53;2002;Frigo;19000;
    29-02-2014_14-30-41;2002;Meuble;14100;
    28-02-2014_18-10-30;2002;Micro-onde;14300;
    19-03-2014_15-19-05;2003;Frigo;10000;
    17-03-2014_11-01-39;2003;Meuble;12000;
    15-03-2014_16–52-29;2003;Micro-onde;9000;
    25-04-2014_19-00-01;2004;AspirateurABC;8000;
    25-04-2014_19-00-02;2004;AspirateurABC;7000;
    25-04-2014_19-00-03;2004;AspirateurABC;9000;
    25-04-2014_19-00-04;2004;AspirateurABC;10900;
    01-05-2014_13-08-48;2004;Frigo;100000;
    04-05-2014_09-09-44;2004;Meuble;101000;
    07-05-2014_07-11-33;2004;Micro-onde;25000;
    09-05-2014_20-05-23;2005;Frigo;5000;
    11-06-2014_22-06-20;2005;Meuble;1000;
    05-06-2014_10-51-18;2005;Micro-onde;3000;
    02-08-2014_23-23-23;2006;Frigo;21000;
    31-08-2014_11-11-10;2006;Meuble;19000;
    30-09-2014_19-40-49;2006;Micro-onde;14000;
    10-10-2014_21-20-13;2007;Frigo;33000;
    11-10-2014_01-21-39;2007;Meuble;23000;
    23-10-2014_15-53-49;2007;Micro-onde;11300;
    04-11-2014_16-29-19;2008;Frigo;10900;
    25-11-2014_19-31-35;2008;Meuble;9900;
    23-12-2014_05-15-23;2009;Frigo;7500;

    Le but est de vérifier qu’il n’y ait pas plusieurs lignes qui correspondent à un même produit pour une même année. Dans mon exemple, j’ai mis en rouge quatre lignes car elles concernent justement le même produit (AspirateurABC) et la même année (2004). Or, je veux qgarder qu’une seule des ces quatre lignes, la plus récente.
    Pour déterminer laquelle est la plus récente, il faut travailler sur la première «*colonne*».
    - Les années : pas de différence, on continue
    - Les mois : pareil
    - Les jours : pareil
    - Les heures : pareil
    - Les minutes: pareil
    - Les secondes : il y a une différence. Cela permet de déterminer quelle ligne est la plus récente, ici celle avec en seconde 04. Les trois autres doivent être supprimées.

    Je précise évidemment que si la différence s’était faite sur les années par exemple on aurait directement déterminé la ligne la plus récente..

    Est-ce plus clair ?

    Merci par avance,
    KramnikK

  4. #4
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Si la version de ton excel et 2007 ou la suivante, l'idée est de:
    Ouvrir le csv
    le transformer en colonnes (à l'aide de TextToColumns (Convertir))
    Trier sur la colonne des dates (du plus récent au plus ancien)
    Utiliser RemoveDulicates (supprimer doublons sur les colonnes B et C)
    Enregistrer le fichier.

    Mais 2 problèmes se présentent:
    TextToColumns par vba est allergique aux dates
    Tes dates, comme sur l'exemple ont un format non conventionnel)

    J'ai ajouté une fonction personnelle qui permet de reformater tes dates

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    Sub Test()
    Dim Fichier As String
    Dim Wbk As Workbook
    Dim N As Long
    Dim Tb
     
    Application.ScreenUpdating = False
    Fichier = "C:\Users\VAL\Desktop\Test2.csv"
    Set Wbk = Workbooks.Open(Filename:=Fichier, Local:=True)
    With Wbk
        With .Worksheets(1)
            N = .Cells(.Rows.Count, 1).End(xlUp).Row
            .Range("A1").Resize(N).TextToColumns Destination:=.Range("A1"), DataType:=xlDelimited, Semicolon:=True, Other:=False
            .Range("E1").Resize(N) = FORMATER(.Range("A1").Resize(N).Value)
            .Range("A1").Resize(N, 5).Sort key1:=.Range("E1"), Order1:=xlDescending, Header:=xlNo
            .Range("E1").Resize(N).ClearContents
            .Range("A1").Resize(N, 4).RemoveDuplicates Columns:=Array(2, 3), Header:=xlNo
        End With
        .Close True
    End With
    Set Wbk = Nothing
    End Sub
     
    Function FORMATER(ByRef Tb)
    Dim i As Long
    Dim Tmp
     
    For i = 1 To UBound(Tb, 1)
        Tb(i, 1) = Replace(Tb(i, 1), "_", "-")
        Tb(i, 1) = Replace(Tb(i, 1), Chr(150), "-")
        Tmp = Split(Tb(i, 1), "-")
        Tb(i, 1) = Tmp(2) & "-" & Tmp(1) & "-" & Tmp(0) & "-" & Tmp(3) & "-" & Tmp(4) & "-" & Tmp(5)
    Next i
    FORMATER = Tb
    End Function

    PS. J'ai fais un enregistrement simple, on pourra y remédier très facilement

  5. #5
    Membre à l'essai
    Homme Profil pro
    Expertise Comptable
    Inscrit en
    Mars 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expertise Comptable

    Informations forums :
    Inscription : Mars 2015
    Messages : 6
    Par défaut
    Bonjour,
    Merci beaucoup pour la réponse!
    Le code marche même si je n'y comprends pas grand chose malheureusement.
    J'ai quelques questions toutefois :
    - Mon fichier pourrait contenir plusieurs dizaines de milliers de lignes (plus de 65000). Ce code ne passe par l'ouverture du fichier et donc pas de problème de "coupure" de lignes par Excel, n'est-ce pas?
    - Comment puis-je faire pour ajouter une colonne après la colonne C, et la prendre en compte pour la comparaison? On prendrais en compte la colonne B, C, D au lieu des colonnes B et C. (voir contenu d'exemple après)
    - Au vu du grand nombre de lignes, ce code ne sera pas trop long à s'exécuter ?
    - Mon fichier étant le résultat de la fusion de plusieurs, je me demandais s'il n'était pas plus rapide pour l'exécution d'ajouter une ligne par une ligne depuis les fichiers à fusionner et de tester s'il y a des occurrences différentes...

    02-01-2014_01-05-21;2001;Frigo;CategorieA;10300;
    12-01-2014_02-10-12;2001;Meuble;CategorieC;10100;
    22-01-2014_05–55-59;2001;Micro-onde;CategorieB;11000;
    10-01-2014_12-00-01;2001;AspirateurABC;CategorieA;13000;
    25–02-2014_19-21-53;2002;Frigo;CategorieC;19000;
    29-02-2014_14-30-41;2002;Meuble;CategorieA;14100;
    28-02-2014_18-10-30;2002;Micro-onde;CategorieD;14300;
    19-03-2014_15-19-05;2003;Frigo;CategorieB;10000;
    17-03-2014_11-01-39;2003;Meuble;CategorieE;12000;
    15-03-2014_16–52-29;2003;Micro-onde;CategorieA;9000;
    25-04-2014_19-00-01;2004;AspirateurABC;CategorieA;8000;
    25-04-2014_19-00-02;2004;AspirateurABC;CategorieA;7000;
    25-04-2014_19-00-03;2004;AspirateurABC;CategorieA;9000;
    25-04-2014_19-00-04;2004;AspirateurABC;CategorieA;10900;
    01-05-2014_13-08-48;2004;Frigo;CategorieB;100000;
    04-05-2014_09-09-44;2004;Meuble;CategorieB;101000;
    07-05-2014_07-11-33;2004;Micro-onde;CategorieC;25000;
    09-05-2014_20-05-23;2005;Frigo;CategorieD;5000;
    11-06-2014_22-06-20;2005;Meuble;CategorieD;1000;
    05-06-2014_10-51-18;2005;Micro-onde;CategorieD;3000;
    02-08-2014_23-23-23;2006;Frigo;CategorieA;21000;
    31-08-2014_11-11-10;2006;Meuble;CategorieA;19000;
    30-09-2014_19-40-49;2006;Micro-onde;CategorieC;14000;
    10-10-2014_21-20-13;2007;Frigo;CategorieE;33000;
    11-10-2014_01-21-39;2007;Meuble;CategorieC;23000;
    23-10-2014_15-53-49;2007;Micro-onde;CategorieB;11300;
    04-11-2014_16-29-19;2008;Frigo;CategorieE;10900;
    25-11-2014_19-31-35;2008;Meuble;CategorieE;9900;
    23-12-2014_05-15-23;2009;Frigo;CategorieA;

    En vous remerciant,

    KramnikK

  6. #6
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 903
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    À partir d'Excel 2007, le classeur peut contenir plus d'un million de lignes. La seule condition étant de ne pas ouvrir le classeur en mode compatibilité. Dans ce cas, la limite des 65,500 quelques lignes continue de s'appliquer.

  7. #7
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Remplace les lignes correspondantes par celles ci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            .Range("F1").Resize(N) = FORMATER(.Range("A1").Resize(N).Value)
            .Range("A1").Resize(N, 6).Sort key1:=.Range("F1"), Order1:=xlDescending, Header:=xlNo
            .Range("F1").Resize(N).ClearContents
            .Range("A1").Resize(N, 5).RemoveDuplicates Columns:=Array(2, 3, 4), Header:=xlNo
    Pour les tests, tu n'as qu'à les faire et voir la durée d'exécution

    Pour la compréhension, j'ai expliqué l'algorithme, à toi de voir le comment
    Ouvrir le csv
    le transformer en colonnes (à l'aide de TextToColumns (Convertir))
    Trier sur la colonne des dates (du plus récent au plus ancien)
    Utiliser RemoveDulicates (supprimer doublons sur les colonnes B et C)
    Enregistrer le fichier

  8. #8
    Membre à l'essai
    Homme Profil pro
    Expertise Comptable
    Inscrit en
    Mars 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expertise Comptable

    Informations forums :
    Inscription : Mars 2015
    Messages : 6
    Par défaut
    Bonjour, milles merci pour vos réponses très pertinentes. Votre m'a été d'un grand secours.
    J'ai testé le code et tout semble bien marcher. Encore un grand merci !

    A trés vite pour d'autres questions ...

    KramnikK

    Rebonjour,

    Je viens de me rendre compte qu'aprés l'exécution de la macro sur mon fichier, les "colonnes" sont séparées par une "," et plus par ";". Or, j'ai besoin que ce soit un ";" qui sépare les colonnes. J'ai beau lire et relire le code et je vois pas pourquoi sa change le séparateur ... Que faut il changé ? Je précise qu'utiliser une ligne de code venant "remplacer" les virgules par des points virgules ne m'arrange pas car dans mes données il pourrait y avoir des nombres à virgules (9,99 ou encore 1999,90...).
    Merci par avance

  9. #9
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    PS. J'ai fais un enregistrement simple, on pourra y remédier très facilement

    Remplace ta ligne par ces lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Application.DisplayAlerts = False
    .SaveAs Filename:=Fichier, FileFormat:=xlCSV, Local:=True
    .Close False
    Application.DisplayAlerts = True

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Toutes versions] Confusion de résultats dans recherche des occurrences d'une valeur avec Find sur des dates
    Par iperkut dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 08/11/2011, 19h07
  2. [AC-2007] Gestions des pièces jointes avec RecordSet sous VBA
    Par Oxopor dans le forum VBA Access
    Réponses: 4
    Dernier message: 12/07/2011, 10h59
  3. [XL-2003] vba, stocker des résultats dans un fichier csv
    Par linann dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 19/06/2010, 21h17
  4. [Toutes versions] Basculer valeur variable VBA dans JavaScript
    Par Antho87 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 25/08/2009, 15h27
  5. Réponses: 5
    Dernier message: 09/10/2007, 20h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo