Je n'arrive pas à avoir le bon code

Résolu
Momo -  
Momo2292 Messages postés 4 Date d'inscription   Statut Membre Dernière intervention   -
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
A voir également:

3 réponses

jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
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
Momo2292 Messages postés 4 Date d'inscription   Statut Membre Dernière intervention  
 
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
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
Je n'avais pas vu que tes boucles n"étaient pas complètes....
Donc :
Derniere_Ligne = Cells.Find("*", Range("A1"), , , xlByRows, xlPrevious).Row
0
Momo2292 Messages postés 4 Date d'inscription   Statut Membre Dernière intervention  
 
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
pilas31 Messages postés 1825 Date d'inscription   Statut Contributeur Dernière intervention   646
 
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
Momo2292 Messages postés 4 Date d'inscription   Statut Membre Dernière intervention  
 
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
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > Momo2292 Messages postés 4 Date d'inscription   Statut Membre Dernière intervention  
 
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
Momo2292 Messages postés 4 Date d'inscription   Statut Membre Dernière intervention  
 
mercii
0