Peut on mieux faire??? macro excel

Résolu
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. Modérateur
    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
    1. 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
      1. Modérateur
        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
        1. 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
          1. Modérateur
            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
            1. 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
              1. Modérateur
                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
                1. 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. Modérateur
                    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
                2. Merci 1000 fois Pijaku.... ça marche nickel, c'est exactement ce que je voulais.

                  Loulou38
                  0
                  1. Modérateur
                    Ne pars pas sans mettre ce topic "résolu"
                    Reviens...................
                    0