VBA dépouillement classeur excel

rayondesoleil -  
michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

Je suis déutant en programmation en général et j'ai un souci concernant une macro à priori simple.

Je dispose d'un classeur avec trois feuilles excel toutes remplies de données d'un essai mécanique. Ces données sont séparées de par intervalles irréguliers de trois lignes avec des données non numériques précisant la date, le temps écoulé depuis le début de l'essai..
Je souhaiterais supprimer ces lignes dans tous les classeurs en supprimant toute ligne dont la prière colonne contient une valeur non numérique. Le but serait de me retrouver avec ques des données numériques dans mes trois feuilles

J'ai essayé la macro suivante:

Sub SupprimerLignes() '

Dim i As Integer

For Each sh In ActiveWorkbook.Sheets

For i = 256 To 1 Step -1

If Not IsNumeric(Cells(i, 1).Value) And Cells(i, 1) = "" Then 'si la valeur de la cellule n'est pas numerique
Rows(i).Delete Shift:=xlUp
i = i - 1
End If

Next i
Next sh

End Sub

Il ne se passe pas grand chose, et je souhaiterais savoir ce qui cloche

Merci d'avance de votre aide
Configuration: Windows XP Internet Explorer 6.0

2 réponses

  1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    bonjour
    je mettrais plutôt un OR qu'un AND

    d'autre part dans cells(x,y)="" "" n'est pas numérique donc...
    Si tu veux tester si la cellule est vide, emploie la fonction ISEMPTY(cells(x,y))

    pour la rapidité et le confort, en debut de procédure, désactive le déroulement de l'écran par:

    application.screenupdating=false

    Cordialement, Michel
    0
    1. rayondesoleil
       
      Bonjour Michel_m

      Merci de ta réponse, le code modifié est le suivant et ne marche pas trop mal, sauf qu'il n'agit que sur une feuille à la fois. Je suis donc obligé de l'exécuter une autant de fois que le nombre de feuilles.

      Aurais tu idée de pourquoi cela ne fonctionne pas?

      Merci d'avance



      Sub SupprimerLignes() '

      Dim i As Long

      Application.ScreenUpdating = False
      For Each sh In ActiveWorkbook.Sheets

      For i = 65536 To 1 Step -1
      If Not IsNumeric(Cells(i, 1).Value) Or IsEmpty(Cells(i, 1)) = True Then 'si la valeur de la cellule n'est pas numerique je fais
      Rows(i).Delete Shift:=xlUp
      i = i - 1

      End If

      Next i
      Next sh


      End Sub
      0
  2. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Re,

    il fallait travailler avec la feuille sélectionnée par For each

    j'ai modifié quelques trucs question de rapidité
    non géré: feuille vide

    Sub SupprimerLignes()
    Dim sh As Worksheet
    Dim i As Long
    
    Application.ScreenUpdating = False
    For Each sh In ActiveWorkbook.Sheets
        With sh
        'on se débarasse des lignes vides d'un seul coup ==> rapidité
        Range("A1:A" & Range("A65536").End(xlUp).Row).SpecialCells(xlCellTypeBlanks).EntireRow.Delete
        'Range("A65536").End(xlUp).Row). permet d'éviter de bosser sur 65536 lignes ==> rapidité
            For i = Range("A65536").End(xlUp).Row To 1 Step -1
                   If Not IsNumeric(.Cells(i, 1).Value) Then  'si la valeur de la cellule n'est pas numerique je fais
                        .Rows(i).Delete
                    End If
            'i=i-1 erreur grossière :for next  incrémente automatiquement
            Next i
        End With
    Next sh
    
    
    End Sub


    0