VBA dépouillement classeur excel

Fermé
rayondesoleil - 16 juil. 2009 à 18:15
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 - 17 juil. 2009 à 14:20
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
A voir également:

2 réponses

michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 310
16 juil. 2009 à 18:50
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
rayondesoleil
17 juil. 2009 à 13:31
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
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 310
17 juil. 2009 à 14:20
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