Supprimer des cellules via macros

Résolu
Bonjour,

Après pas mal de recherche, je me trouve bloquer sur le sujet qui suit:
Sur plusieurs colonnes (nombres variables), je souhaite dans un premier temps supprimer les cellules contenant ** puis recaler le reste de la colonne vers le haut. Dans un second tant, je souhaite suprimer les valeurs d'une cellule trop proches de la suivante.
Ex:
Col1 --- Col2 .... => Col1 --- Col2
** --- 10 1 --- 10
** --- 20 2 --- 20
1 --- 30 3 --- 30
2 --- 40 4 --- 40
2 --- **
3 --- **
4 --- **
** --- **
** --- **

J'ai testé plusieur solution sans parvenir à un résultat probant.
Merci de votre aide

9 réponses

  1. Bonjour,
    Au passage, quelle solution avez-vous testé ?
    0
    1. Bonjour Le Pingou,

      Voici la macro que j'utilise pour supprimer les "**" mais lorsque que le test arrive sur des cellules comportant des nombres, la macro semble figer sur une case.

      Do While Not (IsEmpty(ActiveCell))
      Cells(N, ActiveCell.Column).Interior.ColorIndex = 35
      If Cells(N, ActiveCell.Column).Text = "**" Then
      Cells(N, ActiveCell.Column).Delete shift:=xlUp
      End If
      Loop
      0
      1. RE Le Pingou,

        j'ai trouver la solution à mon pb via la macro qui suivi. Elle est assez complexe alors si quelqu'un à une idée pour la simplifié, merci d'avance !

        Do While Not (IsEmpty(ActiveCell))

        A1:
        Do While Not (IsEmpty(ActiveCell))

        Cells(N, ActiveCell.Column).Interior.ColorIndex = 35
        If Cells(N, ActiveCell.Column).Text = "**" Then
        Cells(N, ActiveCell.Column).Delete shift:=xlUp
        ElseIf Cells(N, ActiveCell.Column).Text <> "**" Then GoTo A2
        End If
        Loop

        A2:
        Do While Not (IsEmpty(ActiveCell))
        Cells(N, ActiveCell.Column).Interior.ColorIndex = 35
        If Cells(N + 1, ActiveCell.Column).Text = "**" Then
        N = N + 1
        GoTo A1
        ElseIf Cells(N + 1, ActiveCell.Column) = "" Then
        Exit Do
        ElseIf (Abs(Cells(N, ActiveCell.Column) - Cells(N + 1, ActiveCell.Column))) < 2 Then
        Cells(N, ActiveCell.Column).Delete shift:=xlUp
        N = N - 1

        End If
        N = N + 1
        Loop

        ActiveCell.Offset(0, 1).Select
        If Cells(6, 1) = 3 Then
        N = 12
        Else: N = 102
        Cells(N, ActiveCell.Column).Select
        End If

        Loop
        0
        1. Bonjour,
          Merci pour les informations.
          Pouvez-vous m'indiquer les lignes de code avant le Do While Not et celles après le Loop !
          --
          Salutations.
          Le Pingou
          0
          1. Bonjour,
            En attendant votre réponse au message précédent, essayez donc ce cette procédure.
            Note : la procédure détermine le nombre de colonne selon les titres en première ligne.
            Sub supprimerdecaler()
            Dim co As Long, li As Long, nbco As Long
            Dim valpre
            ' récupérer nombre colonne
            nbco = Cells(1, Columns.Count).End(xlToLeft).Column
            ' suppression astérisque et décaller vers haut
            For co = 1 To nbco
                For li = Cells(Rows.Count, co).End(xlUp).Row To 2 Step -1
                 If Cells(li, co) = "**" Then
                    Cells(li, co).Delete Shift:=xlUp
                End If
                Next li
            ' suppression doublon et décaller vers haut
                valpre = ""
                For li = Cells(Rows.Count, co).End(xlUp).Row To 2 Step -1
                    If Cells(li, co) = valpre Then
                        Cells(li, co).Delete Shift:=xlUp
                    End If
                    valpre = Cells(li, co)
                Next li
            Next co
            End Sub

            0
            1. Merci de votre aide Le Pingou,

              voici la fonction complète qui fonction très bien.
              Celle que vous m'avez proposé précédemment ne semble pas fonctionner car le système me génère une erreur sur la valeur nbco et ensuite sur la formule Shift:=xlup.

              Function Gestion()

              If Cells(6, 1) = 3 Then
              N = 12
              Cells(21, 16) = "Gestion en cours"
              Cells(21, 16).Interior.ColorIndex = 34
              Else
              N = 102
              Cells(27, 16) = "Gestion en cours"
              Cells(27, 16).Interior.ColorIndex = 34
              End If

              Application.ScreenUpdating = False
              [r10].CurrentRegion.Select
              Selection.NumberFormat = "0.000"
              Cells(N, 18).Activate

              Do While Not (IsEmpty(ActiveCell))

              A1:
              Do While Not (IsEmpty(ActiveCell))

              Cells(N, ActiveCell.Column).Interior.ColorIndex = 35
              If Cells(N, ActiveCell.Column).Text = "**" Then
              Cells(N, ActiveCell.Column).Delete shift:=xlUp
              ElseIf Cells(N, ActiveCell.Column).Text <> "**" Then GoTo A2
              End If
              Loop

              A2:
              Do While Not (IsEmpty(ActiveCell))
              Cells(N, ActiveCell.Column).Interior.ColorIndex = 35
              If Cells(N + 1, ActiveCell.Column).Text = "**" Then
              N = N + 1
              GoTo A1
              ElseIf Cells(N + 1, ActiveCell.Column) = "" Then
              Exit Do
              ElseIf (Abs(Cells(N, ActiveCell.Column) - Cells(N + 1, ActiveCell.Column))) < 2 Then
              Cells(N, ActiveCell.Column).Delete shift:=xlUp
              N = N - 1

              End If
              N = N + 1
              Loop

              ActiveCell.Offset(0, 1).Select
              If Cells(6, 1) = 3 Then
              N = 12
              Else: N = 102
              Cells(N, ActiveCell.Column).Select
              End If

              Loop

              If Cells(6, 1) = 3 Then
              If Cells(18, 16) <> "" And N = 13 Then
              Cells(21, 16) = "Gestion OK"
              Cells(21, 16).Interior.ColorIndex = 35
              Else
              MsgBox "La troisième étape n'est pas validée"
              Cells(6, 1) = Cells(6, 1) - 1
              End If
              End If
              If Cells(6, 1) = 5 Then
              If Cells(24, 16) <> "" And N = 103 Then
              Cells(27, 16) = "Gestion OK"
              Cells(27, 16).Interior.ColorIndex = 35
              Else
              MsgBox "La cinquième étape n'est pas validée"
              Cells(6, 1) = Cells(6, 1) - 1
              End If
              End If

              [A1].Select

              End Function
              0
              1. Bonjour,
                Merci de l'information.
                Je tiens à préciser que la procédure proposée a été testé sans produire de message d'erreur.
                Vous aurez noté qu'elle se base sur :
                Note : la procédure détermine le nombre de colonne selon les titres en première ligne
                Si cela n'est pas le cas alors le nombre des colonnes du tableau de données ne peut pas être déterminé : d'où le message d'erreur.
                De plus vous ne dite même pas qu'elle est ce message d'erreur c'est vraiment frustrant
                0
                1. bonsoir,

                  navré de ne pas donner de détails... je tenterai de corriger cela mais je me suis apperçu que je mettait le shift:=xlup à la ligne donc cela peut être une erreur de ma part. quant au nbco, je ne saisis pas trop le fonctionnement et surtout, la 1er case a tester n'est effectivement pas en ligne 1.

                  Merci encore pour l'aide.
                  0
                  1. Bonjour,
                    Pour votre information, la variable [nbco] reçoit le nombre des colonnes à traité et ce nombre est calculé sur le nombre des titres de colonne de la première ligne.
                    0