Excel ne répond pas lors d'execution d'une macro

Résolu
Bonjour,

Aidez moi s'il vous plait

J'ai crée une macro sur un fichier Excel qui contient plus que 22000 ligne, la macro s’exécute en mode pas à pas et quand je réduit le nombre de lignes, sinon le fichier excel beug et ne réponds pas.

Pouvez vous m'aider s'il vous plait ?

Voici la Macro
Sub MAJ2()

Dim i As Integer
Dim j As Integer
Dim k As Integer
Dim L As Long

L = Range("A1").End(xlDown).Row + 1

For i = 2 To L
    For j = i + 1 To L + 1
    
        If Sheets("Feuil1").Cells(i, 1) = Sheets("Feuil1").Cells(j, 1) Then
            For k = 2 To 100
                If Sheets("Feuil1").Cells(i, k) <> Sheets("Feuil1").Cells(j, k) Then
                    Sheets("Feuil1").Cells(i, k) = Sheets("Feuil1").Cells(i, k) & "//" & Sheets("Feuil1").Cells(j, k)
                    Sheets("Feuil1").Cells(j, k) = ""
                End If
            Next
        End If
    
    Next

Next


Mercii

Configuration: Windows / Chrome 79.0.3945.117

9 réponses

Résumé de la discussion

Le fil porte sur une macro Excel traitant plus de 22 000 lignes qui s’exécute en mode pas à pas et provoque le plantage du classeur lorsque le jeu de données est trop volumineux. Plusieurs réponses suggèrent de limiter les comparaisons, d’insérer DoEvents après les boucles, ou de trier et regrouper par colonne A pour ne comparer que les lignes pertinentes. D'autres propositions visent à améliorer la performance en vérifiant uniquement les lignes ayant la même valeur en colonne A, ce qui permet d’arrêter la comparaison dès que la valeur change. En cas d’amélioration, certains suggèrent aussi de scinder le fichier ou d’utiliser des méthodes plus performantes que les accès cellule par cellule, comme le traitement par colonnes.

Bobot (l’IA à votre service)
  1. Contributeur
    bonjour, je suggère d'ajouter une ligne
    DoEvents

    après la ligne
    For i = 2 To L
    1. Merci mais ça n'a pas marché
    2. Contributeur
      @Mossaabet en mettant
      doevents
      après la ligne
      for j
      ?
    3. Contributeur
      @Mossaabque se passe-t'il exactement? excel ne répond pas?
    4. @yg_beAU début avant de mettre DoEvents, la phrase Excel ne répond pas s'affiche à coté du titre du fichier, maintenant sa beug sans rien afficher
  2. Comment ça, trier les données ?
    1. Contributeur
      si tu commences par trier les données suivant les valeurs en colonne A, tu peux faire très rapidement le reste du travail.
  3. Le problème c'est qu'on doit comparer toutes les lignes, donc on peut pas faire le trie
    1. Contributeur
      pourquoi le tri va-t'il empêcher de comparer? peux-tu donner un exemple?
  4. Pouvez vous svp me donner un exemple de tri pour savoir dequoi vous parler exactement
    1. Contributeur
      peux-tu partager ton fichier, ou un fichier d'exemple?
  5. Je ne peux pas le partager ici non ?
    1. Contributeur
      pour partager ici un fichier, tu le publies sur internet (google drive, cjoint.com, ...) puis tu partages ici le lien vers le fichier.
    1. Contributeur
      ce que je suggère, c'est que tu sélectionnes toutes tes données, et puis que tu demandes à excel de les trier par ordre croissant de la première colonne.
      ensuite, tu ne devras plus comparer toutes les lignes, il suffira de comparer chaque ligne aux lignes suivantes ayant la même valeur en colonne A.
  6. Mais je compare dèja chaque ligne aux lignes suivantes, j = i+1 toujours
    1. Contributeur
      tu compares à toutes les lignes suivantes, alors que, si tu tries, il suffit de comparer à quelques lignes, celles qui ont la même valeur en colonne A, et tu pourras arrêter dès que la valeur en colonne A change. cela ira beaucoup plus vite.
    2. @yg_beEst ce que tu sais comment changer la couleur du texte d'une cellule (i,k) avec i et k sont les parametres de la macro ?
    3. Contributeur
      @Mossaab95par exemple ainsi:
      Sheets("Feuil1").Cells(i, k).Font.Color = RGB(0, 255, 0)
    4. @yg_beMerci
      J'ai réussi à faire ça
      Un autre problème c'est que sur cette ligne

      Sheets("Feuil1").Cells(i, k) = Sheets("Feuil1").Cells(i, k) & "//" & Sheets("Feuil1").Cells(j, k)

      je veux que les données de Sheets("Feuil1").Cells(j, k) gardent leurs mise en forme (couleur rouge)
      est ce que ceci est possible ?
    5. Contributeur
      @Mossaab95je pense que c'est possible, si tu calcules la position et la longueur des données ajoutées, ainsi (non testé):
      position=len(Sheets("Feuil1").Cells(i, k))+3
      longueur=len(Sheets("Feuil1").Cells(j, k))
      Sheets("Feuil1").Cells(i, k) = Sheets("Feuil1").Cells(i, k) & "//" & Sheets("Feuil1").Cells(j, k)
      Sheets("Feuil1").Cells(i, k).Characters(position, longueur).Font.Color = _
            Sheets("Feuil1").Cells(j, k).Font.Color