VBA : Supprimer 1 ligne sur 2

LouisBlanc

XLDnaute Nouveau
Bonjour à tous

J'ai 1 fichier de 54000 lignes et 5 colonnes.
Il faut que je supprime 1 ligne sur 2.
Je réussi à le faire dans une boucle for next

For i = 2 To nptotal + 1
Rows(i).Select
Selection.Delete Shift:=xlUp
Next

mais l'exécution est très longue.
Je souhaiterais faire une sélection multiple d'1 ligne sur 2 (à l'aide d'1 boucle peut être), puis supprimer la sélection en 1 seule opération, ce qui je pense gagnerait beaucoup en temps d'exécution.
Mais voilà, je n'arrive pas à faire cette sélection.
Auriez vous des propositions.

Merci d'avance
 

laetitia90

XLDnaute Barbatruc
Re : VBA : Supprimer 1 ligne sur 2

rebonjour les amis :):):):)
j'ai un peu de temps pour tester un peu sur 60000 lignes sur 5 col
eh!!! ben moi je rejoins l'ami JM:)
le code de l'ami Job plus rapide j'ai pas tous teste pas le temps
moi :):):):):):):):):):) 0.5 s :(
l'ami bhbh:):):):):):)0.49 s:)
l'ami Job :):):):):):):)0.32 s:)

autrement si on connait les dimensions excat d'un tableau on peut ecrire comme cela pour infos
Option Base 1
Code:
Sub est()
  Dim t, t1(60000, 5), x As Long, l As Long, c As Byte
  t = Range("A1:e60000")
  For x = 1 To 60000 Step 2
  l = l + 1
  For c = 1 To 5: t1(l, c) = t(x, c): Next c
  Next x
  Columns("a:e").ClearContents
  Range("A1:e" & l) = t1
  Erase t, t1
 End Sub

j'ai mis erase!!!! si on teste beaucoup de fois alors la j'obtiens un peu tout 0.10 s 0.5 s 0.8 s ect.. mais bon interessant a connaitre
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re : VBA : Supprimer 1 ligne sur 2

Re, bonsoir à tous

leti:
Tu as quoi comme bécane?
Et vous, les" amiches" ?
Et combien de processeurs sous le capot ?
VB:
Sub letiII()Dim t, t1(60000, 5), x&, l&, c!, tt!
tt = Timer
t = Range("A1:E60000")
    For x = 1 To 60000 Step 2
    l = l + 1
        For c = 1 To 5
            t1(l, c) = t(x, c)
        Next c
    Next x
With Application
    .ScreenUpdating = False
    .Calculation = xlCalculationManual
        Columns("A:E") = Empty
        Range("A1:E" & l) = t1
        Erase t, t1
        Debug.Print "Durée " & Format(Timer - tt, "0.00 \s")
        'Resultat ici : Durée 1,91 s
    .ScreenUpdating = True
    .Calculation = xlCalculationAutomatic
End With
End Sub
 
Dernière édition:

laetitia90

XLDnaute Barbatruc
Re : VBA : Supprimer 1 ligne sur 2

re ,JM... moi pas trop savoir j'utilise le pc de mon papou mais pas la jusqu'a la fin du moins pc au moins 5 ans refroidi avec de l'eau??? si moi voir couler eau tous arreter en urgence je lui poserais la qst a son retour en attendant a + leti
 

MJ13

XLDnaute Barbatruc
Re : VBA : Supprimer 1 ligne sur 2

Bonjour à tous

Merci pour tous vos codes mais j'ai eu un petit souci avec le code de Léti :eek:.

Voici 3 fichiers à tester suivant les versions et le nombre de lignes.

Sinon pour avoir le processeur et la mémoire vive (Ram) de la configuration, il suffit de faire la combinaison de touches Windows+pause :).

Sur Xl2010, j'ai environ 0.5 secondes et 8 secondes.
 

Pièces jointes

  • Supprime1LigneSur2.xls
    38 KB · Affichages: 52
  • Supprime1LigneSur2Bis.xls
    38.5 KB · Affichages: 58
  • Supprime_1LigneSur2.xlsm
    19.8 KB · Affichages: 62

LouisBlanc

XLDnaute Nouveau
Re : VBA : Supprimer 1 ligne sur 2

Bonjour à tous

Je poursuis un peu mon problème.
Comme je connais à l'avance les dimensions de mon tableau (infos que je récupère en entête du fichier), j'avais retenu une solution proche de celle à Laetitia.

Maintenant, je continue mon traitement, mais je découvre juste avec vous les variables tableaux, et je suis plutôt débutant en VBA.
J'ai réussi à extraire, sans boucle, 1 ligne (ou 1 colonne), d'un tableau, mais, questions :

- peut on, par exemple, sans passer par une boucle, prendre une plage d'un tableau et les recopier dans un autre tableau ? (pex tab1 contient la plage (A1:E20) et tab 2 contient la plage (B2:C4) de tab1)
- peut on faire la somme, ou la moyenne (ou autre), d'une colonne d'un tableau ?
- peut on faire la somme, ou la moyenne (ou autre), d'une ligne d'un tableau ?

Merci pour vos pistes que j'adapterai à mon problème, comme ça j'apprends et je progresse en même temps.

Il va valoir aller au boulot....... Bonne journée à tous
 

LouisBlanc

XLDnaute Nouveau
Re : VBA : Supprimer 1 ligne sur 2

Tu as raison.

Ci dessous exemple de code à partir d'une feuille avec un tableau contenant des valeurs en A1:C10

Sub essaitab()

'Dim tab1 As Variant

tab1 = Range("A1:C10").Value 'transfert du tableur dans tableau


Range("e1:G10").Value = tab1 'transfert du tableau dans tableur

[a13:c13] = Application.Index(tab1, 3) 'transfert ligne 3 tableau dans tableur

[b16:b25] = Application.Index(tab1, , 2) 'transfert colonne 2 tableau dans tableur

End Sub
 

MJ13

XLDnaute Barbatruc
Re : VBA : Supprimer 1 ligne sur 2

Re

merci pour ta réponse:

peut on faire la somme, ou la moyenne (ou autre), d'une colonne d'un tableau ?

Tu peux tester un code de ce type:

Code:
Sub somme()
'F1
'Set myRange = Worksheets("Sheet1").Range("A1:C10")
Set myRange = Range("A1:C3")
answer = Application.WorksheetFunction.Sum(myRange)
MsgBox answer
End Sub
 

LouisBlanc

XLDnaute Nouveau
Re : VBA : Supprimer 1 ligne sur 2

Oui, ça c'est ok.
Mais c'est la somme, ou la moyenne, (ou autre) de ligne ou colonne d'une variable de type tableau, sans passer par une boucle.
Par exemple j'ai une variable tableau de 10 lignes et 5 colonnes.
Je voudrais obtenir une seconde variable tableau de 10 lignes 1 colonne qui contiendrait la moyenne de chaque ligne du premier tableau.
 

laetitia90

XLDnaute Barbatruc
Re : VBA : Supprimer 1 ligne sur 2

bonjour tous :):):):):)

a mon avis sans passer par une boucle????

autrement pour la moyenne de la 2 col du tab ...on peut ecrire comme cela

Code:
 tab = [A1:C10]
  MsgBox Application.Average(Application.Index(tab, , 2))

mais bon dans ce cas de figure autant ecrire comme cela

Code:
 MsgBox Application.Average([b1:b10])

perso: je vois pas bien ce que tu veus faire????

autrement avec une boucle
Code:
Dim t(), t1(), x As Long, i As Long, k As Long, y As Byte
Sub es()
 t = Range("a1:d10")
 x = 1
 For i = 1 To UBound(t)
 For y = 1 To 3: t(i, 4) = t(i, 4) + t(i, y): Next y
 t(i, 4) = t(i, 4) / 3
 ReDim Preserve t1(4 To 4, 1 To x)
 For k = 4 To 4
 t1(k, x) = t(i, k)
 Next k: x = x + 1: Next i
 [d1].Resize(x - 1, 1) = Application.Transpose(t1)
End Sub

la j'ecris le resultat en en col D

les variables en debut du module comme cela tu peus ecrire ou tu veus

exemple plus haut on met en memoire t1

Code:
Sub es()
 t = Range("a1:d10")
 x = 1
 For i = 1 To UBound(t)
 For y = 1 To 3: t(i, 4) = t(i, 4) + t(i, y): Next y
 t(i, 4) = t(i, 4) / 3
 ReDim Preserve t1(4 To 4, 1 To x)
 For k = 4 To 4
 t1(k, x) = t(i, k)
 Next k: x = x + 1: Next i
End Sub
mais la ecris pas en col D

avec une autre macro j'ecris en coL J
Code:
Sub esv()
[j1].Resize(x - 1, 1) = Application.Transpose(t1)
Erase t, t1
End Sub

tant que tu mets pas erase tes tableaux reste charger en memoire donc tu peus utilser autant de fois que tu veus

transpose dans ton cas passe < a 65000 lignes
 

LouisBlanc

XLDnaute Nouveau
Re : VBA : Supprimer 1 ligne sur 2

Bonjour

En fait, j'ai des tableaux de x lignes et y colonnes (x et y pouvant changer suivant la configuration).
Je souhaite créer une colonne supplémentaire (y+1), qui contiendrait la moyenne de chaque ligne des y colonnes, puis afficher le résultat.

Dans tous les cas, merci pour vos codes. Je fais essayer d'adapter tout ça à mon problème et je vous tiens au courant.

A+
 

Discussions similaires

Statistiques des forums

Discussions
312 428
Messages
2 088 342
Membres
103 821
dernier inscrit
Lorient56