Trop de boucle, comment y palier ?

Bonjour à tous.

je bloque sur un petit programme de traitement de données.

je dispose dans la feuille 3 en Colonne A, d'un certain nombre d'informations.

Ces memes informations sont contenues dans la feuille 2 dans l'une des colonnes nommées BPE+Long.Inter. (ces colonnes sont toutes espacées par interval de 5)

je souhaite rechercher l'intégralité des données de la feuille 3 colonneA dans la feuille 2 colonne BPE+Long.Inter. et extraire pour chacune les valeurs des cellules proches.

Voici le code mis en place, fonctionne partiellement. Le Goto pourrait y pallier mais tourne en permanence.

L'usage des boucles imbriquées les unes dans les autres est une mauvaise solution, mais j'ignore comment procéder autrement.

Auriez vous une solution?

Sub ExportCableID()
Dim CDI As String
Dim PBOrigine As String
Dim Ligne As Long
Dim Compteur As Long
Dim Colonne As Long
Dim Ligne1 As Long

Worksheets(3).Select
'Boucle pour chaque valeur colonne A de la feuille 3
For Ligne1 = 2 To Range("A1", Range("A1").End(xlDown)).Rows.Count
'debut:
    Worksheets(2).Select

'Boucle pour scruter toute les colonnes BPE+Long.inter de la feuille2
    For Colonne = 8 To 80 Step 5

'Boucle pour comparer si le terme de chaque case des colonnes BPE correspondent avec la colonne A Feuille3
        For Ligne = 2 To Range("A1", Range("A1").End(xlDown)).Rows.Count
            If Worksheets(3).Cells(Ligne1, 1) = Mid(Worksheets(2).Cells(Ligne, Colonne), 1, 19) Then
                Worksheets(3).Cells(Ligne1, 7) = Worksheets(2).Cells(Ligne, Colonne).Offset(0, 4)
                Worksheets(3).Cells(Ligne1, 6) = Worksheets(2).Cells(Ligne, Colonne).Offset(0, 5)
                Ligne1 = Ligne1 + 1
                'GoTo debut
            End If
        Next
    Next
Next
End Sub

bonjour,

Feuil2 :

Le fichier joint ne comporte que 54 colonnes mais je suppose que le vrai fichier en comporte au moins 82. C'est exact ?

Le fichier joint ne comporte que 721 lignes. Dans la réalité ce nombre peut-il varier ? Etre plus important ? Donner le nombre maxi svp

Feuil3 :

Le fichier joint ne comporte que 84 lignes. Dans la réalité ce nombre peut-il varier ? Etre plus important ? Donner le nombre maxi svp

A+

Bonjour Galopin.

Le nombre de colonne de ligne peut effectivement varier.

Mais il restera de cette ordre là.

Pour être honette, je n'ai pas fais la démarche de scruter jusqu'à la derniere ligne ou colone.

Si j'ai bien compris...

Cette macro fait (en principe) ce que tu demandes (sur le fichier joint...)

La macro s'adaptera au nombre de lignes et de colonnes

Sub ExportCableID()
Dim i&, iRC&, iRS&, iC%, ArrC, ArrS
iRC = Feuil3.Range("A1").End(xlDown).Row
ArrC = Feuil3.Range("A1:G" & iRC).Value
iRS = Feuil2.Range("A1").End(xlDown).Row
ArrS = Feuil2.Range("A1").CurrentRegion.Value
   For iRC = 2 To UBound(ArrC)
   'Boucle pour scruter toute les colonnes BPE+Long.inter de la feuille2
       For iC = 8 To UBound(ArrS, 2) Step 5
   'Boucle pour comparer si le terme de chaque case des iCs BPE correspondent avec la colonne A Feuille3
           For iRS = 2 To UBound(ArrS)
               If ArrC(iRC, 1) = Left(ArrS(iRS, iC), 19) Then
                   ArrC(iRC, 7) = ArrS(iRS, iC + 4)
                   ArrC(iRC, 6) = ArrS(iRS, iC + 5)
               End If
           Next
       Next
   Next
 Feuil3.Range("A1:G" & UBound(ArrC)) = ArrC
End Sub

Edit : Attention :

Dans ma macro Feuil2 et Feuil3 est le nom des feuilles tel qu'il apparait dans le VBA project. C'est le CodeName des feuilles et non pas le Worksheets.Name !

A+

Merci Galopin pour ton code, (j'ai presque tout compris)

lorsque aRc= "PB-57" , il y a une erreur. sur la deuxieme boucle. (ca fonctionne en supprimant cette ligne

image

Sinon, Je retrouve la même problématique qu'avec mon code, les cases en colonne 6 et 7 ne sont pas toutes remplis.

Selon moi, lorsque la condition If ArrC(iRC, 1) = Left(ArrS(iRS, iC), 19) est réussi, il faudrait réinitialiser la boucle IRS à 2....

C'est ce que j'avais essayé de faire avec le Goto.

Je n'invente rien ! La ligne que tu supprimes est l'équivalent de ton :

Worksheets(3).Cells(Ligne1, 7) = Worksheets(2).Cells(Ligne, Colonne).Offset(0, 4)

!

En modifiant la boucle if :
               If ArrC(iRC, 1) = Left(ArrS(iRS, iC), 19) Then
                   ' ArrC(iRC, 7) = ArrS(iRS, iC + 4)
                   ArrC(iRC, 6) = ArrS(iRS, iC + 5)
                   Exit For
               End If

?

A+

Bonjour Galopin,

Il n'est pas question de supprimer une ligne du code.

C'est la ligne suivante sur la feuille3 qui est problématique.

ANFI-LOIRA05-PB-057 ANFI-LOIRA05-CDI-074-35 T01-H-M01-01 T01-H-M01-06 PB-023

Décommente la ligne...

As-tu testé avec le Exit For ?

Comme je ne comprend rien à la finalité de la macro je ne sais pas dans quelle direction chercher :

Il faut me donner un tableau avec le résultat attendu (au moins pour les 5 ou 6 premières lignes) : J'essaierai d'analyser d’où tu sors ce résultat...

A+

Rechercher des sujets similaires à "trop boucle comment palier"