Peut on mieux faire??? macro excel

Résolu/Fermé
loulou38 - 21 août 2009 à 11:41
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 - 21 août 2009 à 13:54
Bonjour,

J'aimerai améliorer une macro. Mais je ne sais pas comment m'y prendre...

M feuille excel ressemble à ça:

Titre 1
(cellule vide)
Titre 2
(cellule vide)
Test
(cellule vide)
(ici c'est une cellule qui peut etre vide ou pleine)
(cellule vide)
Sous titre 1
(cellule vide)
etc....

voici ma macro:

Dim n As Integer

For n = 1 To 15
If Cells(n, 3).Value <> "Test" Then

Else
n = n + 2 ' je descend de deux lignes

If Cells(n, 3).Value <> "" Then ' si la cellule contient une donnée alors je fais rien
Else
Cells(n, 3).Select 'sinon je selectionne ma cellule
ActiveCell.EntireRow.Select 'puis je selectionne la ligne entiere
Selection.Delete Shift:=xlUp 'puis je supprime ma ligne

ActiveCell.Offset(-1, 0).Select 'je remonte d'une ligne
ActiveCell.EntireRow.Select 'je reselectionne ma ligne
Selection.Delete Shift:=xlUp 'je supprime à nouveau

ActiveCell.Offset(-1, 0).Select 'etc
ActiveCell.EntireRow.Select
Selection.Delete Shift:=xlUp

ActiveCell.Offset(-1, 0).Select
ActiveCell.EntireRow.Select
Selection.Delete Shift:=xlUp

End If

End If
Next

En fait, j'effectue des actions répétitive pour supprimer les ligne qui ne m'interresse pas. peut on améliorer ça? par exemple est ce que je peux dire directement de supprimer les 3 ligne au dessus en meme temps, ou encore mieux, supprimer les lignes du dessus jusqu'a rencontrer la valeur "test"

Si vous avez une idée...... merci d'avance
A voir également:

10 réponses

pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 751
21 août 2009 à 11:49
Salut,
En clair tu as besoin de supprimer toutes les lignes qui ne contiennent pas "test" dans la colonne C?
C'est bien cela?
0
non pas vraiment pijaku,

c un peu plus compliqué

exemple:

test
(cellule vide)
(cellule 1)
(cellule vide)
test2
(cellule vide)
(cellule 2)
(cellule vide)
etc....

si dans ma plage, je vois une cellule qui contient la valeur test alors je dois regarder si la cellule 1 contient également une valeur.
Si c'est le cas je ne fais rien.
Si la cellule est vide alors je dois supprimer les lignes qui se trouve de la cellule 1 à la cellule test.
ensuite je refais la meme chose avec le test 2....

J'espère que c'est clair, et merci de t'intéresser à mon cas....:)
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 751
21 août 2009 à 12:03
Ok alors déjà, tu remplaces :

Cells(n, 3).Select 'sinon je selectionne ma cellule
ActiveCell.EntireRow.Select 'puis je selectionne la ligne entiere
Selection.Delete Shift:=xlUp 'puis je supprime ma ligne

par :

Cells(n, 3).EntireRow.Delete

même chose pour les autres "groupes" de 3 lignes.
Et cela semble correct.
0
merci de ta réponse pikaju,

Dim n As Integer

J'ai adapté et c'est ok, c'est déjà plus joli comme ça, merci :).

Dans la foulée, j'ai une autre petite question.....

Est il possible de sortir de la boucle for next si mes lignes se sont supprimées? c'est à dire ne pas aller de 13 à 25 forcément pour n....

Je ne sais pas si je suis clair, même moi j'ai dû mal à me comprendre.... disons plutôt si je suis passé par ma deuxième conditions puis je insérer une variable ( ex i=1) et dire que si i=1 alors je sors de ma boucle for next

For n = 13 To 25
If Cells(n, 3).Value <> "Armoire KEYBOX 9400 B" Then

Else
n = n + 2

If Cells(n, 3).Value <> "" Then
Else
Cells((n - 3), 3).EntireRow.Delete
Cells((n - 3), 3).EntireRow.Delete
Cells((n - 3), 3).EntireRow.Delete
Cells((n - 3), 3).EntireRow.Delete

End If

End If
Next
0

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

Posez votre question
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 751
21 août 2009 à 13:08
oulala... Je ne comprends rien. A quoi servent ces lignes :

Cells((n - 3), 3).EntireRow.Delete
Cells((n - 3), 3).EntireRow.Delete
Cells((n - 3), 3).EntireRow.Delete
Cells((n - 3), 3).EntireRow.Delete

C'est 4 fois la même chose????
0
oui, je suis obligé de répéter 4 fois ma suppression de ligne.
Dans ma logique, je dis que si je vois une cellule qui contient test alors et que si ma cellule 1 est vide alors je dois supprimer toutes les cellules en gras

TITRE
(cellule vide)
test
(cellule vide)
(cellule 1)

(cellule vide)

pour me retrouver avec ça

TITRE
(cellule vide)

le n-3 me permet de remonter de 3 lignes et ensuite je supprime les lignes une à une ( j'ai pas trouver mieux pour faire ça..)

Voilà

Dim n As Integer
Dim i As Integer

For n = 13 To 25
If Cells(n, 3).Value <> "SYSTEME KEY-PASS" Then

Else
n = n + 2

If Cells(n, 3).Value <> "" Then
Else
Cells((n - 3), 3).EntireRow.Delete
Cells((n - 3), 3).EntireRow.Delete
Cells((n - 3), 3).EntireRow.Delete
Cells((n - 3), 3).EntireRow.Delete

End If

End If


Next
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 751
21 août 2009 à 13:23
Récapitulons.
Tu testes ta colonne C pour savoir si la cellule = Armoire KEYBOX 9400 B
Si oui tu vérifies que la cellule 2 lignes en dessous est vide.
Si elle est vide tu supprimes 3 lignes de Armoire K... jusqu'à celle 2 lignes en dessous?
C'est bien ce que tu veux?
Ensuite tu parles d'un autre test???
Explique toi clairement si c'est possible...
0
oui!!! c'est exactement ça, c'est plus clair quand c'est toi qui le dit!!!

et ensuite mon autre test serait de sortir de la boucle for next si mes lignes ont été supprimer car je sais très bien que dans le reste de la feuille je ne retrouverai pas de cellule contenant Armoire K.... donc ça ne sert à rien que je continue ma boucle for next.
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 751
21 août 2009 à 13:35
Alors essaye ceci. Mais avant tout sauvegarde ton classeur. Si j'ai dermé, tu pourras t'en sortir.....

Dim n As Integer
For n = 13 To 25 'va tester les lignes de 13 à 25
If Cells(n, 3).Value = "SYSTEME KEY-PASS" Then ' si le contenu de la cellule EST (tu avais mis n'est pas...)
n = n + 2 ' je descend de deux lignes
If Cells(n, 3).Value = "" Then ' si la cellule est vide alors
Range(Cells(n - 2, 3), Cells(n, 3)).EntireRow.Delete Shift:=xlUp ' je supprime mes trois lignes
Exit Sub 'et je sors de la macro
End If
End If
Next

0
Merci 1000 fois Pijaku.... ça marche nickel, c'est exactement ce que je voulais.

Loulou38
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 751
21 août 2009 à 13:54
Ne pars pas sans mettre ce topic "résolu"
Reviens...................
0