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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 ?

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