XL 2019 calculer plus vite avec un array/dico ?

Sheldor

XLDnaute Occasionnel
Bonjour à tous et merci pour ce forum,

j'ai un script pour comparer des données qui fonctionnent bien (bouton "brut de fonderie sans array") mais il y a tellement de calculs à faire que ça prend plus de 10 minutes à faire tourner...
Si quelqu'un pouvait me mettre sur la piste pour refaire mon script avec des array ou dico je me lance dans cet outils incroyablement fabuleux...

mille merci beaucoup
nico
 

Pièces jointes

  • prototype_verif_data.xlsm
    33.8 KB · Affichages: 18
Solution
sans convertion du tableau
j'ai viré ton code bouton2 et je l'ai refait au propre
VB:
Sub Bouton2_Cliquer()
    t = Timer

    'je récupère ce qu'il faut faire dans la feuille instruction
    With Application: .ScreenUpdating = False: .Calculation = xlManual: .EnableEvents = False: End With


    Dim tablo(), tablo2(), A&, I&

    With Sheets("instruction")
        ligne_instruction = 2
        champ_a = .Cells(ligne_instruction, 1)
        operateur = .Cells(ligne_instruction, 2)
        champ_b = .Cells(ligne_instruction, 3)
    End With

    With Sheets("data")
        'je cherche où se trouve ces champs dans la ligne 10 qui contient les entêtes
        col_1 = .Range("C10:Q10").Find(champ_a, LookAt:=xlWhole).Column
        col_2 =...

Sheldor

XLDnaute Occasionnel
bonjour Phil66970,
merci beaucoup, au temps pour moi j'ai oublié, en simplifiant mon fichier pour faire un exemple, d'ajouter cette ligne
'With Application: .ScreenUpdating = False: .Calculation = xlManual: .EnableEvents = False: End With

mon calcul prend plus de 10 minutes avec cette ligne
nico
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour à tous :),

Le tableau source de la feuille "data" a été converti en tableau structuré (nommée tData).
Pour le même prix, je vous ai mis trois arrays dans le code de la macro :p .
Avant de lancer les macros, il faut initialiser le tableau source avec le bouton le plus à droite.

Le code est dans module => Sub Filtrer()
 

Pièces jointes

  • Sheldor- prototype_verif_data- v1.xlsm
    32.8 KB · Affichages: 7

patricktoulon

XLDnaute Barbatruc
sans convertion du tableau
j'ai viré ton code bouton2 et je l'ai refait au propre
VB:
Sub Bouton2_Cliquer()
    t = Timer

    'je récupère ce qu'il faut faire dans la feuille instruction
    With Application: .ScreenUpdating = False: .Calculation = xlManual: .EnableEvents = False: End With


    Dim tablo(), tablo2(), A&, I&

    With Sheets("instruction")
        ligne_instruction = 2
        champ_a = .Cells(ligne_instruction, 1)
        operateur = .Cells(ligne_instruction, 2)
        champ_b = .Cells(ligne_instruction, 3)
    End With

    With Sheets("data")
        'je cherche où se trouve ces champs dans la ligne 10 qui contient les entêtes
        col_1 = .Range("C10:Q10").Find(champ_a, LookAt:=xlWhole).Column
        col_2 = .Range("C10:Q10").Find(champ_b, LookAt:=xlWhole).Column
        'on recupère le tableau complet dans la variable tablo
        tablo = .Range(.Cells(11, col_1), .Cells(Rows.Count, col_2).End(xlUp)).Value
    End With



    'je passe en revue les données dans la variable tableau et si la condition est bonne
    'je stocke l'information dans une nouvelle ligne du tablo2
    ReDim tablo2(1 To UBound(tablo), 1 To 3)
    For I = 1 To UBound(tablo)
        If tablo(I, col_1 - (col_1 - 1)) > tablo(I, col_2 - (col_1 - 1)) Then
            A = A + 1
            tablo2(A, 1) = Now
            tablo2(A, 2) = I + 10
            tablo2(A, 3) = champ_a & " " & operateur & " " & champ_b
        End If
    Next

    'et enfin on colle le tablo2 dans la feulle resultat
    With Sheets("resultat")
        .Cells.ClearContents
        .Select
      if A > 0 then  .Cells(1, 1).Resize(A, 3) = tablo2
    End With
   
     Cells(1, 7) = Timer - t
End Sub
 

Sheldor

XLDnaute Occasionnel
Re-bonjour,
merci encore à vous deux.
J'aurais une question sur l'option de Patricktoulon, dans l'idée où je vais faire tourner plein de vérifs (la table instructions contiendra plein d'items) est-ce qu'il est plus rentable de charger en tableau seulement les colonnes dont j'ai besoin et pour la vérif suivante refaire un autre tableau etc ou charger une seule fois tout le jeu de données dans un tableau puis de faire tourner les vérifs en allant chercher quelle colonne est concernée dans ce grand tableau....

bonne après midi
 

patricktoulon

XLDnaute Barbatruc
Re-bonjour,
merci encore à vous deux.
J'aurais une question sur l'option de Patricktoulon, dans l'idée où je vais faire tourner plein de vérifs (la table instructions contiendra plein d'items) est-ce qu'il est plus rentable de charger en tableau seulement les colonnes dont j'ai besoin et pour la vérif suivante refaire un autre tableau etc ou charger une seule fois tout le jeu de données dans un tableau puis de faire tourner les vérifs en allant chercher quelle colonne est concernée dans ce grand tableau....

bonne après midi
la reponse est dans la question ;)
puisque de toute manieres tu a 2 cellule pour selectionner les champs donc il y recherche de colonne de champs
conclusion; je le redis la reponse est dns la question
 

Statistiques des forums

Discussions
315 098
Messages
2 116 190
Membres
112 679
dernier inscrit
Yupanki