Peut on mieux faire??? macro excel

Résolu
loulou38 -  
pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   -
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
Configuration: Windows Vista
Firefox 3.0.13

10 réponses

  1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    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
  2. loulou38
     
    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
  3. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    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
  4. loulou38
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    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
  7. loulou38
     
    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
  8. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    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
  9. loulou38
     
    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
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      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
  10. loulou38
     
    Merci 1000 fois Pijaku.... ça marche nickel, c'est exactement ce que je voulais.

    Loulou38
    0
  11. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    Ne pars pas sans mettre ce topic "résolu"
    Reviens...................
    0