Je n'arrive pas à avoir le bon code

Résolu/Fermé
Momo - Modifié le 4 déc. 2018 à 15:07
Momo2292 Messages postés 4 Date d'inscription mardi 4 décembre 2018 Statut Membre Dernière intervention 6 décembre 2018 - 6 déc. 2018 à 09:32
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 38319 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 30 novembre 2024 4 706
4 déc. 2018 à 15:23
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 mardi 4 décembre 2018 Statut Membre Dernière intervention 6 décembre 2018
4 déc. 2018 à 15:31
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 38319 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 30 novembre 2024 4 706
4 déc. 2018 à 16:06
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 mardi 4 décembre 2018 Statut Membre Dernière intervention 6 décembre 2018
4 déc. 2018 à 16:17
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 vendredi 5 septembre 2008 Statut Contributeur Dernière intervention 24 avril 2020 643
Modifié le 4 déc. 2018 à 16:22
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 mardi 4 décembre 2018 Statut Membre Dernière intervention 6 décembre 2018
4 déc. 2018 à 18:08
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 23361 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 29 novembre 2024 1 556 > Momo2292 Messages postés 4 Date d'inscription mardi 4 décembre 2018 Statut Membre Dernière intervention 6 décembre 2018
4 déc. 2018 à 18:15
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 mardi 4 décembre 2018 Statut Membre Dernière intervention 6 décembre 2018
6 déc. 2018 à 09:32
mercii
0