Optimisation Insertion ligne VBA Excel [Résolu]

Signaler
Messages postés
1141
Date d'inscription
mercredi 7 mars 2007
Statut
Membre
Dernière intervention
19 septembre 2007
-
cs_MPi
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
-
Salut tout le monde,

voila je suis totalement inculte en VBA Excel mais j'ai réussi a faire un truc qui fonctionne.

J'ai une feuille Excel dans laquel je transfere les données d'une autre feuille et j'y insére une ligne vide pour chaque ligne dont la premiere colonne est NON vide.
Il est possible que cette feuille contienne plusieurs milliers de lignes.

Avec mon code, ca prend 22s (environ 5000 lignes). Par coutiosité, je voulais savoir si vous n'aviez pas une méthode plus rapide que la mienne et qu'on fasse la course, LOL.

Comme je l'ai dit c'est simplement pour savoir s'il y a une meilleur méthode afin de connaitre un peu mieux Excel car je viens de m'y mettre. Merci

Le code:

Private Sub CommandButton1_Click()


Dim tt As Long
tt = Timer
Call insertion
MsgBox Timer - tt


End Sub

Public Sub insertion()

Worksheets("Feuil2").Cells.Copy Destination:=Worksheets("Feuil3").Range("A1")
Worksheets("Feuil3").Activate


For Each rw In Worksheets("Feuil3").UsedRange.Rows
    rw.Activate
            'Si la cellue est impaire et qu'elle n'est pas vide
    If (ActiveCell.Value <> "") Then
        ActiveCell.Offset(1, 0).Select
        Selection.EntireRow.insert
    End If
Next


End Sub

13 réponses

Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
46
Salut [auteurdetail.aspx?ID= 999867 Nicko11],
Tu peux déjà eviter d'activer activeCell avant d'inserer
Soit
ActiveCell.Offset(1, 0) .EntireRow.insert

@+: =89254 Ju£i?n
Pensez: Réponse acceptée
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
46
Re,
Je dirais que c'est pas Top comme résultat. imagine un fichier Excel avec ces 65536 Lignes pleines...

@+: Ju£i?n
Pensez: Réponse acceptée
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
46
Re,
J'ai pas compris l'histoire de ton modulo et de "Si la cellue est impaire et qu'elle n'est pas vide"

Sinon pour continuer pour éviter d'activer les cellules. Tu peux en plus faire en sorte que Excel n'affiche pas les modification tout de suite.

Application.ScreenUpdating = False
For Each rw In Worksheets("Feuil3").UsedRange.Rows
   If rw.Value <> vbNullString Then rw.Offset(1, 0).EntireRow.Insert
Next
Application.ScreenUpdating = True , ----
[code.aspx?ID=41455 By Renfield]

@+: Ju£i?n
Pensez: Réponse acceptée
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
ok avec jrivet sur le code...

If LenB(rw.Value) Then

peut etre plus que

If rw.Value <> vbNullString Then
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
46
Re,
Sauf erreur de ma part, le fait d'ajouter une ligne, te fais faire un passage de plus dans la boucle for.

Donc peu être qu'en abandonnant le For each et en faisant une boucle qui part de la fin et qui remonte, tu gagnera peu être du temps.

@+: Ju£i?n
Pensez: Réponse acceptée
Messages postés
1141
Date d'inscription
mercredi 7 mars 2007
Statut
Membre
Dernière intervention
19 septembre 2007
1
LOL, ouah j'ai gagné 300ms sur 22s.

Merci quand meme, c'est deja un debut.
J'accepterai plus tard ta reponse pour ne pas me priver d'autres reponses.

Mais dis moi, c'est un resultat honnete 22s pour environ 5000 lignes ou c'est carrément nul ?
Messages postés
1141
Date d'inscription
mercredi 7 mars 2007
Statut
Membre
Dernière intervention
19 septembre 2007
1
Partir de la fon, pas bete mais comment ? Sinon j'avais fais un modulo mais le pb, c'est que des fois j'ai plusieurs ligne d'espaces mais ca peut se faire si je test la nullité de la ligne aussi.

Mais ta proposition m'intéresse pas mal.
Messages postés
1141
Date d'inscription
mercredi 7 mars 2007
Statut
Membre
Dernière intervention
19 septembre 2007
1
Super ca, j'en plus qu' 4s, en effet, c'est tres con mais c'est radical. MERCI 

Tu ne m'as pas dis comment partir de la fin avec un for each.

Pour ce que je voulais dire tout a l'heure pour le modulo 2, c'est justement éviter de passer dans les cellules insérées.
Je pense qu'en arrivant a faire ca, modulo ou for each en commencant pas la fin,

on devrait logiquement arriver a 2s.
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
Modulo 2

avec un titre qui commence par optimisation :o

fais un And 1 :

If (n And 1) Then
'# n est impair
Else
'# n est pair
End If
Messages postés
1141
Date d'inscription
mercredi 7 mars 2007
Statut
Membre
Dernière intervention
19 septembre 2007
1
Hey doucement Reinfield, je te rappelle juste 2 phrases :

" voila je suis totalement inculte en VBA Excel "
"Comme je l'ai dit c'est simplement pour savoir s'il y a une meilleur méthode afin de connaitre un peu mieux Excel car je viens de m'y mettre"
Donc "Modulo 2  avec un titre qui commence par optimisation :o", je trouve ca un peu aggressif (soft mais quand meme).

Ensuite, ce que tu veux dire c'est que "Mod 2" réalise en faire un modulo et puis une comparaison alors que "n And 1" est direct.
OK, j'y avais pas penser.

Ensuite pour le "If LenB(rw.Value)", ca serait plutot  "If LenB(ActiceCell.Value)" car value me donne une incompatibilité de type.

Je testerai apres avoir mangé et je vous dirais ca.

Merci.
Messages postés
1141
Date d'inscription
mercredi 7 mars 2007
Statut
Membre
Dernière intervention
19 septembre 2007
1
bon, pour la parité, je lache l'affaire car il y a des execptions et j'ai pas envi de me casser la tete la dessus.

Donc je repose le code au cas ou et je vous remercie. En fait, la principale demande de ressource est le raffraichissement de l'ecran. Je passe quand meme de 22s a 3s.

Public Sub insertion()


Worksheets("Feuil2").Cells.Copy Destination:= Worksheets("Feuil3").Range("A1")
Worksheets("Feuil3").Activate



Application.ScreenUpdating = False

For Each rw In Worksheets("Feuil3").UsedRange.Rows
    rw.Activate
            'Si la cellue n'est pas vide
    If (LenB(ActiveCell.Value)) Then
        ActiveCell.Offset(1, 0).EntireRow.insert
    End If
Next
Application.ScreenUpdating = True


End Sub   
Messages postés
492
Date d'inscription
jeudi 5 avril 2007
Statut
Membre
Dernière intervention
2 juillet 2012

bonjour,
a titre d'information, pour démarer de la dernière ligne
FinLigne = Range("A65536").End(xlUp).Row<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>FinLigne = la dernière ligne initialisée de la feuille
A+
louis
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
15
Salut lermite,
petite correction ...

FinLigne = la dernière ligne initialisée de la <strike>feuille</strike> colonne

MPi