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 :

Amaigrissement d'une colonne


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 5
    Par défaut Amaigrissement d'une colonne
    Bonjour à tous,

    Voilà ce que je voudrais faire :
    Dans un fichier contenant des colonnes (de nombres) de taille différentes, j'aurais besoin d'éliminer disons 2/3 d'une colonne en particulier (passer de 60000 à 20000 lignes)
    Je ne connais presque rien à VB, mais j'avais trouvé la solution la plus évidente :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub Régime
    For compteur = 1 To 20000
    Selection.Offset(1,0).Select
    Selection.Delete
    Selection.Delete
    Next
    End Sub
    Et ça marche ... mais ça prend 2 heures, même en désactivant la mise à jour de l'écran. Quelqu'un pourrait m'indiquer une solution plus élégante et moins comsomatrice de temps ?

    Merci d'avance

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonsoir Mordeth,

    Une 1ère possibilité :

    votre fichier comprend de nombreuses formules ?

    Si oui, essayez d'inclure ce code au début :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    With Application
            .Calculation = xlManual
    End With
    et à la fin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    With Application
            .Calculation = xlAutomatic
    End With

  3. #3
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Par défaut
    Ca m'étonnerai quand même qu'avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    For compteur = 1 To 20000
    Selection.Offset(1,0).Select
    Selection.Delete
    Selection.Delete
    Next
    même après 2 heures, que cela fonctionne, à moins qu'Excel soit fatigué..
    mais essaye avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Range("A1:A20000").select
    Selection.delete
    Faut évidemment voir où tu démarre.
    A+
    EDIT:
    ou si tu veux éliminer toute les lignes après 20000
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        Rows("20001:60000").Select
        Selection.ClearContents

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 5
    Par défaut
    Désolé, je n'ai pas été assez clair :

    @ LeForestier
    je ne veux pas éliminer les 20000 premiers ou derniers points, mais 2 points sur trois. Tel quel, j'ai trop de précisions (si c'est pas malheureux ) et excel a du mal à suivre.

    @jacques_jean
    En l'occurence, il s'agit de valeurs expérimentales et non de formules

    Merci quand même à tous les deux

  5. #5
    Expert confirmé
    Avatar de bidou
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2002
    Messages
    3 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 055
    Par défaut
    les concours de vitesse, tout une époque

    La plus lente
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Public Sub MethodeLourde()
     
        Dim Plage As Range, compteur As Long
     
        Application.ScreenUpdating = False
        With ThisWorkbook.Worksheets(1)
            Set Plage = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp))
        End With
        For compteur = Plage.Rows.Count + 1 To 1 Step -3
            Plage.Rows(compteur).Offset(1).Resize(2).Delete xlShiftUp
        Next compteur
     
    End Sub
    La plus habituelle
    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
    Public Sub MethodeExcel()
     
        Dim PlageSource As Range, PlageCible As Range, compteur As Long
     
        Application.ScreenUpdating = False
        With ThisWorkbook.Worksheets(1)
            Set PlageSource = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp))
        End With
        Set PlageCible = PlageSource.Offset(1, 2).Resize(PlageSource.Rows.Count \ 3 - 1)
        PlageCible.Offset(-1).Resize(1).Value = PlageSource.Cells(1).Value
        PlageCible.FormulaR1C1Local = "=DECALER(L1C1;LIGNE()*2+LIGNE()-3;0)"
        PlageCible.Value = PlageCible.Value
        PlageSource.Offset(1).Delete xlShiftUp
        PlageCible.Offset(, -2).Value = PlageCible.Value
        PlageCible.Offset(-1).Resize(PlageCible.Rows.Count + 1).ClearContents
     
    End Sub
    La plus rapide (enfin de mon temps )
    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
    Public Sub MethodeTableau()
     
        Dim Plage As Range, compteur As Long, OldVals As Variant, NewVals As Variant, lgTime As Long
     
        Application.ScreenUpdating = False
        With ThisWorkbook.Worksheets(1)
            Set Plage = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp))
        End With
        OldVals = Plage.Value
        Plage.Delete xlShiftUp
        ReDim NewVals(1 To UBound(OldVals) \ 3, 1 To 1)
        For compteur = 1 To UBound(OldVals) Step 3
            NewVals((compteur \ 3) + 1, 1) = OldVals(compteur, 1)
        Next compteur
        Set Plage = ThisWorkbook.Worksheets(1).Cells(1, 1).Resize(UBound(NewVals))
        Plage.Value = NewVals
     
    End Sub

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 5
    Par défaut
    Merci pour ta réponse, Bidou (les concours de vitesse, c'est pour les pro, je veux juste qqchose d'utilisable)
    Néanmoins, tel quel, ça ne marche pas ^^
    Il suffit surement d'un rien pour que ça fonctionne, alors est-ce que tu pourrais me faire de l'explication de texte ?

    methode tableau
    erreur d'exécution 13, incompatibilité de type
    ==> ReDim NewVals(1 To UBound(OldVals) \ 3, 1 To 1)

    methode excel
    erreur d'exécution 1004, erreur définie par l'application ou par l'objet
    ==> Set PlageCible = PlageSource.Offset(1, 2).Resize(PlageSource.Rows.Count \ 3 - 1)
    #offset(2,1) plutôt#

    methode lourde : rien ?

  7. #7
    Expert confirmé
    Avatar de bidou
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2002
    Messages
    3 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 055
    Par défaut
    tous ses exemples supposes que les données sont dans la colonne 1 (A).
    Si elles sont dans une autre colonne il faut changer les numéros en gras dans

    Set Plage = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp))

    pour mettre le numéro de la colonne où elles sont

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 5
    Par défaut
    Jolie réactivité !

    mais ça ne change rien à l'affaire, le problème vient d'ailleurs

  9. #9
    Expert confirmé
    Avatar de bidou
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2002
    Messages
    3 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 055
    Par défaut
    Alors je ne sais pas car chez moi ça marche, avec deux versions différentes d'Excel, sauf qu'il y a un petit bug dans la fonction tableau
    C'est
    ReDim NewVals(1 To UBound(OldVals) \ 3 + 1, 1 To 1)

    NB : Il faut aussi modifier la colonne dans :
    PlageCible.FormulaR1C1Local = "=DECALER(L1C1;LIGNE()*2+LIGNE()-3;0)"
    ou dans
    Set Plage = ThisWorkbook.Worksheets(1).Cells(1, 1).Resize(UBound(NewVals))

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 5
    Par défaut
    OK, il y a du mieux, les méthodes excel et lourde marchent.
    Je suis sûr que c'était évident pour tout le monde sauf moi, le problème venait de Set Plage = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp)) où il y avait des . en trop ...
    Reste à voir si elles sont suffisamment rapides
    A+

    edit : la méthode lourde porte bien son nom (la première que j'ai utilisée était ultralourde) mais la méthode excel fonctionne bien plus rapidement. Je n'aurais sans doute pas besoin de la méthode tableau

    Encore merci, bidou

Discussions similaires

  1. Ajout d'une colonne dans une table ...
    Par Djedjeridoo dans le forum SQL
    Réponses: 2
    Dernier message: 22/07/2003, 16h12
  2. Supprimer une colonne sous SQL Serveur 2000
    Par WOLO Laurent dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 14/07/2003, 12h24
  3. Check sur une colonne de table "en cours"
    Par in dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 02/07/2003, 09h47
  4. [PostGres] Suppresion d'une colonne.
    Par Gandalf24 dans le forum Requêtes
    Réponses: 4
    Dernier message: 23/05/2003, 09h02
  5. [VB.NET] Insérer une colonne de CheckBox dans un DataGrid
    Par Manue.35 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 22/05/2003, 11h44

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