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 :

Fusion doublons+Taille fichier [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2016
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2016
    Messages : 37
    Par défaut Fusion doublons+Taille fichier
    Bonjour,

    J'ai une base d'opérateurs ou chacun à au mois deux codes identifiants (différents).
    J'ai plein cherché comment fusionner les opérateurs en doublons.
    Mais les procédures proposées dans les forums (tel-que celui là) sont tellement sophistiqués que je peux pas comprendre
    donc j'ai testé ce code sur un échantillon de données (mois de 1000 lignes):
    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
     
    Sub SDbl()
    Dim i, j As Integer
    Dim u As Variant
    Application.ScreenUpdating = False
     For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
      u = Cells(i, 2)  
      For j = i + 1 To Cells(Rows.Count, 1).End(xlUp).Row  
        If Cells(i, 1) = Cells(j, 1) Then
        u = u & "|" & Cells(j, 2)
        Cells(i, 3) = u
        Cells(j, 1).EntireRow.Clear
       End If   
      Next j  
     Next i
    End Sub
    Il donne de bon résultat sauf qu'il reste des lignes vides à supprimer ultérieurement (car: Cells(j, 1).EntireRow.delete pause un problème aussi).
    Mais lorsque je l'ai appliqué à mon fichier original (+ 215 000 lignes), il se bloque.
    j'ai changé (dim i, j par long), et j'ai essayé encore (clng) mais le même problème persiste!
    Que faire!!!

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Par défaut
    Salut,

    lorsqu'il s'agit de supprimer des lignes, il est recommande d'inverser les boucles (="partir d'en bas et remonter")
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Membre averti
    Femme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2016
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2016
    Messages : 37
    Par défaut
    Merci Jean,
    Je viens de le refaire en inversant!!
    Mais si tu m'explique pour quoi?

  4. #4
    Membre Expert
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 704
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 704
    Par défaut
    Imaginons les lignes suivantes :
    n° ligne / contenu ligne
    1/a
    2/b
    3/c
    4/d
    5/e

    Tu faits une boucle for i = 1 to 5 et tu supprimes la ligne si le contenu est a ou b:
    • itération 1, i = 1 , on regarde 1/a --> on supprime. Que se passe-til dans Excel? Tout est décalé vers le haut :
      1/b
      2/c
      3/d
      4/e
      5/"vide"
    • iteration 2, i = 2, on regarde la ligne 2, soit 2/c. Et on a pas vérifié le contenu b qui est maintenant en ligne 1! C'est raté


    En commençant par le bas, on évite cela, car en supprimant la dernière ligne, on ne décale rien, donc on visite tout le monde.

    Sinon, autre commentaire sur ton code : je pense que tu mélanges un peu le type de "u". Veux-tu que ce soit une cellule ou le contenu/la valeur de la cellule? Supposons que tu veuilles que ce soit une cellule :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim u As Range 'tu peux le dimensionner comme une cellule
    u = Cells(i,2)   'pour dire à quelle cellule tu t'intéresse
    Cells(i, 3).Value = u.Value & "|" & Cells(j, 2).Value    'là, tu veux changer la valeur d'une cellule, donc il faut s'intéresser à sa propriété value
    Ensuite, je mettrais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Cells(i, 1).Value = Cells(j, 1).Value Then ...
    Plutôt que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Cells(i, 1) = Cells(j, 1) Then...
    Mais là, je ne suis pas 100% sûre que ce soit nécessaire, peut-être suis-je trop précautionneuse...

  5. #5
    Membre averti
    Femme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2016
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2016
    Messages : 37
    Par défaut
    Merci riaolle pour les explications.
    J'ai deja dit que ce code m'a retournée le résultat espéré (sauf que les lignes vides).
    Mais quand même j'ai pris en considération tes remarques et j'ai ajouté le .value.
    le resultat: Erreur d'execution en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Cells(i, 3).Value = u.Value & "|" & Cells(j, 2).Value
    Mon dernier essai etait:
    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
    Sub SDbl()
    Dim i, j, DL As Integer
    Dim u As Variant
    Application.ScreenUpdating = False
    DL = Cells(Rows.Count, 1).End(xlUp).Row
    For i = DL To 2 Step -1
      u = Cells(i, 2)  
      For j = DL To i + 1 Step -1
        If Cells(i, 1).Value = Cells(j, 1).Value Then
        u = u & "|" & Cells(j, 2)
        Cells(i, 3) = u
        Cells(j, 1).EntireRow.Delete shift:=xlUp
       End If   
      Next j  
     Next i
    End Sub
    Les lignes vides sont supprimées MAIS il ne retourne que DEUX codes à la colonne 3 (variable u)
    contrairement au résultat précédent.
    càd pour un opérateur à 4 codes il se contraint aux deux premiers!!!!

  6. #6
    Membre Expert
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 704
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 704
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For i = DL To 2 Step -1
    Le Step - 1 est justemen là pour dire qu'il faut parcourir à l'envers, donc il faut écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For i = 2 To DL Step -1


    FAUX, désolée

  7. #7
    Membre averti
    Femme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2016
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2016
    Messages : 37
    Par défaut
    Tu veux dire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    For i = 2 To DL Step -1
      For j = i + 1 To DL Step -1
    How that!!!
    Si le pas (step) est négatif donc on va du plus grand au plus ptit
    çad de la dernière ligne à la première et pas le contraire

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

Discussions similaires

  1. réduction taille fichier
    Par Bibouda dans le forum Autres Logiciels
    Réponses: 3
    Dernier message: 27/10/2005, 17h43
  2. Taille fichier smart upload
    Par Homer dans le forum ASP
    Réponses: 2
    Dernier message: 20/10/2005, 21h18
  3. détection doublons de fichier
    Par poussinphp dans le forum Langage
    Réponses: 4
    Dernier message: 09/08/2005, 18h33
  4. Limiter taille fichier joint à un mail
    Par fdthierry dans le forum Applications et environnements graphiques
    Réponses: 2
    Dernier message: 27/08/2004, 12h12
  5. [URL] taille fichier
    Par hocinema dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 09/07/2004, 16h03

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