éclairez ma lanterne!

Signaler
Messages postés
9
Date d'inscription
jeudi 19 mai 2011
Statut
Membre
Dernière intervention
23 mai 2011
-
Messages postés
9
Date d'inscription
jeudi 19 mai 2011
Statut
Membre
Dernière intervention
23 mai 2011
-
Bonjour bonjour.

Désolé pour les accents qu'il manquera dans ce message (clavier anglais...)
Dans le cadre de mon travail, j'ai a répeter une tache particulierement ingrate qui consiste a trier des lignes dans excel.
Pour le moment je le fais manuellemnent mais je veux créer un script qui le fera pour moi. N'ayant jamais fait de programmation informatique de ma vie avant ce matin, je galere un peu.

disons que dans ma colonne A, j'ai une liste d'entreprise et dans me colonne B, leur localisation géographique (pays par exemple).
J'ai donc un truc du genre:

Coca-Cola USA
France Telecom France
Pasquier France
Pepsi USA
ABN AMRO Pays-Bas
Total France
Barclay UK
....

En gros je voudrais créer un script pour me supprimer toutes les lignes (effacer toutes les données sur la ligne et supprimer la ligne pour ne pas avoir d'espaces entre les différentes lignes en fin de travail) qui contiendraient par exemple Total OU France Telecom OU ....
(je risque d'avoir quelques 200 criteres (entreprises) différents que je rajouterai au fur et a mesure si il est possible de faire une liste infinie).

Les lignes précédentes ressortiraient donc comme suite:
Coca-Cola USA
Pasquier France
Pepsi USA
ABN AMRO Pays-Bas
Barclay UK
....


Le code que j'ai réalisé est:

' x étant le nombre de colonnes et Y le nombre de lignes
for index_y = 1 to 1
for index_x = 1 to 5000
if cells(index_x, index_y) = "Total" OR "France Telecom"
rows(index_y).delete
end if
next index_x
next index_y


Ca a l'air de fonctionner mais seulement pour la premiere ligne :) J'en comprends que mon script ne fait pas une boucle et donc s'arrete apres la premiere ligne.


Je pense que c'est relativement simple pour un connaisseur. Est-ce que quelqu'un pourrait m'apporter son avis?

13 réponses

Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
50
Salut

Sub macro1()
 For rowy = 1 To LastRow
 With Cells(rowy, "A")
   If .Value "Total" Or .Value "France telecom" Then
      Rows(rowy).Delete
   End If
End With
Next rowy


End Sub
Function LastRow() As Long
    Dim ix As Long
    
     ix = ActiveSheet.UsedRange.Row - 1 + ActiveSheet.UsedRange.Rows.Count

     LastRow = ix

 End Function
Messages postés
9
Date d'inscription
jeudi 19 mai 2011
Statut
Membre
Dernière intervention
23 mai 2011

ohhhh merci beaucoup. Rapide et efficace! J'aime ca

tu sais si je peux ajouter des "Or" a l'infini sur une mm ligne ou si c'est limité?
Messages postés
9
Date d'inscription
jeudi 19 mai 2011
Statut
Membre
Dernière intervention
23 mai 2011

je viens de tester en ajoutant des dizaines de valeur a supprimer, ca fonctionne nickel. Encore une fois merci beaucoup

Par contre effectivement, je suis limité par la longueur de la ligne.

Y a-t-il un moyen d'aller a la ligne dans le code et recommencer a rajouter des valeur a supprimer (histoire de pouvoir supprimer un tres tres grand nombre de valeurs)?

Aussi, (j'abuse un peu...),
y a-t-il un moyen de supprimer des lignes lorsque la cellule contient un certain type de valeur
ex:
eds france
eds germany
Au lieu de faire supprimer eds france et eds germany, faire supprimer toutes les cellules contenant ...eds... (peu importe ce qu'il y a avant ou apres eds)

Enfin,
y a-t-il un moyen de reformer une cellule par uniquement une partie de son contenu
ex:
fts12135 bayer
je veux obtenir juste bayer et faire supprimer fts12135 (et donc conserver la ligne).


J'en demande peut-etre beaucoup la... :)
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
50
eds france
eds germany

y a t'il un espace entre eds et le mot d'après
ou ça peut etre comme ça
eds_totoland ?

peut etre comme ça
Sub macro1()
Dim str() As String
Dim rowlast As Integer
Dim flagrow As Boolean
flagrow = False
rowlast = Lastrow
rowy = 1
While rowy <= rowlast
 With Cells(rowy, "A")
 str = Split(.Value, " ")
 If IsWordFound(str, "eds") Then
   Rows(rowy).Delete
   flagrow = True
   rowy = rowy + 1
 End If
 'tu peux ecrire comme cela
  If .Value = "Total" _
  Or .Value = "France telecom" _
   Or .Value = "toto" Then
      Rows(rowy).Delete
     rowy = rowy + 1
     flagrow = True
   End If
End With
If Not flagrow Then
   rowy = rowy + 1
End If
Wend

End Sub
Function Lastrow() As Long
    Dim ix As Long
    
     ix = ActiveSheet.UsedRange.Row - 1 + ActiveSheet.UsedRange.Rows.Count

     Lastrow = ix

 End Function
Function IsWordFound(lesmots() As String, worfind As String) As Boolean
 Dim iter As Integer
 Dim found As Boolean
 found = False
 For iter = 0 To UBound(lesmots)
   If lesmots(iter) = wordfind Then
     found = True
    End If
  Next iter
  IsWordFound = found
End Function



ps vba (visual basic for application)
n'est pas mon point fort ce n'est du vb6
donc on peut surement faire mieux
et aussi si tu as un prochain post coche la
rubrique vba
maintenenant tu pourra prendre ta pose tranquillement
Messages postés
9
Date d'inscription
jeudi 19 mai 2011
Statut
Membre
Dernière intervention
23 mai 2011

oui il y a un espace entre mais pour etre exact, le nom est du genre

eds12355132 france
eds16381654 germany

et je voudrais garder uniquement france et germany :)

le dernier script fonctionne mais me plante mon excel en fin de compte :)

Pas chiant pour un sous que je suis. Enfin, rien que de supprimer automatiquement autant de varibales que je le souhaite dans mon tableau est déja tres tres bien. Le gros du travail (et la partie bien chiante surtout) est faite pour moi.

Il me reste plus qu'a me faire un belle liste de variables a supprimer :)

merci beaucoup pour tes reponses plus que rapides
Messages postés
9
Date d'inscription
jeudi 19 mai 2011
Statut
Membre
Dernière intervention
23 mai 2011

en fait un dernier petit truc:

Plutot que de taper tous mes mots a supprimer dans le script, je ne peux pas plutot lui demander de supprimer tous les mots qui se trouvent sur une autre page (sheet2) dans le colonne A egalement?

en repartant de ce code (le premier, plus simple):
Sub macro1()
 For rowy = 1 To LastRow
 With Cells(rowy, "A")
   If .Value "Total" Or .Value "France telecom" Then
      Rows(rowy).Delete
   End If
End With
Next rowy


End Sub
Function LastRow() As Long
    Dim ix As Long
    
     ix = ActiveSheet.UsedRange.Row - 1 + ActiveSheet.UsedRange.Rows.Count

     LastRow = ix

 End Function
Messages postés
9
Date d'inscription
jeudi 19 mai 2011
Statut
Membre
Dernière intervention
23 mai 2011

en effet, il faut passer a la solution:
supprimer tout ce qui est égal a une valeur présente dans le colonne A de le feuille 2.

Je suis limité en nombre de lignes identique, et en longueur de ligne, donc en nombre de variables supprimables...

Si la macro savait juste faire ca, ensuite je peux m'occuper manuellement des trois dernieres variables du genre "eds france" :D


Merci beaucoup en tout cas, tu ne peux pas imaginer comme c'est vraiment plaisant pour moi de voir un ordi bosser a ma place :)
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
50
Ce n'est encore clair
en programmation il faut bien definir ce que
tu veux faire exactement

eds12355132 france
eds16381654 germany

et je voudrais garder uniquement france et germany :)


donc tu ne veux pas dans ce cas effacer la ligne seulement modifier le contenu de la cell
parceque tu as écrit avant
Aussi, (j'abuse un peu...),
y a-t-il un moyen de supprimer des lignes lorsque la cellule contient un certain type de valeur
ex:
eds france
eds germany


Plutot que de taper tous mes mots a supprimer dans le script, je ne peux pas plutot lui demander de supprimer tous les mots qui se trouvent sur une autre page (sheet2) dans le colonne A egalement?


si surement mais je ne sais pas comment on
fait
Messages postés
9
Date d'inscription
jeudi 19 mai 2011
Statut
Membre
Dernière intervention
23 mai 2011

ah oui, je mélange deux exemples donc je vais reformuler...

1) modifier le contenu d'une cellule:
Si la cellule contient en partie le mot "eds" alors je modifie la cellule pour garder uniquement une partie.
mais ca risque d'etre tres tres compliqué vu que ces cellules contiennent eds suivit d'un chiffre aléatoire que je voudrais supprimer aussi et ensuite un ou deux mots que je voudrais conserver... (donc c'est tres complexe). Comme il n'y a pas 3000 cas comme celui ci, je eux toujours le faire a la main (en plus ils sont facile a repérer).

2) supprimer la ligne:
Si la cellule contient un certain mot (par exemple "adsl"). Parce que je peux trouver "adsl0212 belgique", "adsl1023 France",... et je veux supprimer toutes ces lignes. Au lieu de faire supprimer toutes ces lignes une par une, il y a probablement moyen de les supprimer des que "adsl" apparait (ca économise des lignes de code)
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
50
Salut

enfin supprimer les lignes
mets dans le sheet2 colonne A la liste
des entreprises à effacer adsl etc
Sub macro1()
'efface toutes les lignes contenant le noms des entreprises du sheet2 colonne A1 to An
Dim lastrowenteprise As Integer
Dim lastrowlistdeleted As Integer
Dim namedeleted As String

Dim nameentreprise As String
Dim iterdeleted As Integer
Dim iterenteprise As Integer
lastrowlistdeleted = Lastrow("sheet2")
lastrowenteprise = Lastrow("sheet1")
 count = 0
For iterdeleted = 1 To lastrowlistdeleted
'loop list des entreprises to be deleted
   namedeleted = Sheets("sheet2").Cells(iterdeleted, "A")
  
   For iterenteprise = 1 To lastrowenteprise
   'loop list entreprise
       nameentreprise = Sheets("sheet1").Cells(iterenteprise, "A")
       'check if same name or part of name
       If (nameentreprise = namedeleted) Or (InStr(1, nameentreprise, namedeleted) > 0) Then
         Sheets("sheet1").Rows(iterenteprise).Delete
         iterenteprise = 0
         lastrowenteprise = Lastrow("sheet1")
       End If
    Next iterenteprise
 Next iterdeleted
 
End Sub


Function Lastrow(sh As String) As Long
    Dim ix As Long
    
     ix = Sheets(sh).UsedRange.Row - 1 + Sheets(sh).UsedRange.Rows.count

     Lastrow = ix

 End Function




pour le 1) il me manque de précision
Messages postés
9
Date d'inscription
jeudi 19 mai 2011
Statut
Membre
Dernière intervention
23 mai 2011

rhoooo merci mec!

ca marche au poil et je l'ai deja fait tourner au moins 10 fois tellement c'est beau de voir quelqu'un (qqch) bosser pour moi. On dirait que j'ai un nouveau stagiaire :)

Pour le 1), c'est pas tres tres grave. Je crois que ca serait trop compliquer vu que les cellule comprennent des valeur un peu différentes.

En tout cas un grand merci pour ca. Et si tu passes par londres une fois, je te paye un verre si tu as le temps
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
50
De rien

attention si le non de l'entreprise à etre
effacé est inclu ça effacera aussi
donc si par c'est adsl
tu adsl ,adslblabla mais aussi blablaadsl et blablaadslblabla

ps tu peux ajouter un virtual french keyboard
comme j'ai fait j'ai aussi le clavier us
Messages postés
9
Date d'inscription
jeudi 19 mai 2011
Statut
Membre
Dernière intervention
23 mai 2011

je commence a m'habituer a ce foutu clavier. Juste que je n'ai pas tous les accents... mais on se fait vite au fait d'écrire avec des fautes :)

et nickel si ca efface lorsque ca contient uniquement une partie du mot dans mon entreprise. J'avais mm pas remarqué... Je peux taper un format de cellule a supprimer sans devoir en mettre toutes les différentes possibilité (come pour adsl.....). Encore un gain de temps :)