Rapidité macro (remplacer for if) Le sujet est résolu

Y compris Power BI, Power Query et toute autre question en lien avec Excel
g
ghorghorbey2
Jeune membre
Jeune membre
Messages : 21
Inscrit le : 2 juin 2016
Version d'Excel : 2013

Message par ghorghorbey2 » 2 juin 2016, 15:30

Bonjour,

J'ai créé un fichier avec pas mal de macro, celles-ci fonctionnent plutôt bien sous Excel 2013 mais le but est d'utiliser le fichier sous Excel 2010, et ces macros sont plutôt lentes sous 2010, et d'ailleurs de plus en plus lente au fur et à mesure de leur utilisation.

Je voudrais donc savoir s'il y'a des méthodes plus rapides que d'autres, notamment pour remplacer des "for for if ... end if next next".

Un exemple d'une boucle dans une de mes macros :
For i = 4 To nb_lignes
    For j = 3 To nb_lignes2
        For k = 2 To 20
            If k = 2 Or k = 7 Or k = 12 Or k = 17 Then
                If Sheets("ABSENTS").Cells(i, 2).Value = Sheets("CADOR").Cells(j, k).Value Then
                Sheets("Ongletcaché").Cells(i, 2).Value = "1"
                Exit For
                End If
            End If
        Next k
        
        If Sheets("ABSENTS").Cells(i, 2).Value = Sheets("CADOR").Cells(j, k).Value Then
        Exit For
        End If
    Next j
Next i
J'ai lu sur des forums que la fonction Match était plus rapide que des for if, sauf que je ne sais pas comment l'utiliser, si qqun pouvait me montrer par exemple comment remplacer mes for if dans mon exemple par des match, cela serait super !

Merci à ceux qui pourront ou du moins qui essayeront de m'aider !
h
h2so4
Passionné d'Excel
Passionné d'Excel
Messages : 9'142
Appréciations reçues : 376
Inscrit le : 16 juin 2013
Version d'Excel : 365 UK Windows 10

Message par h2so4 » 2 juin 2016, 15:46

bonjour,

essaie ceci
For i = 4 To nb_lignes
    Set re = Sheets("cador").Cells.Find(Sheets("absent").Cells(i, 2).Value, lookat:=xlWhole)
    If Not re Is Nothing Then Sheets("Ongletcaché").Cells(i, 2).Value = "1"
Next i
g
ghorghorbey2
Jeune membre
Jeune membre
Messages : 21
Inscrit le : 2 juin 2016
Version d'Excel : 2013

Message par ghorghorbey2 » 2 juin 2016, 16:08

Merci beaucoup, ca semble fonctionner et être plus rapide !!
Le seul problème est qu'il y'a qques condition qui ne sont pas respectées dans ta macro (et c'est normal parce que la mienne en avait beaucoup ^^)

Ce que je voudrais c'est une macro qui cherche les valeurs de la colonne 2 de l'onglet ABSENTS dans les colonnes 2, 7, 12 et 17 de l'onglet CADOR, et qui met un 1 dans les cellules des mêmes lignes que l'onglet ABSENTS, dans l'onglet Ongletcaché, j'espère que je suis clair ^^

Je pense que le problème de ta macro est qu'elle ne cherche pas uniquement dans les colonnes 2, 7, 12 et 17 mais dans tout la feuille CADOR.

Voilà, je pense que le problème vient du lokkat: whole, mais je ne sais pas gérer ca

merci pour ton aide !
h
h2so4
Passionné d'Excel
Passionné d'Excel
Messages : 9'142
Appréciations reçues : 376
Inscrit le : 16 juin 2013
Version d'Excel : 365 UK Windows 10

Message par h2so4 » 2 juin 2016, 16:19

bonjour,

une correction
For i = 4 To 5
 For Each j In Array(2, 4, 12, 17)
    Set re = Sheets("cador").Columns(j).Find(Sheets("absent").Cells(i, 2).Value, lookat:=xlWhole)
    If Not re Is Nothing Then Sheets("Ongletcaché").Cells(i, 2).Value = "1"
    Exit For
 Next
Next i
g
ghorghorbey2
Jeune membre
Jeune membre
Messages : 21
Inscrit le : 2 juin 2016
Version d'Excel : 2013

Message par ghorghorbey2 » 2 juin 2016, 17:23

Super merci beaucoup !!
Répondre Sujet précédentSujet suivant
  • Sujets similaires
    Réponses
    Vues
    Dernier message