Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2019 Augmenter la vitesse de traitement

  • Initiateur de la discussion Initiateur de la discussion Titof06
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Titof06

XLDnaute Occasionnel
Bonjour,

Je vous présente tous mes voeux pour 2026, surtout de Santé.

Je reviens vers vous pour demander si vous auriez une solution pour mon traitement.

Je dois mettre à jour des prix d'articles de fournisseurs.
Vous trouverez un onglet "TARFIS Fournisseur" qui correspond aux nouveaux tarifs.
Vous aurez également un onglet "Source" où se trouve mes informations relatives aux mises à jour.
Vous verrez que je ne mettrai à jour que les lignes dont la colonne "D" n'est pas en "KO" et celles qui seront en "Dif.".

Dans mon exemple, il n'y en a qu'une et le nombre de lignes a été limité.
Mais si je prends les données réelles, j'ai 15 000 lignes dans le "Source" et plus de 150 000 Lignes dans "TARFIS Fournisseur".

J'ai utilisé les fonctions suivantes :

For l = 2 to 15 000 (lignes du "Source")
une condition avec la fonction "Find." pour mettre à jour le nouveau prix
Next l

For Each donn In maplage (Zone de recherche dans les 150 000 lignes)
une condition avec la fonction "Find." pour mettre à jour le nouveau prix
Next donn


Ces 2 type de traitements sont extrêmement longs.


Dans mon exemple joint, j'utilise une "RECHERCHEV" pour définir les articles à mettre à jour, mais en réalité j'utilise la fonction "Find.".


Auriez-vous une solution pour que cela se fasse plus vite, svp ?

Je vous souahite une agréable journée,

Titof06
 

Pièces jointes

Personnellement, pour augmenter la vitesse de traitement, j'utilise en début de procédure les instructions suivantes :

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False

et l'inverse en fin de procédure :

Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
 
Bonjour.
L'accès à une plage d'un nombre quelconque de cellules reste long quand même. Il vaut mieux n'avoir que 3 accès en tout au lieux de quelques milliers pour une seule cellule à chaque fois !
 
Bonsoir à tous 😉,

Avertissement : j'ai survolé ce fil. Donc pas tapez moi, s'il vous plaît, si je suis hors sujet ou redondant 🥺.

C'était juste pour montrer qu'un simple tri des deux bases peut considérablement accélérer la recherche des mises à jour.
On pourrait après l'actualisation (c'est juste un tout petit peu de code en plus) remettre les bases (la source et MAJ) dans leur ordre initial.
Le code est un peu commenté.
Après la mise à jour, les références mises à jour (de la source) et celles ayant servies aux mises jour (MAJ) auront un fond rouge.
La procédure Init n'est là que parce que le fichier avec les bases entières ne peut pas être téléchargé sur XLD car il serait trop volumineux.
  • Procéder d'abord à l'initialisation (source -> 15 000 lignes - MAJ -> 150 000 lignes)
  • Puis à la mise à jour

edit : Bonsoir @bsalv 😃
 

Pièces jointes

Dernière édition:
Bonsoir à tous,

@mapomme la méthode (classique) avec le Dictionary est un peu plus rapide et ne nécessite pas de tri :
VB:
Sub MiseAjour()
Dim temps, fs As Worksheet, fm As Worksheet, tS, tM, d As Object, i&, N&, j&
    temps = Timer
    Application.ScreenUpdating = False
    Set fs = Sheets("Source")                       ' Feuille de la source
    fs.Range("n15").ClearContents                   ' RàZ du compteur d'actualisation
    fs.Columns(1).Interior.ColorIndex = xlColorIndexNone: fs.Range("a1").Interior.Color = vbYellow ' mise en couleur
    tS = fs.Range("A1").CurrentRegion.Columns(1)    ' tableau source
     
    Set fm = Sheets("MAJ Valeurs")                  ' Feuille des  mises à jour
    fm.Columns(1).Interior.ColorIndex = xlColorIndexNone: fm.Range("a1").Interior.Color = vbYellow ' mise en couleur
    tM = fm.Range("A1").CurrentRegion.Columns(1)    ' tableau des mises à jour
 
    Set d = CreateObject("Scripting.Dictionary")
    d.CompareMode = vbTextCompare                   ' la casse est ignorée
   
    For i = 2 To UBound(tS)
        d(tS(i, 1)) = i ' mémorise la ligne
    Next
    For i = 2 To UBound(tM)
        If d.exists(tM(i, 1)) Then
            N = N + 1
            j = d(tM(i, 1))
            fs.Cells(j, 1).Interior.Color = vbRed
            fm.Cells(i, 1).Interior.Color = vbRed
            fs.Cells(j, 2) = fm.Cells(i, 2)
            fs.Cells(j, 5) = fm.Cells(i, 3)
            fs.Cells(j, 9) = fm.Cells(i, 4)
        End If
    Next
 
    fs.Range("n15") = N                             ' on inscrit le nombre d'actualisations faites
    MsgBox Timer - temps
    MsgBox "Mise à jour terminée", vbInformation    ' information de l'utilisateur
End Sub
Edit : notez qu'il ne faut pas de doublons en colonne A de la feuille Source car ils ne seraient pas traités.

A+
 

Pièces jointes

Dernière édition:
Bonsoir @job75😉,

Plus j'avance (en âge), moins j'utilise le dictionary pour des raisons de compatibilité MAC. Mais c'est vrai que c'est en général ce qui est le plus simple comme tu l'as si bien démontré en adaptant le code en peu de lignes👍👍.

Très bonne soirée😃.
 
bonsoir,
pour moi le plus simple pour ce genre de truc c'est encore SQL.

bien sur ça fonctionne pas sur Mac, mais a j'avou mon ignorance je ne sais même pas si les Macintosh disposent d'un bouton marche arrêt.
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…