Optimiser une macro

Résolu
bayedav -  
eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

Je souhaiterai optimiser une macro qui met un peu de temps.
Aujourd'hui je n'ai que 1100 lignes mais j'en aurai plus.

LgMax1 = Range("A" & Rows.Count).End(xlUp).Row
For LgAna = 2 To LgMax1
For LgAnab = 2 To LgMax1
' Un doublon est trouvé dans une ligne
If wsFicAna.Range("D" & LgAna).Value = _
wsFicAna.Range("D" & LgAnab).Value And LgAnab <> LgAna _
And wsFicAna.Range("D" & LgAna).Value <> "" Then

wsFicAna.Range("B" & LgAna).Value = "UP"

Exit For
End If
Next
Next

Merci

7 réponses

  1. WeaponEDGE
     
    Bonjour,

    Essayes cette Macros, elles transfère toutes les données de ton tableau dans une Table Virtuel et traite le tout virtuellement.

    Une fois tout les résultat obtenu

    elle vient agrémenterr ta colonne B sur la feuille

    LgMax1 = Cells(Rows.Count, 1).End(xlUp).Row
    CoMax1 = Cells(1, Columns.Count).End(xlToLeft).Column

    ReDim TBL_Original(LgMax1, ColMax1)

    For i = 2 To LgMax1
    For u = 1 To CoMax1
    TBL_Original(i, u) = wsFicAna.Cells(i, u).Value
    Next u
    Next i

    For LgAna = 2 To LgMax1
    For LgAnab = 2 To LgMax1
    ' Un doublon est trouvé dans une ligne
    If TBL_Original(LgAna, 4) = TBL_Original(LgAnab, 4) _
    And LgAnab <> LgAna _
    And TBL_Original(LgAna, 4) <> "" Then
    TBL_Original(LgAna, 2) = "UP"
    Exit For
    End If
    Next
    Next

    For i = 2 To LgMax1
    wsFicAna.Cells(i, 2).Value = TBL_Original(i, 2)
    Next i
    1
  2. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    Bonjour,

    tu devrais déposer un fichier représentatif avec qcq données.

    Déposer le fichier xls (réduit au nécessaire et anonymisé, avec les explications et éventuellement le résultat attendu) sur cjoint.com et coller ici le lien fourni.

    eric

    0
    1. bayedav
       
      En fait je suis en train de travailler sur un projet de mise à jour de données.

      J'ai :
      - un premier fichier Anlyse_données_V7 en xls avec trois onglets : Accueil, AnalyseData, UpdateData et InsertData.
      - deux listes de données Export_SIG.csv (master : CSV1) et Export_CS.csv (slave : CSV2).

      Le but est :
      - d'ouvrir mon fichier analyse en premier où je vais lancer l'ouverture de mes deux fichiers csv.
      - de faire un mapping des deux fichiers csv
      - de copier toutes les lignes csv1 qui existent mais en doublons ou bien qui n'existent dans csv2 au niveau de l'onglet AnalyseData.
      - de rechercher des doublons dans cet onglet AnalyseData et à chaque fois que je trouve un doublons il me met "UP" de update à la colonne B ou laisser vide si pas de doublon donc à insérer.
      - de recopier les ligne avec "UP" dans l'onglet UpdateData, celles qui sont vides dans InsertData.

      ça fonctionne comme je souhaite. Mais un peu long alors qu'il n'y a que 1100 lignes

      Vous trouverai ci-dessous le lien des fichiers.

      http://cjoint.com/?3Gzm6b9FGIU

      Merci
      0
  3. Gyrus Messages postés 3360 Statut Membre 526
     
    Bonjour,

        Dim Plage As Range, Cel As Range
        Set Plage = wsFicAna.Range("D2:D" & wsFicAna.Range("A" & Rows.Count).End(xlUp).Row)
        Application.ScreenUpdating = False
        For Each Cel In Plage
            If Application.CountIf(Plage, Cel.Value) > 1 And Cel.Value <> "" Then Cel.Offset(0, -2).Value = "UP"
        Next Cel
        Set Plage = Nothing


    A+
    0
  4. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    Bonjour,

    Lire et écrire des cellules est très lent, il faut que tu travailles en mémoire.
    Je n'ai pas trop le temps de faire ton fichier mais je t'ai fait un exemple.
    Si c'est toi qui a fait ton code je ne doute pas que tu comprendras très vite le principe :
    charger dans des variables toutes les données en une lecture, et travailler avec les variables.
    Pareil pour l'écriture : tout écrire en une fois.
    100 fois plus rapide au minimum.
    https://www.cjoint.com/c/CGzoFLCVLSZ

    eric
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. bayedav
     
    Merci à tous je vais tester et je vous tiendrai au courant.
    0
    1. bayedav
       
      Merci encore, ça fonctionne
      0
  7. bayedav
     
    Bonjour,

    Je reviens vers vous pour un petit coup de main.
    Car j'ai réussi à optimiser toutes les autres macro.
    Mais il y'a une que je n'arrive pas à faire. Elle ralentit considérablement le traitement de mes données.

    Merci d'avance

    LgMax = Application.WorksheetFunction.Max(LgLigA, LgLigB)
    CoMax = Cells(1, Columns.Count).End(xlToLeft).Column
    For lgLig = 2 To LgMax
    ' Colonnes : D à AO
    For lgCol = 2 To CoMax
    ' Une différence est trouvée dans une ligne
    If wsFicA.Cells(lgLig, lgCol).Value <> wsFicB.Cells(lgLig, lgCol).Value Then
    ' Affichage du nom du fichier en colonne A
    wsFicAna.Range("A" & lgLigDeb).Value = wbFicA.Name
    ' Copier la ligne du fichier A dans le fichier d'analyse
    wsFicA.Range("A" & lgLig & ":" & "AX" & lgLig).Copy _
    Destination:=wsFicAna.Range("C" & lgLigDeb)

    ' Affichage du nom du fichier en colonne A
    wsFicAna.Range("A" & lgLigDeb + 1).Value = wbFicB.Name
    ' Copier la ligne du fichier B dans le fichier d'analyse
    wsFicB.Range("A" & lgLig & ":" & "AX" & lgLig).Copy _
    Destination:=wsFicAna.Range("C" & lgLigDeb + 1)

    lgLigDeb = lgLigDeb + 2

    Exit For
    End If
    Next lgCol
    Next lgLig
    0
  8. bayedav
     
    Bonjour,

    Y'a-t-il quelqu'un qui pourra m'aider à optimiser cette macro?

    Merci d'avance
    0
    1. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      Bonjour,

      le principe est toujours le même pour accélérer : mettre les données en mémoire.
      eric
      0
    2. bayedav
       
      Bonjour,

      J'ai essayé de mettre les données en mémoire mais ça ne fonctionne pas.
      Je suis débutant en VBA et c'est grace à votre aide que j'ai pu optimiser les autres macros avec l'aide de table en mémoire.
      Mais avec celle-là, je n'arrive pas du tout.

      Help!!
      0
    3. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      sans fichiers réduits à l'essentiel moi non plus.
      eric
      0