Je n'arrive pas à avoir le bon code

Résolu
Bonjour,

je vous présente mon problème :
je dispose d'un tableau de milliers de lignes variable chaque jour, et un nombre de colonne fixe (11 colonnes) , ci dessous un extrait du tableau.



Je souhaite à la base comparer ligne par ligne (sans tenir compte de la colonne 6), et si 2 lignes sont identiques, une nouvelle condition doit être respectée, que pour cette ligne avec la colonne 11 soit différente du vide , ainsi prendre le chiffre sur la 1ère ligne en colonne 9 et coller sur la 2ème ligne sur la même colonne, et écraser le chiffre sur la 1ère ligne en le remettant à 0.
c'est pour ça j'ai créé manuellement un colonne en premier qui concatène l'ensemble des éléments à comparer que je parcours ligne par ligne pour identifier 2 lignes identiques.
ci dessous mon code qui n'est pas bon et je sollicite votre soutien pour m'aider


Sub Statut()
Dim i As Integer
Dim j As Integer
For i = 1 To 'dernière ligne
For j = 2 To 'dernière ligne
If Cells(i, 1) = Cells(j, 1) Then
While Cells(j, 11) <> " "
Cells(i, 10).Copy
Cells(j, 10).Paste
Cells(i, 10).Value = 0
Wend
End If
Next
Next
End Sub


Merci mille fois de votre aide

3 réponses

  1. Modérateur
    Bonjour,
    Pourquoi mettre un while et non pas un IF comme pour tes autres tests ?

    Sub Statut()
      Dim i As Integer
      Dim j As Integer
      For i = 1 To 'dernière ligne
        For j = 2 To 'dernière ligne
          If Cells(i, 1) = Cells(j, 1) Then
            If Cells(j, 11) <> "" then
              Cells(i, 10).Copy
              Cells(j, 10).Paste
              Cells(i, 10).Value = 0
           End If
          End If
        Next
      Next
    End Sub
    

    Ou directement dans le même if
    Sub Statut()
      Dim i As Integer
      Dim j As Integer
      For i = 1 To 'dernière ligne
        For j = 2 To 'dernière ligne
          If Cells(i, 1) = Cells(j, 1) And Cells(j, 11)<>"" Then
            Cells(i, 10).Copy
             Cells(j, 10).Paste
             Cells(i, 10).Value = 0
          End If
        Next
      Next
    End Sub
    

    1
    1. Merci pour l’astuce oui tu as complètement raison..
      Mais le code ne fonctionne pas, je pense qu'il s'agit d'un problème de fond dans mon code non ? le 'dernière ligne je ne sais pas pointer vers la dernière ligne vu que c'est dynamique, je peux mettre un chiffre énorme ..
      Mais j'imagine qu'il y a quelque chose qui ne marche pas dans le code .. en l'exécutant on m'affiche " propriété ou méthode non généré pas cet objet"
      Merci
      0
      1. Modérateur
        Je n'avais pas vu que tes boucles n"étaient pas complètes....
        Donc :
        Derniere_Ligne = Cells.Find("*", Range("A1"), , , xlByRows, xlPrevious).Row
        
        0
      2. Le code ne fonctionne toujours pas, il m'affiche Erreur 438 , propriété ou méthode non généré pas cet objet


        Sub Statut()
        Dim i As Integer
        Dim j As Integer
        Dim derniere_ligne As Integer
        derniere_ligne = Cells.Find("*", Range("A1"), , , xlByRows, xlPrevious).Row
        For i = 1 To derniere_ligne
        For j = 2 To derniere_ligne
        If Cells(i, 1) = Cells(j, 1) And Cells(j, 11) <> "" Then
        Cells(i, 10).Copy
        Cells(j, 10).Paste
        Cells(i, 10).Value = 0
        End If
        Next
        Next
        End Sub
        0
    2. Contributeur
      Bonjour,

      C'est le copy/paste qui ne marche pas pour les cellules, il faut utiliser des Range. Mais dans ce cas autant faire plus simple :

      Sub Statut()
        Dim i As Integer
        Dim j As Integer
        Dim DerLig As Integer
        DerLig = Cells(Rows.Count, 1).End(xlUp).Row
        For i = 1 To DerLig
          For j = i + 1 To DerLig
            If Cells(i, 1) = Cells(j, 1) And Cells(j, 11) <> "" Then
               Cells(j, 10) = Cells(i, 10)
               Cells(i, 10).Value = 0
            End If
          Next
        Next
      End Sub


      0
      1. Top le code fonctionne !! sauf qu'en fait il faut lancer la macro une seule fois, sinon elle écrase mes chiffres, y a t il un code/moyen pour limiter l'utilisation de la macro qu'une seule fois par jour et par utilisateur ? sinon au moment du lancement de la macro pour la deuxième fois afficher un message d'alerte en disant que la macro a été utilisé une fois
        Merci infiniment
        0
      2. Contributeur
        @Momo2292bonjour, par exemple en mémorisant dans une cellule le moment de la dernière exécution, et ne rien faire si c'est récent.
        0
      3. mercii
        0