Boucle sur la dernière ligne non vide

Résolu
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

  1. Bonjour,

    Vous pouvez ouvrir une inputbox au debut de votre macro pour entrer le numero de ligne de debut de votre boucle.
    0
    1. 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
      1. 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
        1. 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
      2. 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
        1. 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
          1. 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
            1. Re,

              Presque, relisez la proposition de Polux31 et voyez si cela correspond a votre contexte.
              0
              1. je l'ai essayé mais j'ai planté le fichier -_-
                0
              2. 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
              3. 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
              4. 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
            2. Modérateur
              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
              1. Bonjour,

                Savons pas si c'est une formule, mais toute solution est intéressante.
                0
              2. Salut,

                Il y a des conditions dans la boucle pour appliquer les formules ...
                0
              3. 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