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!!!