Je n'arrive pas à avoir le bon code

Résolu
Momo -  
Momo2292 Messages postés 4 Statut Membre -
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. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
     
    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
  2. Momo2292 Messages postés 4 Statut Membre
     
    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. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
       
      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. Momo2292 Messages postés 4 Statut Membre
       
      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
  3. pilas31 Messages postés 1878 Statut Contributeur 648
     
    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. Momo2292 Messages postés 4 Statut Membre
       
      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
      1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > Momo2292 Messages postés 4 Statut Membre
         
        bonjour, 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
    2. Momo2292 Messages postés 4 Statut Membre
       
      mercii
      0