Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1961 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  [VBA] coder la suppression des doublons

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[VBA] coder la suppression des doublons

n°2486114
paul30
Posté le 04-12-2024 à 11:43:25  profilanswer
 

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.

mood
Publicité
Posté le 04-12-2024 à 11:43:25  profilanswer
 

n°2486134
Alkor2001
Posté le 04-12-2024 à 16:15:34  profilanswer
 

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...
n°2486140
paul30
Posté le 04-12-2024 à 16:28:18  profilanswer
 

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
n°2486152
paul30
Posté le 04-12-2024 à 17:00:32  profilanswer
 

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

n°2486153
Alkor2001
Posté le 04-12-2024 à 17:02:07  profilanswer
 

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...
n°2486154
rat de com​bat
attention rongeur méchant!
Posté le 04-12-2024 à 17:22:33  profilanswer
 

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


---------------
Ne laissez pas mourir vos sujets en cours de route!
n°2486155
Alkor2001
Posté le 04-12-2024 à 17:35:14  profilanswer
 

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...
n°2486296
paul30
Posté le 07-12-2024 à 11:15:42  profilanswer
 

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

n°2486310
rat de com​bat
attention rongeur méchant!
Posté le 07-12-2024 à 16:32:32  profilanswer
 

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


---------------
Ne laissez pas mourir vos sujets en cours de route!
n°2486321
paul30
Posté le 07-12-2024 à 22:06:24  profilanswer
 

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:

mood
Publicité
Posté le 07-12-2024 à 22:06:24  profilanswer
 

n°2486346
Marc L
Posté le 09-12-2024 à 15:31:23  profilanswer
 

 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
n°2486835
paul30
Posté le 16-12-2024 à 08:35:20  profilanswer
 

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
n°2486837
paul30
Posté le 16-12-2024 à 09:58:30  profilanswer
 

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

n°2486846
Marc L
Posté le 16-12-2024 à 10:44:33  profilanswer
 

 
 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
n°2486852
paul30
Posté le 16-12-2024 à 11:11:18  profilanswer
 

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

n°2486862
rufo
Pas me confondre avec Lycos!
Posté le 16-12-2024 à 12:52:41  profilanswer
 

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
n°2486961
Marc L
Posté le 17-12-2024 à 17:21:13  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  [VBA] coder la suppression des doublons

 

Sujets relatifs
Problème de sélection de feuille VBAVBA /Excel emplacements approuvés
VBA word : recopie champs formulaire vers signet (Résolu) VBA Word et suppression de marques de paragraphe (lignes)
coder VACUUM sur BDD PG ?Select dans plusieurs BDD avec UNION - Problème de doublons
Modifier du code source VBA à la voléeVBA Excel : surligner
[VBA] Test cell vide ne fonctionne plus 
Plus de sujets relatifs à : [VBA] coder la suppression des doublons


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)