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

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 With

Un 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 Sub

Nota : 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 & xehs

pourrais 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 & xehs

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

Rechercher des sujets similaires à "petite question rapport boucle loop"