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?
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
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).
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
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 :)
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
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?
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)
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
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
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
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 :)