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