Boucler un tableau d'une ligne a la ligne précédente

Bonjour a tous, est-ce possible d'employer une boucle FOR NEXT pour verifier toute les lignes d'un tableau, si on débute quelque part a l'intérieur. Par exemple si j'ai un tableau de 20 lignes, et que je veux débuter a la 12 ieme ligne, il faudrait que je termine a la 11 ieme.

Hello CAPUCIN,

c'est sûrement possible mais c'est une manière tordue de programmer, où est l'intérêt?

Salut! je dois trouver les cellules d'une colonne d'un tableau dans un autre tableau, chaque tableau comporte 1500 lignes. Ce qui est pas mal long. Puisque la cellule que je recherche se trouve presque toujours dans la meme zone pour l'autre tableau, ca pourrait racourcir de beaucoup le temps d'exécution si je débute ma boucle dans cette zone.

Pour ne pas faire un truc de tordu, ce genre de chose pourrait répondre à ton besoin?

Dim trouvee As Boolean
trouvee = False
For i = 25 To 9999
    If bidule = machin Then
         trouvee = True : End For
    End If 
Next i
If trouvee = False Then
    For i = 1 To 24
    'si on a trouve la valeur alors trouvee = True
    Next i
End If

Mes boucles font deja la recherche, mais elle cherche toujours de la premiere a la derniere cellule pour chaque cellule de l'autre tableau.

Ta suggestion d'utiliser 2 boucles est surement la plus simple et l'utilisation de la variable "trouvée" , mais la ligne de départ doit etre variable. Exemple, la premiere fois, i=25, la 2ieme fois, i=26 etc...


J'avais pensé a quelque chose du genre:

FOR i= ligne to ligne-1

mais ce genre de boucle ne fera que 2 lignes et non toute les lignes.

Si tu souhaites raccourcir le temps d'exécution, pourquoi ne pas utiliser deux arrays pour stocker tes données?

Dim tableau1 as Variant
Dim tableau2 as Variant

tableau1 = Sheets("Feuil1").Range("A1:A5000")
tableau2 = Sheets("Feuil2").Range("A1:A5000")

EDIT:

Joint un fichier

OUI, j'utilise 2 tableaux: tablo1 et tablo2. On dit que ca sauve pas mal de temps. Encore faut-il que je l'utilise de la bonne facon.

Donc, j'ai défini 2 tableaux et je m'en sert a l'interieur de mes boucles, mais peut etre pas de la meilleur facon.


Voici une partie de mon code:

 For X = 1 To after_1 'pour chacune des 5 cellules suivante de ASS
                                     If (i + X) <= limit1 Then
                                         If tablo1(i + X, 1) > 0 And tablo1(i + X, 1) <> "- - - - - - - - - - - - - - - " And Sheets("ASS").Cells(i + X + 2, 9).Interior.ColorIndex <> 4 Then  's'il y a une mnémonique
                                              For Y = pos To after_2 'pour chacune des 5 cellules suivantes de ASS2
                                                  If (i2 + Y) <= limit2 Then
                                                        If tablo2(i2 + Y, 1) > 0 And tablo2(i2 + Y, 1) <> "- - - - - - - - - - - - - - - " And Sheets("ASS2").Cells(i2 + Y + 2, 9).Interior.ColorIndex <> 22 Then    's'il y a une mnémonique
                                                            If tablo1(i + X, 1) = tablo2(i2 + Y, 1) Then
                                                                   If ordre < Y Then
                                                                        nombre = nombre + 1  'on cumule les cellules identiques trouvées
                                                                        ordre = Y
                                                                        pos = pos + 1
                                                                        GoTo 6
                                                                    Else 'on essai a partir de ASS2, car ordre non valide
                                                                        ordre = 0
                                                                        nombre = 0
                                                                        pos = 1
                                                                        For C = 1 To after_2 'pour chacune des 5 cellules suivante de ASS2
                                                                            If (i2 + C) <= limit2 Then
                                                                                If tablo2(i2 + C, 1) > 0 And tablo2(i2 + C, 1) <> "- - - - - - - - - - - - - - - " And Sheets("ASS2").Cells(i2 + C + 2, 9).Interior.ColorIndex <> 22 Then 's'il y a une mnémonique
                                                                                     For D = pos To after_1 'pour chacune des 5 cellules suivantes de ASS
                                                                                          If (i + D) <= limit1 Then
                                                                                               If tablo1(i + D, 1) > 0 And tablo1(i + D, 1) <> "- - - - - - - - - - - - - - - " And Sheets("ASS").Cells(i + D + 2, 9).Interior.ColorIndex <> 4 Then    's'il y a une mnémonique
                                                                                                   If tablo1(i + D, 1) = tablo2(i2 + C, 1) Then
                                                                                                       If ordre < D Then
                                                                                                           nombre = nombre + 1  'on cumule les cellules identiques trouvées
                                                                                                           ordre = D
                                                                                                           pos = pos + 1
                                                                                                           GoTo 5
                                                                                                        Else
                                                                                                           nombre = 0 'on remet 0 car l'ordre permet de dire que ce n'est pas la mnémonique en ASS2 n'est pas valide
                                                                                                           GoTo 7

Bonjour,

pour répondre à la question de départ en une boucle :

Sub test()
    For i = 12 - 1 To (20 + 11) - 1
        Debug.Print (i Mod 20) + 1
    Next i
End Sub

Mais bon, à la reflexion est-ce bien intéressant de rajouter un calcul modulo pour éviter 2 boucles ???

eric

Salut! j'ai essayé et ca marche, je part avec 11 et je me rend a 10.

Il faudrait cependant que tu m'explique ce code! Qu,est-ce qu'un code modulo exactement?

Pour ta question, si j'ai 2 boucle, il faut que je mette tout mon code a l'intérieur de chacune des boucles, donc 2 grosses boucles.

Bonjour,

Pour ta question, si j'ai 2 boucle, il faut que je mette tout mon code a l'intérieur de chacune des boucles, donc 2 grosses boucles.

Tu peux aussi faire une procédure que tu appelles dans les 2 boucles, en lui passant éventuellement les variables dont elle a besoin.

Le modulo est le reste de la division des 2 nombres. Donc 21 mod 20 donne 1

Mais ça se trouve facilement sur google

Comme la fonction Mod est un peu buguée en vba, fait plutôt avec son calcul :

For i = 12 - 1 To (20 + 11) - 1

j = i - Int(i / 20) * 20 + 1

eric

Bonne idée d'apeler une procédure.

Ca fonctionne! par contre j'ai du mettre "-2" afin d'avoir 10 a 9, sais-tu pourquoi?

 Sub test2()
Dim i2 As Integer
Dim derniere_ligne As Integer
Dim j As Integer
Dim i As Integer
'i2=ligne courante
i2 = 10
derniere_ligne = 18

For i = i2 - 1 To (derniere_ligne + i2) - 2
j = i - Int(i / derniere_ligne) * derniere_ligne + 1
Debug.Print j
Next i
End Sub

Bonjour,

Ta boucle d'origine :

For i = 1 to 20 qu'on va noter For i= inf to sup

que tu veux démarrer à n1=12 et donc finir à n2=n1-1=11

For i = 12 - 1 To (20 + 11) - 1

correspond donc à :

For i = n1 - 1 To (sup + n2) - 1

Toi tu as fait n2=n1 et non n2=n1 - 1

Que tu as dû compenser ensuite. Je n'avais décomposé les bornes que pour faciliter la compréhension, laisse le calcul final dans le For.

eric

Je comprend. Par contre pourquoi le -1 de chaque coté?

For i = 12 - 1 To (20 + 11) - 1

Par que ta boucle démarre à 1 mais le modulo à 0 (20 Modulo 10 =0, reste de la division)

J'ai implanter cette boucle dans mon sub et j'ai coupé de moitié le temps d'exécution!

Merci a vous deux!!!

Rechercher des sujets similaires à "boucler tableau ligne precedente"