Petite question par rapport à ma boucle loop
Bonjour à tous,
j'aimerai vous demander votre aide et expertise par rapport à ma boucle jointe ci-dessous.
La boucle tourne bien mais je n'ai pas de résultat qui est écrit dans la colonne demandée (cfr dernière ligne de code).
les indices des colonnes sont bien corrects, il y a juste que certaines tables ont des cellules vides. Est-ce que ça pourrait donner des problèmes selon vous?
et est-ce que les variables peuvent changer de valeur en continu? il y aurait-il un soucis à ce niveau?
Un grand merci pour toute aide :)
VBAment vôtre,
Jean
ps: je préfère ne pas poster le fichier excel car il est confidentiel (professionnel)
Sub Match()
Application.ScreenUpdating = False 'Pour augmenter la rapidit? du code (pas de va et viens entre les feuilles)
Dim issf As String 'ss-famille dans la feuilles des t?ches de maintenance MasterDATA
Dim isht As String 'short text dans MasterDATA
Dim idsc As String 'description dans MasterDATA
Dim ilgt As String 'long text dans MasterDATA
Dim xssf As String 'ss-famille dans la feuille des Elements EHS
Dim xehs As String '?quipements critiques dans la feuille des Elements EHS
Dim i As Long 'Loop
Dim x As Integer 'Loop
For i = 2 To 192290
Sheets("MasterDATA").Activate
issf = Cells(i, 36).Value 'Match Sous-famille
isht = Cells(i, 84).Value 'Match Short text
idsc = Cells(i, 87).Value 'Match Description
ilgt = Cells(i, 91).Value 'Match Long text
For x = 2 To 369
Sheets("Elements EHS").Activate
xssf = Cells(x, 3).Value 'ss-famille dans EHS
xehs = Cells(x, 4).Value '?l?ments critiques dans feuille Elements EHS
If issf = xssf Then 'comparaison des sous-familles, si OK
If isht = xehs Or idsc = xehs Or ilgt = xehs Then 'comparaison des Match t?ches avec l'?l?ment critique EHS
Sheets("MasterDATA").Activate
Cells(i, 92).Value = xehs
End If
End If
Next x
Next i
Application.ScreenUpdating = True
End Sub- Messages
- 2'417
- Excel
- 2019
- Inscrit
- 13/07/2017
- Emploi
- Formateur, animateur,tech.informatique
Bonjour toutes et tous
ah tout hasard en inversant les deux derniers next x et next i en mettant
'--...
Next i
Next x
'---...ou le next i est à mettre beaucoup plus haut (au-dessus) For x = 2 To 369
Edit: coucou curulis57 -;)
crdlt,
André
Salut Jean,
à priori, je ne vois pas d'erreur...
Petite réécriture...
Set sWkDATA = Sheets("MasterDATA")
Set sWkEHS = Sheets("Elements EHS")
With sWkDATA
For i = 2 To 192290
issf = .Cells(i, 36) 'Match Sous-famille
isht = .Cells(i, 84) 'Match Short text
idsc = .Cells(i, 87) 'Match Description
ilgt = .Cells(i, 91) 'Match Long text
'
For x = 2 To 369
xssf = sWkEHS.Cells(x, 3) 'ss-famille dans EHS
xehs = sWkEHS.Cells(x, 4) '?l?ments critiques dans feuille Elements EHS
'comparaison des sous-familles, si OK
'comparaison des Match t?ches avec l'?l?ment critique EHS
If issf = xssf And (isht = xehs Or idsc = xehs Or ilgt = xehs) Then .Cells(i, 92) = xehs
Next
'
Next
End WithUn fichier anonyme avec des données bidon, histoire d'avoir du concret dans les mains ?
A+
Bonjour …
Avec tant de lignes, sans passer par un tabeau (VBA), tu peux attendre, attendre …
Avec une formule cela risque d’être moins long donc à tester dans la fenêtre des codes de FM*
Private Sub Worksheet_Activate()
Dim L As Long
[CN:CN] = ""
L = Cells(Rows.Count, 36).End(xlUp).Row
[CN2].Resize(L - 1).FormulaR1C1 = _
"=IF(AND(RC[-56]=FE!RC[-89],OR(RC[-8]=FE!RC[-88],RC[-5]=FE!RC[-88],RC[-1]=FE!RC[-88])),FE!RC[-88],"""")"
End SubNota : Une fois lancée, en activant l'onglet, on pourra lire les formules. Je les ai gardées pour des changements directes dans cette feuille.
* avec l’habitude de prendre des noms courts, j’ai renommé les feuilles FE puis FM.
Bonjour à tous,
un grand merci pour vos codes optimisés,
Bien compris pour les next que l'on peut écrire de manière plus optimisé thank you:)
J'ai pas mal chipoté hier et finalement le fichier a marché
Dernière question, comment je pourrais faire en sorte d'ajouter la valeur matché au lieu de l'écrire? (cfr dernière ligne, l'écriture du résultat).
Car je me rends compte que si il y a plusieurs match valide par ligne i, ce sera uniquement la dernière qui sera reprise.
est-ce possible d'utiliser la fonction append?
Bon dimanche à tous :)
Bonjour Ordonc,
Merci pour ta proposition de formule, je vais l'étudier et la décomposer.
Effectivement, je laisse tourner mon ordinateur la nuit vu la rapidité / non optimisation de mon code…
Pour revenir à ma dernière question, est-ce que la ligne
Cells(i, 92).Value = Cells(i, 92).Value & xehspourrais fonctionner pour ajouter la valeur de la variable xehs à la cellule, sans écraser une valeur pré existante?
Merci pour vos coups de main ;)
Jean
ou peut être ?
temp = Cells(i, 92)
Cells(i, 92).Value = temp & xehsbtw to curulis: Ce sera pour moi difficile de faire un fake excel, mais en gros c'est confronter une liste d'équipements EHS critiques à une grosse liste de tâches de maintenance.
J'ai utiliser fuzzylookup (une merveille), pour standardiser ces taches au dénomination de la liste EHS, puis si les sous famille sont bien identiques je commence à comparer les éléments EHS et à écrire si il y a un match.
Salut Jean,
Salut Ordonc,
certes, Ordonc a raison : des tableaux s'imposent.
Principes du code suivant, l'ordre de calcul devant encore être débattu, histoire de faciliter la manoeuvre.
- par défaut, je calcule la hauteur des données de 'MasterDATA' en postulant que la colonne [A] est la colonne de référence = lgRow (nb de lignes).!
Si tel n'est pas le cas, soit que ton nb de lignes est fixe (192000), soit que la colonne de référence est autre, il faudra modifier le code !
- tDATA "capte" alors les données MasterDATA, de la colonne 36 [AJ2] à la colonne 91 [CM lgRow]
* tDATA(x,1) = cells(x,36)
* tDATA(x,49) = cells(x,84)
* ...
- tREF sera le réservoir des résultats du calcul en colonne 92 [CN], chaque valeur étant mise à zéro en début de boucle
- tEHS est le tableau des valeurs EHS des colonnes [C:D] et est calculé par défaut de la même manère que tDATA
- les boucles ne lisent alors que des valeurs en RAM, complètent tREF qui est recopié à la fin en [CN].
Á tester, bien sûr, puisque développé à l'aveugle, l'idéal étant de nous fournir un fichier de quelques dizaines de lignes ne comportant QUE les données des colonnes impliquées dans le calcul.
Public Sub Calcul()
'
Dim sWkDATA As Worksheet, sWkEHS As Worksheet
Dim tDATA, tEHS, tREF
Dim lgRow&
'
Set sWkDATA = Sheets("MasterDATA")
Set sWkEHS = Sheets("Elements EHS")
'
'Tableau des valeurs EHS
lgRow = sWkEHS.Range("A" & Rows.Count).End(xlUp).Row - 1
tEHS = .Range("C2").Resize(lgRow, 2).Value
With sWkDATA
'tableau des valeurs DATA
lgRow = .Range("A" & Rows.Count).End(xlUp).Row - 1
tDATA = .Range("AJ2").Resize(lgRow, 56).Value
tREF = .Range("CN2").Resize(lgRow, 1).Value
For x = 1 To UBound(tDATA, 1)
tREF(x, 1) = ""
For y = 1 To UBound(tEHS, 1)
If tDATA(x, 1) = tEHS(y, 1) And (tDATA(x, 49) = tEHS(y, 2) Or tDATA(x, 52) = tEHS(y, 2) Or tDATA(x, 56) = tEHS(y, 2)) Then _
tREF(x, 1) = tREF(x, 1) & IIf(tREF(x, 1) = "", tEHS(y, 2), ";" & tEHS(y, 2))
Next
Next
.Range("CN2").Resize(lgRow, 56).Value = tREF
End With
'
End Sub
A+