[VB pour Excel 2010] Fusion, suppression, doublons,..
Résolu
guigs.pro
-
guigs.pro Messages postés 8 Statut Membre -
guigs.pro Messages postés 8 Statut Membre -
Bonjour,
Je souhaite faire un traitement sur deux fichiers excels.
Le premier consisterait à fusionner les deux fichiers dans un seul dans une feuille.
J'ai donc fait une macro qui (à priori) fonctionne.
Par contre le deuxième intérêt serait de repérer les adresses en double et de les supprimer de ce fichier (donc les supprimer deux fois, pas garder une adresse comme avec l'option "supprimer les doublons").
J'ai donc fait la macro ci-dessous mais je ne comprends pas plusieurs choses :
.
Est-ce que lorsque l'on fait "ActiveCell.EntireRow.Delete", la ligne du dessus est automatiquement sélectionnée puisque l'on a supprimé la ligne ?
Est-ce que "ActiveCell.Select" ou "ActiveCell.Offset(1,0).Select" garde la sélection sur une seule colonne et ne garde pas en mémoire la précédente ?
.
Mon code ne marche pas et je ne comprends pas bien l'erreur.
Voici le code :
.
.
Merci d'avance,
Je souhaite faire un traitement sur deux fichiers excels.
Le premier consisterait à fusionner les deux fichiers dans un seul dans une feuille.
J'ai donc fait une macro qui (à priori) fonctionne.
Par contre le deuxième intérêt serait de repérer les adresses en double et de les supprimer de ce fichier (donc les supprimer deux fois, pas garder une adresse comme avec l'option "supprimer les doublons").
J'ai donc fait la macro ci-dessous mais je ne comprends pas plusieurs choses :
.
Est-ce que lorsque l'on fait "ActiveCell.EntireRow.Delete", la ligne du dessus est automatiquement sélectionnée puisque l'on a supprimé la ligne ?
Est-ce que "ActiveCell.Select" ou "ActiveCell.Offset(1,0).Select" garde la sélection sur une seule colonne et ne garde pas en mémoire la précédente ?
.
Mon code ne marche pas et je ne comprends pas bien l'erreur.
Voici le code :
.
.
Private Sub Workbook_Open()
MaCellule = InputBox("Veuillez saisir l'adresse de la 1ere cellule à comparer") 'récupère l'adresse de la cellule dans une variable MaCellule
Range(MaCellule).Select 'sélectionne la cellule indiquée
ActiveCell.CurrentRegion.Sort Key1:=Range(MaCellule), Order1:=xlAscending, Header:=xlYes 'trie le tableau de cette cellule
i = 0
donnee1 = ActiveCell.Value 'mémorise le contenu de la cellule et l'affecte à donnée 1
donnee2 = ActiveCell.Address 'mémorisation de la première ligne afin de pouvoir y revenir et la supprimer en cas de doublon
ActiveCell.Offset(1, 0).Select
i = i + 1
a = 0
While Not IsEmpty(ActiveCell.Value)
'tant que la cellule n'est pas vide
If (ActiveCell.Value = donnee1) Then
ActiveCell.EntireRow.Delete
'ActiveCell.Delete
a = 0
'Range(ActiveCell).FindPrevious.Select
Range(donnee2).Select
'Do While a < i
'ActiveCell.Offset(-1, 0).Select
'a = a + 1
'Loop
' Je sélectionne la première cellule qui contenait la donnée
ActiveCell.EntireRow.Delete
' commenté ActiveCell.Offset(-1, 0).Select
'remonte d'une ligne
' en commentaires ActiveCell.EntireRow.Delete
' commenté ActiveCell.Offset(1, 0).Select
' Fin ligne ajoutée
i = 0
donnee1 = ActiveCell.Value
donnee2 = ActiveCell.Address
ActiveCell.Offset(1, 0).Select
i = i + 1
' Je descends d'une ligne
ElseIf (ActiveCell.Value = "") And (donnee1 <> "") Then
ActiveCell.Offset(1, 0).Select
i = i + 1
Else
ActiveCell.Offset(1, 0).Select
i = i + 1
End If
Wend
End Sub
Merci d'avance,
A voir également:
- [VB pour Excel 2010] Fusion, suppression, doublons,..
- Forcer suppression fichier - Guide
- Liste déroulante excel - Guide
- Word et excel gratuit - Guide
- Doublons photos - Guide
- Déplacer colonne excel - Guide
7 réponses
Bonjour,
eric
Jamais tu ne répondras à un mp non sollicité...
Bon, ça c'est fait.
Sub suppEmail()
Dim derlig As Long, nb_email, i As Long
Columns("B:B").Insert Shift:=xlToRight
derlig = Cells(Rows.Count, "A").End(xlUp).Row
Application.ScreenUpdating = False
[B2].Resize(derlig - 1, 1).FormulaLocal = "=NB.SI(A:A;A2)"
nb_email = [B1].Resize(derlig, 1)
Columns(2).Delete
For i = UBound(nb_email) To 2 Step -1
If nb_email(i, 1) > 1 Then Rows(i).Delete
Next i
Application.ScreenUpdating = True
End Sub
eric
Jamais tu ne répondras à un mp non sollicité...
Bon, ça c'est fait.
Bonjour,
ton code n'est pas orthodoxe et est difficile à lire, pas indenté, je ne l'ai donc pas trop regardé...
Le principe lorsque tu supprimes des lignes est de faire une boucle à l'envers : démarrer de la dernière ligne et remonter.
Sinon si tu supprimes la ligne 5, la 6 devient la 5 est n'est pas vue si tu n'en tiens pas compte dans ta boucle.
eric
Jamais tu ne répondras à un mp non sollicité...
Bon, ça c'est fait.
ton code n'est pas orthodoxe et est difficile à lire, pas indenté, je ne l'ai donc pas trop regardé...
Le principe lorsque tu supprimes des lignes est de faire une boucle à l'envers : démarrer de la dernière ligne et remonter.
Sinon si tu supprimes la ligne 5, la 6 devient la 5 est n'est pas vue si tu n'en tiens pas compte dans ta boucle.
eric
Jamais tu ne répondras à un mp non sollicité...
Bon, ça c'est fait.
Bonjour,
Merci pour la réponse.
Si je comprends bien, lorsque je fais un ActiveCell.EntireRow.Delete, je n'ai pas besoin de faire le OffSet mais simplement un ActiveCell.Select() pour prendre en compte la ligne du dessous qui est devenu la cellule active ?
Je remets le code un peu mieux organisé.
Désolé, l'indentation n'est pas prise en compte dans les messages de ce forum :/
Merci pour la réponse.
Si je comprends bien, lorsque je fais un ActiveCell.EntireRow.Delete, je n'ai pas besoin de faire le OffSet mais simplement un ActiveCell.Select() pour prendre en compte la ligne du dessous qui est devenu la cellule active ?
Je remets le code un peu mieux organisé.
Désolé, l'indentation n'est pas prise en compte dans les messages de ce forum :/
Private Sub Workbook_Open()
MaCellule = InputBox("Veuillez saisir l'adresse de la 1ere cellule à comparer") 'récupère l'adresse de la cellule dans une variable MaCellule
Range(MaCellule).Select
ActiveCell.CurrentRegion.Sort Key1:=Range(MaCellule), Order1:=xlAscending, Header:=xlYes
i = 0
donnee1 = ActiveCell.Value 'mémorise le contenu de la cellule et l'affecte à donnée 1
donnee2 = ActiveCell.Address 'mémorisation de la première ligne afin de pouvoir y revenir et la supprimer en cas de doublon
ActiveCell.Offset(1, 0).Select
i = i + 1
a = 0
While Not IsEmpty(ActiveCell.Value)
'tant que la cellule n'est pas vide
If (ActiveCell.Value = donnee1) Then
ActiveCell.EntireRow.Delete
a = 0
Range(donnee2).Select
' Je sélectionne la première cellule qui contenait la donnée
ActiveCell.EntireRow.Delete
i = 0
donnee1 = ActiveCell.Value
donnee2 = ActiveCell.Address
ActiveCell.Offset(1, 0).Select
i = i + 1
' Je descends d'une ligne
ElseIf (ActiveCell.Value = "") And (donnee1 <> "") Then
ActiveCell.Offset(1, 0).Select
i = i + 1
Else
ActiveCell.Offset(1, 0).Select
i = i + 1
End If
Wend
End Sub
Ok , le voici : https://www.cjoint.com/?0BfoHzs7btI
Sinon on m'a aussi conseillé d'utiliser "findNext" du coup c'est ce que j'ai fait via ce lien :
https://www.cjoint.com/?0BfoJAnl7iO
Merci pour l'aide et la réactivité
Sinon on m'a aussi conseillé d'utiliser "findNext" du coup c'est ce que j'ai fait via ce lien :
https://www.cjoint.com/?0BfoJAnl7iO
Merci pour l'aide et la réactivité
Finalement quelqu'un m'a aidé sur un autre forum et a résolu le problème de suppression (les adresses en doubles sont supprimées toutes les deux), mais j'ai un nouveau problème, c'est que les adresses uniques sont aussi supprimées et là je sèche :/
Auriez-vous une idée ? Merdi, voici le code :
Auriez-vous une idée ? Merdi, voici le code :
Sub FindNext()
Dim tableau() As Variant
With Worksheets(1).Range("A1").EntireColumn
valeur = Range("A1")
Set c = .Find(valeur, LookIn:=xlValues)
If Not c Is Nothing Then
firstAddress = c.Address
End If
Do
adresse = adresse & c.Address & ","
Set c = .FindNext(c)
Loop While Not c Is Nothing And c.Address <> firstAddress
adresse = Left(adresse, Len(adresse) - 1)
End With
Sheets(1).Range(adresse).EntireRow.Delete
End Sub
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
On va attendre que tu aies la réponse sur l'autre forum.
Ca ne sert à rien d'être plusieurs à chercher la même chose.
eric
Ca ne sert à rien d'être plusieurs à chercher la même chose.
eric
Justement ils n'ont pas la réponse, c'est pour ça que je poste ici.
Comme il n'y a qu'une personne qui répond et qui m'aide sur l'autre forum, peut-être qu'ici avec un regard neuf quelqu'un me dira que qu'en fait c'est tout bête il suffit de rajouter ça ou ça..
Comme il n'y a qu'une personne qui répond et qui m'aide sur l'autre forum, peut-être qu'ici avec un regard neuf quelqu'un me dira que qu'en fait c'est tout bête il suffit de rajouter ça ou ça..
Bonjour,
Merci pour ce code !!!!!
Il fonctionne parfaitement.
Entre temps j'avais aussi trouvé une solution avec le code suivant pour ceux que ça intéresse (néanmoins le code d'eric a l'air de mieux fonctionner puisque le mien gère une seule cellule vide) :
Merci pour ce code !!!!!
Il fonctionne parfaitement.
Entre temps j'avais aussi trouvé une solution avec le code suivant pour ceux que ça intéresse (néanmoins le code d'eric a l'air de mieux fonctionner puisque le mien gère une seule cellule vide) :
Sub FindNext()
Dim tableau() As Variant
With Worksheets(1).Range("A1").EntireColumn
Range("A1").Select
Do
valeur = ActiveCell.Value
Set c = .Find(valeur, LookIn:=xlValues)
If Not c Is Nothing Then
firstaddress = c.Address
End If
Do
Set c = .FindNext(c)
If Not c Is Nothing Then
adresse = adresse & c.Address & ","
End If
Loop While Not c Is Nothing And c.Address <> firstaddress
If adresse <> "" And Len(adresse) > 8 Then
adresse = Left(adresse, Len(adresse) - 1)
'adresse = adresse & Range(firstaddress).Address
.Range(adresse).EntireRow.Delete
adresse = ""
ActiveCell.Offset(1, 0).Select
Else:
adresse = ""
ActiveCell.Offset(1, 0).Select
End If
Loop While ActiveCell.Value <> ""
End With
End Sub