Boucle sur la dernière ligne non vide

Résolu/Fermé
Ecam39 Messages postés 286 Date d'inscription jeudi 12 janvier 2012 Statut Membre Dernière intervention 16 mars 2024 - 14 nov. 2013 à 09:19
Ecam39 Messages postés 286 Date d'inscription jeudi 12 janvier 2012 Statut Membre Dernière intervention 16 mars 2024 - 16 nov. 2013 à 13:39
Bonjour,

J'ai réalisé une macro qui m'effectue des calculs en fonction d'une cellule non vide. La procédure réalise une boucle.

Par défaut, la boucle commence toujours en Ligne 2 jusqu'à la fin de la colonne.

Or, lorsque je n'ai que 10 lignes de complétées, la procédure est très courte à se lancer, par contre quand j'ai 1000 lignes ça demande presque 1 min. Quand ej rajoute des données, les lignes ayant déjà été calculées par le passé sont recalculées (vu que la procédure démarre toujours en début de colonne).
Mais je n'ai besoin de calculer que les nouvelles lignes que j'ai incrémenté.

Je souhaiterai donc lancer la procédure depuis la dernière ligne saisie et non au début de la colonne.

En espérant avoir été clair.

8 réponses

f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 1 701
14 nov. 2013 à 09:24
Bonjour,

Vous pouvez ouvrir une inputbox au debut de votre macro pour entrer le numero de ligne de debut de votre boucle.
0
Ecam39 Messages postés 286 Date d'inscription jeudi 12 janvier 2012 Statut Membre Dernière intervention 16 mars 2024 9
Modifié par Ecam39 le 14/11/2013 à 09:35
Le soucis c'est que ça rajoute une saisie (ce n'est pas moi qui alimente le fichier). Et déjà faire une macro c'est limite pour eux alors si ils doivent saisir un N° de ligne je me fais plumer :)

Il n'existe pas un autre moyen à renseigner directement dans la boucle ?
Voici ma boucle :

'Commencer la boucle en colonne E

For ecart_de_stock = 2 To Range("E2").End(xlDown).Row

L'idéal serait de transformer le Range("E2") en variable non ?
0
f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 1 701
14 nov. 2013 à 09:46
Re beau volatil (si ils doivent saisir un N° de ligne je me fais plumer :)

Si vous avez un critere qui permet de pouvoir parametrer le debut de la boucle c'est ok, mais lequel est-ce ????
0
Ecam39 Messages postés 286 Date d'inscription jeudi 12 janvier 2012 Statut Membre Dernière intervention 16 mars 2024 9
14 nov. 2013 à 10:40
le critère de la boucle c'est qu'il effectue un calcul sur toutes les lignes ( d'une colonne nommée ) non vides.
0
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
14 nov. 2013 à 10:32
Bonjour,

Dans les boucles For Next, il y a une colonne qui reçoit le résultat d'un calcul. Peut être qu'en testant la dernière cellule renseignée pour commencer la boucle du For Next ...

Admettons que le calcul soit en colonne H:

Dim DerLig As Long


DerLig = Range("H" & Rows.Count).End(xlUp).Row
For ecart_de_stock = DerLig to Range("E2").End(xlDown).Row
....

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 1 701
14 nov. 2013 à 11:15
Bonjour Polux31,

il semble que Ecam39 n'a pas vue votre message et dans la reponse qu'il me fait, il n'y pas de critere pour donner une solution.

Ecam39,

y a t-il une colonne avec une cellule qui puisse donner le debut du prochain calcul ???
0
Ecam39 Messages postés 286 Date d'inscription jeudi 12 janvier 2012 Statut Membre Dernière intervention 16 mars 2024 9
14 nov. 2013 à 14:43
Dans la colonne E, la boucle démarre avec une fonction SI :

Si la colonne E est non vide, alors j'effectue un calcul en colonne F.

Est ce la réponse attendu ?
0
f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 1 701
14 nov. 2013 à 16:01
Re,

Presque, relisez la proposition de Polux31 et voyez si cela correspond a votre contexte.
0
Ecam39 Messages postés 286 Date d'inscription jeudi 12 janvier 2012 Statut Membre Dernière intervention 16 mars 2024 9
15 nov. 2013 à 13:49
je l'ai essayé mais j'ai planté le fichier -_-
0
f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 1 701
15 nov. 2013 à 14:16
Bonjour,

Desole...

Mais est-ce que le principe est bon ??? Pour reduire le temps d'execution, il faut quelque chose qui indique que la prochaine boucle debutera a telle ligne
0
Ecam39 Messages postés 286 Date d'inscription jeudi 12 janvier 2012 Statut Membre Dernière intervention 16 mars 2024 9
15 nov. 2013 à 15:21
Je pense que ta solution est juste, c'est moi qui n'est pas tout mis (je ne maîtrise pas encore très bien le vba).

Le quelque chose qu'il faut donner, je ne sais pas du tout ce que je dois mettre. Peut être les coordonnées où se trouve la souris ?
0
f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 1 701
Modifié par f894009 le 15/11/2013 à 15:56
Re,

Coordonnees souris, pas top, mais un double click sur la cellule de depart pour la boucle, si y a pas d'autre moyen, c'est bon.

code a mettre dans le VBA de la feuille, adaptez la colonne

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)


If Not Application.Intersect(Target, Range("E:E")) Is Nothing Then
Cancel = True
Depart = Target.Row
DerLig = Range("E" & Rows.Count).End(xlUp).Row
For ecart_de_stock = Depart To DerLig
'code de calcul
Next ecart_de_stock
End If

End Sub
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
15 nov. 2013 à 16:01
Bonjour,

Excusez l'incruste.
1000 lignes -> 1 minute...
Comme il s'agit de la copie d'une formule, as tu essayé la méthode AutoFill (recopie de formule) plutôt qu'une boucle?
Un peu comme ceci :

Sub Test()

Dim DrLigColE As Long, DrLigColF As Long

DrLigColE = Range("E" & Rows.Count).End(xlUp).Row
DrLigColF = Range("F" & Rows.Count).End(xlUp).Row
Range("F" & DrLigColF).AutoFill Destination:=Range("F" & DrLigColF & ":F" & DrLigColE), Type:=xlFillDefault
End Sub
0
f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 1 701
15 nov. 2013 à 19:00
Bonjour,

Savons pas si c'est une formule, mais toute solution est intéressante.
0
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
15 nov. 2013 à 20:29
Salut,

Il y a des conditions dans la boucle pour appliquer les formules ...
0
Ecam39 Messages postés 286 Date d'inscription jeudi 12 janvier 2012 Statut Membre Dernière intervention 16 mars 2024 9
16 nov. 2013 à 13:39
Bonjour,

voici ma boucle (avec les conditions de calcul) :

'Dans la boucle, effectuer le calcul selon la condition

If Not IsEmpty(Cells(ecart_de_stock, 5)) Then



'Définir la date du jour pour le nouvel inventaire

If Not IsEmpty(Cells(ecart_de_stock, 3)) And Cells(ecart_de_stock, 1) = "" Then

Cells(ecart_de_stock, 1) = Date

Else



End If



'Définir le mois en fonction de la date de saisie

Cells(ecart_de_stock, 2) = Month(Cells(ecart_de_stock, 1))



'Afficher 0 ou 1 en fonction de l'écart d'emplacement

If Cells(ecart_de_stock, 4) - Cells(ecart_de_stock, 5) = 0 Then

Cells(ecart_de_stock, 6) = 1

Else

Cells(ecart_de_stock, 6) = 0

End If



'Afficher l'ecart des bobines entre le stock physique et informatique, sans signe

Cells(ecart_de_stock, 7) = Abs(Cells(ecart_de_stock, 4) - Cells(ecart_de_stock, 5))



'Calculer un écart avec une division par 0

If Cells(ecart_de_stock, 4) > 0 Then



'Effectuer le calcul en % de l'écart des bobines

Cells(ecart_de_stock, 8) = Abs(1 - (Cells(ecart_de_stock, 7) / Cells(ecart_de_stock, 4)))



Else



'Valeur de 100% par défaut si le stock physique et info sont vides

If Cells(ecart_de_stock, 4) = 0 And Cells(ecart_de_stock, 5) = 0 Then

Cells(ecart_de_stock, 8) = 1



Else

'Valeur de 0% par défaut si il y a un écart entre le st info et physique

If Cells(ecart_de_stock, 4) <> Cells(ecart_de_stock, 5) Then

Cells(ecart_de_stock, 8) = 0



Else

End If

End If

End If



End If
0