[VBA] coder la suppression des doublons

coder la suppression des doublons [VBA] - VB/VBA/VBS - Programmation

Marsh Posté le 04-12-2024 à 11:43:25    

Bonjour,
 
J'essaye de reproduire en VBA la fonction native d'Excel de suppression de doublon.
 
J'ai un tableau de données, avec en-tête sur colonnes A à J dans l'onglet "Données"
Je souhaite que la macro supprime les doublons. 2 lignes sont en doublon quand elles sont strictement identiques.
Mon code est le suivant:  
 

Code :
  1. Sub SupprimerDoublons()
  2.     Dim ws As Worksheet
  3.     Dim lastRow As Long
  4.     Dim rng As Range
  5.    
  6.    
  7.     On Error Resume Next
  8.     Set ws = ThisWorkbook.Sheets("Données" )
  9.     On Error GoTo 0
  10.    
  11.    
  12.     If ws Is Nothing Then
  13.         MsgBox "La feuille 'Données' n'existe pas dans ce classeur.", vbExclamation
  14.         Exit Sub
  15.     End If
  16.    
  17.     lastRow = ws.Cells(ws.Rows.Count, "A" ).End(xlUp).Row
  18.    
  19.     Set rng = ws.Range("A1:J" & lastRow)
  20.    
  21.     rng.RemoveDuplicates Columns:=Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), Header:=xlYes
  22.     MsgBox "Doublons supprimés avec succès!", vbInformation
  23. End Sub


 
A l'exécution, il ne détecte pas l'onglet "données", considérant qu'il est inexistant dans le classeur.
Je ne comprends pas pourquoi. Une idée?
 
Cela fonctionne si je remplace simplement les lignes 7 à 9 par:

Code :
  1. Set ws = ActiveSheet


 
Ce qui m'intrigue encore plus.
Je tiens à ne pas être obligé de me positionner sur l'onglet Données pour que ça marche, d'où mon choix de ne pas utiliser activesheet.
 
Merci pour votre aide.

Reply

Marsh Posté le 04-12-2024 à 11:43:25   

Reply

Marsh Posté le 04-12-2024 à 16:15:34    

Salut,
Je viens de tester ton code chez moi, il détecte bien la feuille "Données" si elle existe...
Tu as essayé avec un nom de feuille sans accent pour voir si ton souci ne vient pas de là ?


---------------
J'aime pas Apple...
Reply

Marsh Posté le 04-12-2024 à 16:28:18    

Alkor2001 a écrit :

Salut,
Je viens de tester ton code chez moi, il détecte bien la feuille "Données" si elle existe...
Tu as essayé avec un nom de feuille sans accent pour voir si ton souci ne vient pas de là ?

 

Merci pour ton retour

 

Oui c'est un des 1ers test que j'ai fait, et cela ne vient pas de là :(

 

https://rehost.diberie.com/Picture/Get/f/332788

 

En tt cas ton message me rassure car au moins le code semble bon.

  


Message édité par paul30 le 04-12-2024 à 16:29:31
Reply

Marsh Posté le 04-12-2024 à 17:00:32    

je vais essayer demain dans un autre environnement de travail pour voir si ça fonctionne

Reply

Marsh Posté le 04-12-2024 à 17:02:07    

Bizarre...
 
Un point de détail :  dans ton code il y a un espace en trop entre la guillemet et la fin de parenthèse dans cette ligne :

Code :
  1. Set ws = ThisWorkbook.Sheets("Données" )


 
Mon Excel le supprime automatiquement, ce n'est pas le cas chez toi ?
 
D'autre part ça fait pareil si tu remplaces cette ligne par  

Code :
  1. Set ws = Sheets("Données" )


?
 
Edit : Si ça ne change rien, je commencerais par essayer de lancer le code suivant pour voir ce que ça donne :

Code :
  1. Sub SupprimerDoublons()
  2.     Dim ws As Worksheet
  3.  
  4.     Set ws = Sheets("Données" )
  5.  
  6.     If ws Is Nothing Then
  7.         MsgBox "La feuille 'Données' n'existe pas dans ce classeur.", vbExclamation
  8.         Exit Sub
  9.     End If
  10.  
  11.     MsgBox "Doublons supprimés avec succès!", vbInformation
  12. End Sub

Message cité 1 fois
Message édité par Alkor2001 le 04-12-2024 à 17:05:23

---------------
J'aime pas Apple...
Reply

Marsh Posté le 04-12-2024 à 17:22:33    

Alkor2001 a écrit :

Un point de détail :  dans ton code il y a un espace en trop entre la guillemet et la fin de parenthèse dans cette ligne :

Il me semble que c'est le forum qui fait ça?
 
Sinon perso j'aurais dit soucis d'encodage aussi, mais j'y connais rien à Excel. :o


---------------
matos à vendre
Reply

Marsh Posté le 04-12-2024 à 17:35:14    

rat de combat a écrit :

Il me semble que c'est le forum qui fait ça?
 
Sinon perso j'aurais dit soucis d'encodage aussi, mais j'y connais rien à Excel. :o


 
Ah oui bien vu ! Ca a fait pareil sur mon code...


---------------
J'aime pas Apple...
Reply

Marsh Posté le 07-12-2024 à 11:15:42    

Bon et bien chez moi, ça fonctionne.
 
Au bureau, ça ne fonctionne pas. Je ne saurais l'expliquer...
 
Mais au moins je suis fixé, le code est bon.
 
Merci à vous

Reply

Marsh Posté le 07-12-2024 à 16:32:32    

Version Excel différente?
 
Restriction de l'usage du VBA par le service IT de ta boîte?


---------------
matos à vendre
Reply

Marsh Posté le 07-12-2024 à 22:06:24    

rat de combat a écrit :

Version Excel différente?
 
Restriction de l'usage du VBA par le service IT de ta boîte?


 
je sais pas trop, j'ai d'autres macros qui marche parfaitement bien donc... :sarcastic:

Reply

Marsh Posté le 07-12-2024 à 22:06:24   

Reply

Marsh Posté le 09-12-2024 à 15:31:23    

 Bonjour,
 
 si le code est contenu dans le classeur de la feuille "Données" alors utilisez le CodeName de la feuille :
 le code fonctionnera toujours même si la feuille est renommée !
 
 Ou mieux : incorporer directement la procédure VBA dans le module de la feuille ainsi pas besoin de la référencer
 et alors une unique ligne de code est nécessaire, donc sans variable objet superflue :
 
 UsedRange.RemoveDuplicates Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), 1 si la feuille est intelligemment organisée (1)
 
 Et si la procédure n'est pas hébergée dans le module de la feuille mais bien située dans le classeur de la feuille alors
 il suffit de précéder UsedRange par le CodeName de la feuille suivi d'un point sinon par un classique référencement via Sheets ou Worksheets.
 
 Donc pour supprimer les doublons quelle que soit la configuration une unique ligne de code est nécessaire !
 (En référence au code du post initial les lignes n° 2 à 23 sont donc inutiles.)
 
 (1) Sinon remplacer UsedRange par une cellule de référence du genre [A1].CurrentRegion, tout étant déjà expliqué dans l'aide VBA …
 
 

paul30 a écrit :

Je ne comprends pas pourquoi. Une idée?

              Evidemment : la feuille ne s'appelle tout simplement pas "Données" (car "Données" n'est pas "Données " par exemple)
              ou elle n'est pas dans le classeur contenant le code, référencé par ThisWorkbook

Message cité 1 fois
Message édité par Marc L le 09-12-2024 à 17:44:24
Reply

Marsh Posté le 16-12-2024 à 08:35:20    

Marc L a écrit :

 Bonjour,

 

 si le code est contenu dans le classeur de la feuille "Données" alors utilisez le CodeName de la feuille :
 le code fonctionnera toujours même si la feuille est renommée !

 

 Ou mieux : incorporer directement la procédure VBA dans le module de la feuille ainsi pas besoin de la référencer
 et alors une unique ligne de code est nécessaire, donc sans variable objet superflue :

 

 UsedRange.RemoveDuplicates Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), 1 si la feuille est intelligemment organisée (1)

 

 Et si la procédure n'est pas hébergée dans le module de la feuille mais bien située dans le classeur de la feuille alors
 il suffit de précéder UsedRange par le CodeName de la feuille suivi d'un point sinon par un classique référencement via Sheets ou Worksheets.

 

 Donc pour supprimer les doublons quelle que soit la configuration une unique ligne de code est nécessaire !
 (En référence au code du post initial les lignes n° 2 à 23 sont donc inutiles.)

 

 (1) Sinon remplacer UsedRange par une cellule de référence du genre [A1].CurrentRegion, tout étant déjà expliqué dans l'aide VBA …

 



 
Marc L a écrit :

              Evidemment : la feuille ne s'appelle tout simplement pas "Données" (car "Données" n'est pas "Données " par exemple)
              ou elle n'est pas dans le classeur contenant le code, référencé par ThisWorkbook

 

bonjour,

 

merci pour ton message, mais comme expliqué plus haut, avec capture d'écran à l'appui, vérifier l'orthographe de la feuille est la 1ère chose que j'ai faite. Et celle-ci n'est pas en cause.


Message édité par paul30 le 16-12-2024 à 08:36:08
Reply

Marsh Posté le 16-12-2024 à 09:58:30    

mon code est enregistré dans le classeur de macros personnelle (personal.xlsb) --> fonctionne pas.
Je viens de tester en l'écrivant directement dans mon fichier dédié et là ça fonctionne.
Je ne sais pas pourquoi

Reply

Marsh Posté le 16-12-2024 à 10:44:33    

 
 Comme évoqué précédemment l'erreur est d'utiliser ThisWorkbook alors que la procédure est située dans le classeur de macros personnelles !
 
 Donc si besoin de référencer un classeur utiliser alors ActiveWorkbook par exemple, une seule ligne de code étant nécessaire …


Message édité par Marc L le 16-12-2024 à 11:01:23
Reply

Marsh Posté le 16-12-2024 à 11:11:18    

effectivement c'était ça. Merci pour l'aide.

Reply

Marsh Posté le 16-12-2024 à 12:52:41    

Perso, j'utilise cette façon pour appeler un onglet : Application.Worksheets("Données" )


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 17-12-2024 à 17:21:13    

 
 Oui  Application ou ActiveWorkbook, du pareil au même … Moins de lettres à taper certes avec Application pour les plus fénéants !
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed