Problème pour supprimer des lignes dans Excel

Fermé
mouchadawa Messages postés 2 Date d'inscription jeudi 25 novembre 2010 Statut Membre Dernière intervention 25 novembre 2010 - 25 nov. 2010 à 14:03
 Utilisateur anonyme - 26 nov. 2010 à 15:49
Bonjour,

Je travaille dans une agence de voyage, et j'ai un fichier excel qui sert de base de données clients à traiter.
Dans ce fichier, chaque client a une ligne, avec une cellule pour son nom, son prénom, son adresse, etc., et une pour leur dernière destination. Le problème de cette dernière cellule, c'est qu'elle est souvent mal remplie (parfois on a la ville, parfois le pays, parfois les deux, etc.) Toutes les destinations sont dans une seule et même colonne, la colonne C.

exemple :
- Grèce
- Mykonos, Grèce
- Chine, Shangai
- Alger
- ...


Mon problème est que je dois envoyer une offre promotionnelle à toutes les personnes qui ont fait leur dernier voyage en Asie. Par conséquent, il faut que je retire de mon fichier tous ceux qui sont partis en Europe, en Afrique, etc.

Aussi, est ce que quelqu'un aurait la gentillesse de m'aider à faire un programme VBA du style (imaginons qu'on ait un tableau de 100 clients, donc 100 lignes) :

Ci = cellule Ci
Li = ligne i
i = integer


For i=1 to 100 do

If (inside Ci on a le mot "Grèce" ou "Alger" ou "Mykonos" ou "...") then delete Li


Comme ca, ca supprime les lignes qui comportent les destinations qui ne m'intéressent pas ! Et j'ai un fichier "nettoyé" avec juste les lignes des prospects que je vise :)

J'espère que mon explication est assez claire, et merci par avance pour votre aide !! :) :) :)


A voir également:

6 réponses

daniel-Henri Messages postés 11 Date d'inscription jeudi 25 novembre 2010 Statut Membre Dernière intervention 25 novembre 2010
25 nov. 2010 à 15:32
J'ai eu à faire à ce type de problème. Sélectionner une catégorie de personnes pour "agir". Mon procédé est de trier le fichier sur le critère approprié (après avoir fait une copie dans une autre feuille par sécurité). Puis éliminer les personnes ne répondant pas aux critères. Ainsi on peut traiter les personnes concernées.
J'espère que cette solution t'apportera un +.
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 311
25 nov. 2010 à 16:26
Bonjour,

Et en récompense, o, aura un voyage gratuit ? lol

Sub virer_clients()
cptr = 2
Do Until IsEmpty(Cells(cptr, 3))
    ref = Cells(cptr, 3)
    choix = MsgBox(" destination: " & ref & " à supprimer ?", vbYesNo)
    If choix = vbYes Then
        nbre = Application.CountIf(Range("C2:C100"), "*" & ref & "*")
        lig = 1
        For cptr2 = 1 To nbre
            lig = Columns(3).Find(ref, Cells(lig, 3), xlValues, xlPart).Row
            Rows(lig).Delete
        Next
    End If
cptr = cptr + 1
Loop

End Sub


la macro parcourt la colonne c et te demande si on supprime la destination. si oui
toutes les lignes comportant le mot sont supprimer. par ex:Grèce supprimée ==> Delos, Grèce supprimée; Grèce,delphes supprimé
0
mouchadawa Messages postés 2 Date d'inscription jeudi 25 novembre 2010 Statut Membre Dernière intervention 25 novembre 2010
25 nov. 2010 à 19:21
Bonjour Michel, bonjour à tous,

Merci mille fois d'avoir répondu à ma question :)
Je voudrais bien lancer la procédure, mais sur un fichier de 2000 lignes clients duquel je veux enlever ceux qui ont fait leur dernier voyage en Grèce, en Espagne et en Allemagne par exemple, j'aurai un code du type :

Sub virer_clients()
cptr = 2
Do Until IsEmpty(Cells(cptr, 3))
ref = Cells(cptr, 3)
choix = MsgBox(" GRECE: "+ "ESPAGNE:"+ "ALLEMAGNE:" & ref & " à supprimer ?", vbYesNo)
If choix = vbYes Then
nbre = Application.CountIf(Range("C1:C2000"), "*" & ref & "*")
lig = 1
For cptr2 = 1 To nbre
lig = Columns(3).Find(ref, Cells(lig, 3), xlValues, xlPart).Row
Rows(lig).Delete
Next
End If
cptr = cptr + 1
Loop

End Sub


Je ne suis pas trop sûr du " GRECE: "+ "ESPAGNE:"+ "ALLEMAGNE:" ;-))))


Pouvez-vous me dire où je dois mettre ces villes dans le code? Je suis vraiment désolé, je n'y connais rien en VBA, mais à ce qui parait quelques lignes de codes peuvent me changer la vie...
Merci d'avance, c'est vraiment top qu'il y ait des gens comme vous sur le site!!!! =)
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 311
26 nov. 2010 à 09:53
Bonjour,

En Excel, On ne réagit pas pareil entre 100 lignes et 2000 lignes !!! :-)

c'est possible avec dans le msgbox on écrit GRECE+ESPAGNE+ALLEMAGNE:"

tu dis si tu veux que je propose autre chose car il y a d'autres propositions qui ont été formulées...

dans l'attente
cordialement
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 311
26 nov. 2010 à 14:01
Apparemment, les propositions de mes petits camarades ne fonctionnent qu'avec une seule destnation
donc
Sub supprimer_destination()
Dim derlig As Integer, choix As String
Dim separ, cptr0 As Byte, ref As String
Dim nbre As Integer, lig As Integer, cptr1 As Integer, lignes As String


    derlig = Cells(Cells.Rows.Count, 3).End(xlUp).Row
    choix = InputBox("Indiquer les pays à supprimer séparés par un signe+" _
                                    & vbLf & "en tenant compte des orthographes utilisées." _
                                    & vbLf & vbTab & "par ex: Grèce+Grece+GRECE+Suisse")
    If choix = "" Then Exit Sub
    separ = Split(choix, "+")
    
    Application.ScreenUpdating = False
    For cptr0 = 0 To UBound(separ)
        ref = separ(cptr0)
        nbre = Application.CountIf(Range("C2:C" & derlig), "*" & ref & "*")
        lig = 1
        For cptr = 1 To nbre
            lig = Columns(3).Find(ref, Cells(lig, 3), xlValues, xlPart).Row
            Rows(lig).Delete
        Next
    Next
   
End Sub
0
tchernosplif Messages postés 600 Date d'inscription dimanche 8 novembre 2009 Statut Membre Dernière intervention 21 juin 2015 245
25 nov. 2010 à 16:40
voila une approche différente avec la formule cherche.

https://forums.commentcamarche.net/forum/affich-19945907-excel-fonction-recherchev

il ne resterait plus qu'à filtrer la liste.
0
Vaucluse Messages postés 26496 Date d'inscription lundi 23 juillet 2007 Statut Contributeur Dernière intervention 1 avril 2022 6 421
25 nov. 2010 à 19:56
Bonsoir

Autre solution,sans VBA et sans filtrer:

dans votre liste compléte qui commence pour l'exemple sur ligne 2 (ligne 1 interdite)

Pour l'exemple à adapter

en feuille 1 votre liste débute en ligne 2 de A2 à F2000
nommer ce champ : Ex CHAMP
En Y1 hors champ entrez le texte cherché
une colonne hors champ, mettons Z pour l'exemple, sur cette Feuil1!:
=SI(NB.SI(Cellule destination;"*"&Y1&"*")=1;MAX($Z$1:Z1)+1;0)
tirez cette formule sur la hauteur du champ, (attention un Z1 est bloqué avec $$ pas l Nommez ce champ Z2:Z2000: CODE'autre

Edition sur Feuil2
Sur la première cellule en haut à gauche du tableau
=SI(LIGNE(A1)>MAX(CODE);"";INDEX(CHAMP;EQUIV(LIGNE(A1);CODE;0);COLONNE(A$1))
En B1
=SI($A1="";""SI(LIGNE($A1)>MAX(CODE);"";INDEX(CHAMP;EQUIV(LIGNE($A1);CODE;0);COLONNE(B$1))
mettez les blocages $ aux bons endroit
Tirez cette formule sur la largeur nécessaire(F dans l'exemple et sur la hauteur voulue.

Vous aurez dans ce tableau la liste des clients dont une destination correspond au texte entré en Y1



Crdlmnt

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
26 nov. 2010 à 15:35
Bonjour,

Je prends le sujet en cours. J'ai regardé ce qu'avait fait michel_m et je me suis permis en partant de sa structure de modifier son programme.

Je suis parti de l'hypothèse qu'il fallait une feuille supplémentaire dans le fichier Excel dans laquelle on trouverait une colonne A avec les noms des pays et dans la colonne B mettre seulement une croix devant les pays qu'on veut conserver.

ex
A------------------------ B

Allemagne
Autriche
Italie
Chine------------------- x
Japon------------------- x
Honduras
Argentine
etc.

Cette feuille supplémentaire doit avoir comme nom d'onglet Pays.

De cette manière, il n'y a plus besoin de répondre Ok à une Msgbox. La macro traite automatiquement toutes les lignes.

Sub virer_clients()
cptr = 1
Do Until IsEmpty(Sheets("Pays").Cells(cptr, 1))
Aeffacer = Sheets("Pays").Cells(cptr, 2)
If Sheets("Pays").Cells(cptr, 2) = "X" Or Sheets("Pays").Cells(cptr, 2) = "x" Then
ref = Sheets("Pays").Cells(cptr, 1)
Sheets(1).Select 'Les lignes à enlever sont dans la feuille 1
nbre = Application.CountIf(Range("C2:C100"), "*" & ref & "*")
lig = 1
For cptr2 = 1 To nbre
lig = Columns(3).Find(ref, Cells(lig, 3), xlValues, xlPart).Row
Rows(lig).Delete
Next
End If
cptr = cptr + 1
Loop

End Sub



Cordialement Agi67.fr
0
Utilisateur anonyme
26 nov. 2010 à 15:49
Toutes mes excuses pour la réponse que je viens d'apporter. Dans mon explication sur les croix, c'est le contraire qui se passe. Tous les pays avec une croix sont enlevés de la liste.
0